If you've built a Next.js app on Vercel and needed a scheduled job — a digest email, a daily cleanup, a sync — you've probably hit the same wall: Vercel's cron jobs are Pro-only, and the free tier limits you to once per day.
Here's how to get reliable cron jobs on any Vercel plan, including free.
The problem with Vercel cron
Vercel added native cron support, but with significant limitations:
- Pro plan required — not available on Hobby
- Once per day maximum on Hobby even if you upgrade
- No execution history — if your job fails silently, you won't know
- No retries — one failure and it's gone
For anything serious you need something external.
The approach
Your Next.js app already exposes API routes. A cron service just needs to call one of those routes on a schedule. Your endpoint does the work and returns 2xx — that's the whole contract.
Scheduler → POST https://yourapp.vercel.app/api/jobs/cleanup → 200 OK
No always-on server. No infrastructure to manage.
Setting it up with @tickstem/cron
Install the SDK:
npm install @tickstem/cron
Register your job once — in a setup script, a one-off API call, or your app's startup:
import { CronClient } from "@tickstem/cron"
const cron = new CronClient(process.env.TICKSTEM_API_KEY)
await cron.register({
name: "daily-cleanup",
schedule: "0 2 * * *", // every day at 02:00 UTC
endpoint: "https://yourapp.vercel.app/api/jobs/cleanup",
})
Your API route just needs to return 2xx:
// app/api/jobs/cleanup/route.ts
export async function POST(req: Request) {
if (req.headers.get("x-tickstem-secret") !== process.env.CRON_SECRET) {
return new Response("unauthorized", { status: 401 })
}
// do your work
await cleanupOldRecords()
return new Response("ok")
}
Set CRON_SECRET to a random string (openssl rand -hex 32) in both your Vercel environment variables and your Tickstem job headers:
await cron.register({
name: "daily-cleanup",
schedule: "0 2 * * *",
endpoint: "https://yourapp.vercel.app/api/jobs/cleanup",
headers: { "X-Tickstem-Secret": process.env.CRON_SECRET },
})
What you get
- Runs on any Vercel plan, including free
- Any schedule — every minute, every 15 minutes, whatever you need
- Execution history so you can see what ran and what failed
- Automatic retries on failure
- Dashboard at https://app.tickstem.dev
Free tier includes 1,000 executions per month — more than enough for most side projects.
Common schedules
*/15 * * * * every 15 minutes
0 * * * * every hour
0 9 * * 1 every Monday at 09:00 UTC
0 0 1 * * first of every month
Use https://crontab.guru to build expressions.
That's it. Your endpoint stays on Vercel, the scheduler runs externally, and you're not locked into any platform's billing tier.
Top comments (0)