Matt Turley, Continuum. Updated November 5, 2026.
For founders whose nightly email, sync, cleanup or billing job works when called by hand and never runs on schedule.
Vercel runs cron jobs only against the production deployment, by sending a GET request to a path you list in vercel.json. If the job does nothing, the path is wrong, the route rejects the request (often a secret header or middleware), the function times out, or your plan limits how often it can run. The cron log shows which.
A cron job on Vercel is not a process that runs on a clock. It is an HTTP request that Vercel sends to a route in your production deployment on a schedule. So everything that can go wrong with a normal request can go wrong with a cron job: the route can 404, redirect, be blocked by middleware, throw or time out. The difference is that nobody is watching the request.
The jobs AI tools write often assume a long-lived server, a writable disk or an unlimited run time. A serverless function is limited on time, so a job that processes a large backlog in one call can start, run out of time and leave the work half done.
The fix is the same as for any silent failure: make the job observable. A job that cannot tell you it ran, and what it did, will fail unnoticed.
How to tell Nothing happens on schedule but calling the URL by hand works on a preview. Cron jobs run against production only and are created from the crons entry in vercel.json when a production deployment goes live.
The fix Confirm the configuration is in the branch that deploys to production, that the deployment finished, and check the Cron Jobs list in the project to see the registered paths.
How to tell The cron log shows a 404 or 405. The configured path does not match the route file, or the route handles only POST. Vercel invokes cron paths with GET.
The fix Make the path in vercel.json match the route exactly, and export a GET handler for it.
How to tell The log shows 401 or 403. If you set a CRON_SECRET variable, Vercel sends it as an authorization header, and your route must compare it. A route behind auth middleware, or one that expects a user session, returns 401 to Vercel.
The fix Check the Authorization: Bearer header against CRON_SECRET inside the route, and exclude the cron path from user-session middleware. Do not leave the route open to anyone who guesses the URL.
How to tell The log shows a timeout or 500, and the job does some of its work. A job that loops over every user in one call hits the function duration limit as data grows.
The fix Process in small batches, store progress, and let the next run continue. Move long work to a queue or background function.
How to tell The job runs, but at the wrong time. Cron expressions are interpreted in UTC, and plans differ in how often and how precisely a job may run. A schedule that is more frequent than your plan allows can be rejected at deploy.
The fix Write the schedule in UTC, check your plan's current cron limits in the documentation and look at the deployment output for a rejected schedule.
How to tell Duplicate emails or double charges. A scheduled invocation can occasionally arrive more than once, and a slow run can overlap the next.
The fix Make the job idempotent and take a lock or mark records as processed before acting on them.
vercel.json, the route file path and the exported methods side by side, and confirm the production deployment contains both.A wrong path, a missing GET handler or a header check are quick fixes you can make with the cron log open. You need a person when the job is part of a chain (billing, syncing, sending) and a missed or doubled run costs money.
Background jobs are where an AI-built app fails without telling anyone. A Ship Check reads the whole codebase, including scheduled work, and ranks what will break first.
Ship Check, $299: A senior engineer reads your codebase and sends a written verdict (fine, fixable or rewrite), what will break first, a security and data read, and a costed plan, within 48 hours of repo access or it is free. It has a 7-day money-back and is credited against a Ship Fix. Or: Book a call.