Skip to main content
This inventory is the decision table for Cloudflare backend ownership. It reflects checked-in source on 2026-10-23. A source definition is not proof that a hosted schedule runs or succeeds; confirm hosted state before a cutover.

Summary

Scheduled Vercel opportunities total 2,887 per day in this repository. Moving only the schedule does not reduce processor invocations; processor moves do.

Overlap safety classes

Cutover safety depends on whether two owners can run the same slot without duplicating a side effect. Cron Control’s slot claim deduplicates its own ticks, not a concurrent Vercel tick.

Vercel Cron jobs

The Web cron catalog lists deadline reminders every four hours, but the deployed Vercel entry runs every five minutes. Preserve the live cadence; do not run sync-web-crons, which would also drop report automation from the schedule.

pg_cron jobs

Live jobs after replaying every migration’s schedule and unschedule calls. process-notification-batches was unscheduled by a later migration. Retained exceptions. Each retained job runs a single statement against Postgres tables with no HTTP, storage or provider side effect. A Cloudflare trigger would add a Worker invocation and a service-key HTTP round trip per tick to execute the same SQL in the same database: more cost and credential exposure, no compute moved off Supabase. Owners should still review the three every-minute jobs’ cadence. Any job that gains an outbound call loses its exception.

Next.js after() continuations

These run after the response on the hosting function, with no durable owner. A crashed or recycled function silently loses them.

Processors without a hosted schedule

These routes exist but no Vercel entry, pg_cron job or Worker trigger calls them. They may have relied on the retired Docker runner; confirm the intended owner before scheduling any of them. Workspace managed cron jobs (workspace_cron_jobs) have a due-job claim RPC but no live scheduler since the Docker runner retired; only run-now routes execute them. A Cron Control job draining that claim RPC is the target, gated on a product decision because enabling it starts user-defined outbound requests.

Existing Cloudflare owner

apps/cron-control runs every five minutes, requeues stale push batches and calls the Web immediate-delivery processor only when a pending immediate batch exists. See Cloudflare Cron Control.

Migration waves

  1. Scheduler move, default off. Add every Vercel job and the exchange-rate pg_net job to Cron Control with flags off. Enable cheapest first: cleanup media, products, smart schedule, trust cache; then claim-fenced Web jobs; then handover jobs; the every-minute sampler last, after its retirement decision.
  2. Processor moves. Start with checkout expiry (atomic RPC), then cleanup media (durable cursor), products and trust cache as Worker processors.
  3. Queues. Move notification, email, announcement and report delivery, then the after() sites, onto Queue consumers with attempt budgets aligned to their existing claims.
  4. Retirements. Decide the Docker-era sampler and alerts and the Hive simulation route with their owners.
Per-job cutover steps live in the Cron Control runbook.