Skip to content

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

  1. 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 as https://runcheck.de/a8k3m2x9q1.

  2. The check-in at the end of the route

    Open the route listed under crons in vercel.json and put the check-in after the actual work, before the response. The CRON_SECRET check 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 });
    }
  3. 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: Bearer with your CRON_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.timeout limits 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 fetch call; fetch and AbortSignal.timeout are 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 heartbeats

More 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.