Background jobs
The scheduled work behind rank checks, crawls, uptime sweeps, digests and purges.
Some of the platform works without anyone pressing anything. Fourteen job kinds do the scheduled work behind rank checks, crawls, uptime, digests, contract expiry and account deletion. You do not configure them; this page exists so that when something has not happened, you know what was supposed to make it happen.
#How they run
Work is queued as rows and drained by an authenticated trigger, rather than by a timer inside the application. The reason is that the application runs as several containers: an in-process timer would run everything as many times as there are containers.
A job is claimed with a lease. If the container holding it dies, the job goes stalled and becomes claimable again when the lease expires — the queue heals itself rather than needing anybody to notice.
#The jobs
#Search
| Kind | Does | Spends |
|---|---|---|
seo.rank_check.dispatch |
The scheduled fan-out. Queues one job per client whose cadence is due. | No |
seo.rank_check.client |
Queues the per-keyword checks for one client. | No |
seo.keyword_check |
One ranking lookup. | Yes |
seo.keyword_metrics |
Volume and difficulty refresh. Deduplicated per client per day. | Yes |
seo.crawl.poll |
Self-rescheduling crawl poller: asks the provider whether a crawl has finished and reschedules itself until it has. One unanswered poll does not kill a crawl that is otherwise succeeding. | No |
seo.alert_sweep |
Daily. Reads data already bought and raises alerts and wins from it. | No |
Cadence is the only lever you control here, and it is set per client. See Limits and cost.
#Uptime
| Kind | Does |
|---|---|
uptime.sweep |
One sweep checks every monitor whose interval has elapsed. |
maintenance.purge_uptime_checks |
Trims individual check rows after seven days. Daily roll-ups and incident records are kept, so long-run uptime figures survive the trim. |
#Contracts
| Kind | Does |
|---|---|
contracts.expiry_sweep |
Sends the closing soon notice, and when a deadline passes writes the lapse into the contract's ledger and tells both sides. Expiry is a recorded event, not an inference from a date. |
#Content
| Kind | Does |
|---|---|
content.approval_digest |
The one notification in the approval flow, batched daily to each person with items waiting on them. |
#Accounts
| Kind | Does |
|---|---|
clients.deletion_reminder |
Warns seven days before a scheduled deletion becomes irreversible. |
clients.purge |
The only irreversible job on the platform. It re-checks the deadline before destroying anything, so a retry after a fix cannot destroy an account whose deletion was cancelled in the meantime. |
The reminder and the purge are separate jobs deliberately: a bounced reminder must not stop a purge, and a failed purge must not suppress a warning.
#Maintenance
| Kind | Does |
|---|---|
maintenance.purge_expired_tokens |
Clears expired sign-in, signing and verification tokens. |
email.sending_domain_recheck |
Re-checks pending domains through the day and verified ones daily, so a DKIM or SPF record that was tidied away is noticed rather than discovered by a client who never got their contract. |
platform.attention_digest |
The platform's own daily digest. Agencies never receive it. |
#When something has not happened
Almost every "this stopped working overnight" report resolves to one of four things, in this order of likelihood:
- The client's status. A paused or offboarded client stops all paid work by design. Check Account status first — it is free to check and it is usually the answer.
- The module. A disabled module stops the work behind it. A hidden one does not.
- A ceiling. A client at its monthly crawl limit stops being crawled until the month rolls over. See Limits and cost.
- The agency's own status. A past-due agency stops buying, because every billed call downstream lands on the platform's invoice.
If none of those explains it, the queue itself may have stopped draining — that is visible to platform operators and is worth raising with support. Nothing in the agency portal shows it, because from inside a tenant a stopped queue looks exactly like a quiet week.