Skip to content

Scheduled Jobs

Jobs run on two separate schedulers with different trust and cost profiles: supercronic on the Coolify VPS (see Deployment), and Windows Task Scheduler on the separate scrape box. See Data Pipeline for how these jobs fit into the overall pipeline DAG.

VPS / Coolify (via supercronic, all times UTC)

Time Job Purpose
12:00 daily Web-form job Forms-first outreach campaign
13:00 daily Warmup job Mailbox deliverability warmup
14:00 + 15:00 daily Commission-confirmation job Commission A/B email sends (two runs for timezone gating)
15:00 daily Metrics job Refreshes dashboard snapshot tables
continuous, ~every 5 min Reply daemon Polls IMAP for new replies, ingests, drafts responses
every 10 min Refresh drain worker Drains the on-demand refresh queue (see Data Pipeline)
every 30 min Refresh cadence planner Enqueues buildings due for cadence-based refresh

Windows scrape box (Task Scheduler)

Task Schedule Cost Purpose
Weekly leads/enrichment Sundays 06:00 Free Warehouse migration check + enrich_sweep.py + quality gate, per metro
Refresh drain (warm standby) Every 15 min Free when idle Same purpose as the VPS refresh worker, kept as a standby; bounded so it can safely run alongside the VPS worker

Manual-only (never scheduled)

Run by an operator when needed:

  • A full paid unit-sweep pass across metros (bounded budget, several hours, meaningful cost — up to ~$20/run across 4 metros).
  • Metro discovery sweeps (~$30–40/metro).

Note

The refresh-worker guardrails (≤100 ids/request, 6h per-property cooldown, ≤20 queue admissions/hour/key, ≤50 paid resolutions/day, $8/day soft budget rail) live in Internal API's /refresh reference and Data Pipeline — not repeated here.

See also