Cronjob.de › Guides › Vercel Cron
Monitoring Vercel Cron: know whether the job ran
You learn by yourself whether a Vercel cron job ran when the route reports it: one fetch line at the end calls your ping address at Cronjob.de once the work is done. If the call does not come, you get a message. That applies to Next.js projects as well as apps built with v0, Lovable or Bolt that you deployed on Vercel.
Updated:
Why at all
Why you would not notice otherwise
By its own account Vercel delivers cron invocations “best effort”: most run as scheduled, occasionally a network error keeps an invocation from reaching your function. Then there is no log entry either. Vercel does not retry failed invocations.
On the Hobby plan, according to Vercel, jobs run at most once a day, and Vercel starts them some time within the given hour: 0 1 * * * runs between 1:00 and 1:59. Pro and Enterprise allow every minute, on the minute (as of October 2026). The time zone is always UTC.
If the route answers with a redirect, Vercel considers the invocation done; cron invocations do not follow redirects. A heartbeat at the end of your route, by contrast, only reports what really went through.
- Ping address (example)
https://runcheck.de/a8k3m2x9q1- Schedule
- UTC; Hobby at most once a day, some time within the hour (as of October 2026)
- Applies to
- Vercel Cron Jobs, Next.js App Router
- Sufficient Cronjob.de plan
- One heartbeat with email alerts is free. Up to 10 come with Plus (€17.88 a year), up to 50 with alerts via Telegram, Slack, Teams or Discord as well with Unlimited (€47.88 a year).
Setup
Set up in three steps
What is a heartbeat?
A regular sign of life: after every run your job calls its own address at Cronjob.de. If the call is overdue or the job reports a failure, we alert you. More about heartbeats
-
Create a heartbeat
In your account, create a new one under “Heartbeats”, with the rhythm from your
vercel.json. On the Hobby plan give it generous leeway, at least two hours, because Vercel starts the job some time within the hour. You receive a ping address of its own, such ashttps://runcheck.de/a8k3m2x9q1. -
The check-in at the end of the route
Open the route listed under
cronsinvercel.jsonand put the check-in after the actual work, before the response. TheCRON_SECRETcheck comes from the Vercel documentation and stays as it is.// app/api/cron/route.ts import type { NextRequest } from 'next/server'; export async function GET(request: NextRequest) { const authHeader = request.headers.get('authorization'); if (!process.env.CRON_SECRET || authHeader !== `Bearer ${process.env.CRON_SECRET}`) { return new Response('Unauthorized', { status: 401 }); } // ... your work ... await fetch('https://runcheck.de/a8k3m2x9q1', { signal: AbortSignal.timeout(10000) }).catch(() => {}); return Response.json({ success: true }); } -
Deploy and trigger once
Vercel only invokes cron jobs for the production deployment. After deploying, trigger the job by hand in the dashboard from the deployment summary, or on the command line with
vercel crons run /api/cron(currently beta, according to Vercel). In your Cronjob.de account, “Waiting for the first check-in …” turns green.
The ready-made lines for Linux, PHP, Python, Node.js, n8n, Make, Supabase and Vercel are on the page Cron job monitoring. Your own ping address appears in your account once you create the heartbeat, with the same lines ready to copy.
When something fails
What happens when a run fails
If the invocation does not arrive, the work throws an exception or the function runs into its time limit, the last line is never reached: the check-in is missing. After the leeway we alert you; the next successful run brings the all-clear.
FAQ
Common questions about Vercel Cron
- What does a cron job entry in vercel.json look like?
- Like this, with your route's path and the schedule in UTC:
{ "crons": [ { "path": "/api/cron", "schedule": "0 5 * * *" } ] } - How often can a cron job run on Vercel?
- According to Vercel, at most once a day on the Hobby plan; more frequent expressions fail during deployment. Pro and Enterprise allow up to once per minute (as of October 2026). If a route should run more often without changing your plan, Cronjob.de can call it directly: enter the address, add the header
Authorization: Bearerwith yourCRON_SECRET, choose the schedule. For free that works in 5-minute steps, from Plus every minute. Each call then counts at Vercel like an ordinary function invocation. - Why is there an await before the fetch?
- So the check-in goes out before the function responds. Then it really means: the work is done.
AbortSignal.timeoutlimits the wait to ten seconds, and an error while checking in is ignored and does not affect your job. - Does this work with the Pages Router or another framework?
- Yes. The check-in is an ordinary
fetchcall;fetchandAbortSignal.timeoutare built in since Node.js 18. What matters is the place: after the work, before the response.
Set up your heartbeat now
One heartbeat with email alerts is free. Up to 10 come with Plus (€17.88 a year), up to 50 with alerts via Telegram, Slack, Teams or Discord as well with Unlimited (€47.88 a year). The first 14 days run on the Unlimited plan, no payment details needed.
Set up a heartbeat for free More about heartbeatsMore monitoring guides
Official documentation of Vercel Cron
The details about Vercel come from their own documentation, as of October 2026. Please check there whether anything has changed since. Vercel, Next.js, v0, Lovable and Bolt are trademarks of their respective owners. This guide comes from Cronjob.de and has no business relationship with these providers.
By Joscha Schultze, operator of Cronjob.de · Written with AI assistance, provider details checked against their official pages.