> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comforthub.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Scheduled jobs

> Everything that runs on a timer, when, and what it does

Times are Ottawa time on a 24-hour clock. The engine keeps them in UTC, so a fixed time shifts by an hour when the clocks change.

The timer list is written into the engine's build as a contract, and the monitor compares the live list to it every minute; a timer added, removed or changed by hand opens an urgent condition within a minute. The checks the monitor runs on its own clocks are on [Monitor checks](/reference/monitor-checks).

## Every minute

| Job                         | What it does                                                                               |
| --------------------------- | ------------------------------------------------------------------------------------------ |
| Wake the sync worker        | Nudges the worker that carries changes between Zoho and Supabase, in case a queue has work |
| Wake the action worker      | Nudges the worker that does everything else: QuickBooks, emails, PDFs, pushes, invites     |
| Wake the evaluator          | Nudges the monitor's worker that books every due check and runs the quick ones             |
| Wake the maintenance worker | Nudges the monitor's worker that runs the slow checks                                      |
| Wake the notifier           | Nudges the monitor's worker that hands each condition to Sentry                            |

## Nightly clean-ups

| Job                        | When  | What it does                                                                                                                              |
| -------------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Prune cron history         | 23:25 | Drops timer run records older than 7 days                                                                                                 |
| Prune queue archives       | 23:35 | Drops archived queue messages older than 90 days                                                                                          |
| Close the call sync window | 00:17 | Marks calls and voicemails over 30 days old as finished with, so the engine stops pushing them to the CRM and an old record is left alone |
| Prune integration history  | 00:30 | Drops ledger lines older than 13 months and raw vendor notifications older than 90 days                                                   |
| Sweep property imagery     | 01:40 | Queues the Street View fetch for properties still missing an image, 25 at a time                                                          |

## Overnight business jobs

| Job                       | When  | What it does                                                                                                                                                                |
| ------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Optimise routes           | 01:00 | Puts today's stops in driving order for each technician, so nobody criss-crosses the city. It runs only for a day on which some technician holds three or more appointments |
| Subscription visit ledger | 02:20 | Asks the action worker to re-derive every live subscription's visit ledger                                                                                                  |

## Reminders and pushes

| Job                            | When       | What it does                                                                                                                                                                 |
| ------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Open-appointment push          | every hour | Looks for appointments still open an hour past their window. Each technician on it gets one push the first hour it is overdue, then one a day at 08:00 until it is completed |
| Auto-submit overdue timesheets | 01:00      | Submits every timesheet that is still a draft or was rejected once its submit-by day has arrived, with whatever hours it holds. Super admins are left out                    |
| Timesheet reminder, morning    | 09:00      | The day before submit-by: "Timesheet Reminder" push to everyone whose sheet for that period is a draft or does not exist                                                     |
| Tasks due soon                 | 09:00      | A push to each task's owner for every task due within the next 24 hours that is not completed or cancelled                                                                   |
| Invoice reminders              | 10:15      | Queues a reminder email for every emailed, unpaid invoice seven or more days past due: one at seven days, another at twenty-one                                              |
| Appointment reminders          | 16:10      | Queues a reminder email for every scheduled appointment tomorrow whose customer has an email and asked to be notified                                                        |
| Timesheet reminder, evening    | 19:00      | The same day, same people: "Urgent: Timesheet Due Now", marked time-sensitive                                                                                                |

## Digests

| Job                | When          | What it does                                                                                                                                        |
| ------------------ | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| Pipeline digest    | 08:40 daily   | A push, "Pipeline needs attention", to every super admin in the app, listing the pipeline states that have work; nothing is sent when there is none |
| Pipeline heartbeat | 08:50 Mondays | A push, "Pipeline monitor alive", to the same people; if it stops arriving, the digest cannot be trusted either                                     |

## The nightly drift sweep

The sweep itself runs from GitHub, not from this list. It compares every synced record on both sides and opens a finding for each difference, and closes a finding the next time the two sides agree. See [How sync works](/handbook/running/how-sync-works).

* Scheduled at 02:20. GitHub starts a scheduled job when its shared queue reaches it, so the start drifts later. The monitor allows eight hours after the scheduled start, then opens a for-review condition.
* The reconciler, which copies Zoho's value over ours for an open finding, has no schedule. A person runs it from GitHub, and it prints what it would write without writing unless told otherwise.
* The nightly run goes red when the open findings exceed 160. The findings are still written; the red is the gauge. How to run both by hand is on [Run the sweep and the reconciler](/handbook/running/run-the-sweep-and-the-reconciler).

## Related

* [Monitor checks](/reference/monitor-checks)
* [How the monitor works](/handbook/running/how-the-monitor-works)
* [Sentry](/systems/sentry)
