Appearance
Automation
Purpose: The work the platform does on its own, on a schedule or in response to events. Around forty scheduled jobs run across the apps, plus the sync that fires when staff act. This is the map for "that happened without anyone pressing a button" and "the overnight job didn't run".
Primary users: Anyone diagnosing timing-related behaviour or an integration that seems to fire by itself.
Two kinds of automation
- Scheduled jobs: run on a clock (every few minutes to daily).
- Event-driven sync: fires immediately when a record changes, mostly to keep Qube, HubSpot and Rent Profile in step.
Gotchas worth knowing first
- Some jobs only run in production. Several (onboarding, inventory reminders, "can be let" checks) are gated to the production environment, so they won't fire in UAT or locally.
- Some are feature-flag gated. The inspection prompts only run when the
tenancy-inspectionsflag is on. - Timing is deliberately staggered. For example the 07:00 inventory reminders, 07:05 inspection prompts and 07:10 check-out prompts are spaced so they don't read the same Inventory Hive data at once. If you move one, mind the others.
- Many jobs ping a heartbeat URL and are monitored, so a silent failure is visible in monitoring.
Scheduled jobs by app
Portal (the busiest scheduler):
| Area | Jobs (roughly) |
|---|---|
| Qube sync | Customer and unit data hourly; tenancies every 15 min; lease end dates daily |
| Direct debits | Daily reminder dispatch (01:00) |
| Reservations / deal sheets | Archive expired reservations and stale deal sheets; overdue checks |
| Viewings | Fetch from HubSpot; attendance and dormant-viewing emails |
| Inspections (prod, flagged) | Mid-tenancy and check-out prompts (morning) |
| Inventory Hive (prod) | Sync statuses; reminder emails (07:00) |
| Onboarding (prod) | Auto-onboard residents to the app; invite follow-ups |
| Renewals | Renewal notifications and "entered Rent Review" emails (mid-morning) |
| Move-out | Complete due move-outs; refresh smart-lock eligibility (shortly after midnight) |
| Rent Profile / HubSpot | Reconcile tenancy statuses; cache deals and property options |
| Housekeeping | Search indexing, cache warming, temp-file cleanup, token/log pruning |
Everest: publish scheduled listings (every 15 min), refresh stale listings (evening), pull Rightmove stats, recompute dashboard tiles hourly, generate the dashboard alert notifications, decommission checks, and housekeeping.
Olympus Backend: Tableau operations, sync groups (6-hourly), refresh user Tableau IDs (weekly), rotate credentials (daily), and alert on Slack if the Tableau token is revoked.
Tenancy API: clean up expired document-download links (every 5 min).
Event-driven sync
Qube (the connectors)
When staff act in Portal, events fire that push data into Qube:
- Approve a deal and the unit, deposit, monthly payments and tenancy documents are all synced to Qube.
- Create or update a customer and the customer is synced.
- Raise a charge or transaction and it's pushed to Qube (raising a transaction also creates a resident payment notification).
A single master switch can turn Qube writes off across the platform, and failures are logged rather than allowed to break the staff member's action. See the Qube sync playbook for the full picture.
HubSpot & Rent Profile
Reservation and deal-sheet activity transitions the matching HubSpot deal stage, and passing referencing or signing contracts syncs back into Qube and HubSpot. Rent Profile status changes reconcile onto the tenancy.
Cross-app system events
Some events cross between apps over the internal gateway. Two to know:
- A new operator (company) being created seeds that operator's tenant database, including its Section 13 mail templates.
- A resident submitting an end-of-tenancy notice notifies staff and, where flagged, the resident.
Where the detail lives
Schedules are defined in each app's routes/console.php; the Qube sync is in the connectors package and Portal's event bindings. The Notifications & Emails page covers what these jobs send.