Vercel Cron Job Monitoring
Vercel Cron Jobs trigger a serverless function on a schedule — but if a run throws, times out, or the schedule silently stops firing, Vercel won't tell you. crond.io watches the schedule and alerts you the moment a run is late or fails. It's one HTTP call in your cron handler.
How it works
You create a crond.io monitor with the same schedule as your Vercel cron. Your function pings crond.io when it finishes. If a ping never arrives (the job didn't run) or you report a failure, crond.io alerts you by email, Slack, PagerDuty, or webhook. This catches the failure mode Vercel's dashboard misses: a cron that quietly stops running.
1. Create a monitor
In your crond.io dashboard, create a monitor and set its schedule to match your Vercel cron (Vercel schedules run in UTC). Copy the monitor's ping key— you'll pass it to your function as an environment variable.
2. Ping crond.io from your cron route
Add a start ping, a success ping, and a failure ping around your job. With the App Router, your cron handler is a GET route:
// app/api/cron/route.ts
const PING = "https://api.crond.io/ping/" + process.env.CROND_PING_KEY;
export async function GET(request: Request) {
// Verify the request actually came from Vercel Cron.
if (request.headers.get("authorization") !== "Bearer " + process.env.CRON_SECRET) {
return new Response("Unauthorized", { status: 401 });
}
await fetch(PING + "/start", { method: "POST" }); // job started
try {
await runYourJob(); // your work here
await fetch(PING); // success
} catch (err) {
await fetch(PING + "/fail", { // failure -> instant alert
method: "POST",
body: String(err),
});
throw err;
}
return Response.json({ ok: true });
}The /start and /fail pings are optional — a single fetch(PING) on success is enough for crond to detect a job that stops running. Adding them gives you run duration and immediate failure alerts.
3. Schedule it in vercel.json
{
"crons": [{ "path": "/api/cron", "schedule": "0 5 * * *" }]
}4. Set the environment variables
In your Vercel project's Settings → Environment Variables, add:
CROND_PING_KEY— the ping key from your crond.io monitorCRON_SECRET— a random string (16+ chars); Vercel sends it as a Bearer token so your route can reject anything that isn't the cron
Note: Vercel runs cron jobs on production deployments only, not on previews.
That's it
Your Vercel cron now reports every run to crond.io. Miss a run and you get an alert instead of a silent gap in your data — no log-scraping, no extra infrastructure.