Cron Scheduling on Ops Hub
What runs on a schedule at Ops Hub and how to add or change a cron job.
Overview
Ops Hub runs 38 scheduled jobs. From 2026-05-25 onwards, Vercel cron is the single scheduling surface (Vercel Pro upgrade). Before that, overflow schedules ran on cron-job.org.
Three scheduling surfaces
How Vercel cron works
Every cron is defined in vercel.json with a path and a cron schedule expression. Vercel auto-injects Authorization: Bearer $CRON_SECRET on every call -- no per-cron token plumbing is needed. The Pro plan cap is 40 native crons; Ops Hub currently uses 34 (including 4 paused orphans).
To add a new cron:
- Create the API route at app/api/cron/[your-cron-name]/route.js.
- Add an entry to vercel.json under crons.
- Add a row to lib/cron-registry.js so the /settings/cron-schedules page reflects it.
- Deploy. No external dashboard click required.
Active crons by cadence
Every 15 minutes: MSP ticket poller, launcher reaper, Jarvis pre-meeting brief check.
Every 30 minutes: prospecting reply detection.
Hourly: payment-ticket reconciliation, prospecting status sync, MSP stale approvals, Fathom meeting poller, discovery call bookings.
Daily (overnight): cashflow refresh, account cost sync, MSP reconciliation watchdog, churn scoring, ticket enrichment, deal enrichment, SF audit archival, HubSpot sync log pruning, MSP cycle crawls, SEO news refresh, MSP cycle blogs, client metric refresh.
Daily (morning): client anniversaries, upsell spotting from Fathom transcripts, daily Jarvis nudge.
Weekly (Monday): client snapshot data sync, Beach Dashboard snapshot, Jarvis pattern mining, weekly deal summary, P&L snapshot, weekly churn summary.
Weekly (Friday): weekly review, Friday source material data sync.
Monthly (1st): budget extension, auto-create monthly draft reports, report run pruning, AEO runs pruning.
Monthly (2nd): AI citation tracker (BTT brand mentions across ChatGPT, Claude, Perplexity, Gemini).
Paused crons
Paused crons are removed from vercel.json but kept in lib/cron-registry.js with a disabled_at date and a disabled_reason. The /settings/cron-schedules page shows them with a (paused) indicator.
- hubspot-mention-check -- paused 2026-05-25 to reduce Vercel function spend. Re-enable by adding it back to vercel.json.
- Aircall availability crons (check-availability, refresh-events, renew-channels, renew-watch-channels) -- missed during consolidation; needs review before restore or delete.
Claude Code routines (separate system)
Recurring Claude conversations that read MCPs and run skills. Not HTTP-based. Triggered from the routines panel in the Claude Code editor. Defined in ~/Documents/GitHub/btt-routines/routines/*.md.
Note: these routines cannot reach ops.bristechtonic.co.uk from the Claude CCR cloud sandbox (Anthropic egress allowlist blocks it). The pattern is: Ops Hub pre-computes snapshot data via cron and commits JSON to the btt-routines repo; routines read from the cloned repo instead of calling MCPs directly.
CRON_SECRET rotation note
The CRON_SECRET value appeared in a chat transcript in May 2026 and is due for rotation. Chris owns this. Do not block other work on it, but flag it if it has not been done.