One-off, not recurring
Schedule a single webhook for an exact future time tied to a user or an object, instead of a cron that fires forever and checks a table.
Vercel Cron alternative
Vercel Cron Jobs are great for recurring background work inside an app you already host on Vercel, at no extra cost. But they run on a recurring cron expression, not a one-time future timestamp, and there is no way to cancel a single upcoming run. Webhook Scheduler solves that narrower problem: schedule one webhook for a specific moment, then cancel it in one API call if the user acts first.
curl https://webhookscheduler.com/api/v1/schedule \
-H "Authorization: Bearer wh_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.example.com/webhooks/trial-reminder",
"body": { "userId": "usr_4821" },
"runAt": "2026-07-12T09:00:00.000Z",
"idempotencyKey": "trial-reminder-usr_4821"
}'Schedule a single webhook for an exact future time tied to a user or an object, instead of a cron that fires forever and checks a table.
One API call cancels a pending delivery the moment the user converts. Vercel Cron has no per-run cancel, so you would edit config and redeploy.
Every attempt is logged with HTTP status, response body, latency, and the retry timeline, so a missed delivery is a record, not a mystery.
Vercel Cron Jobs are genuinely convenient. If your app is already on Vercel and you need periodic background work (warming a cache, sending a nightly digest, cleaning up stale rows), a cron entry in vercel.json is zero extra infrastructure and is included in your plan. For recurring jobs, it is a sensible default and we are not going to pretend otherwise.
Webhook Scheduler is not a recurring scheduler. It does one thing: deliver a single HTTP request at a future time, retry it, prove what happened, and let you cancel it before it fires.
| Dimension | Vercel Cron Jobs | Webhook Scheduler |
|---|---|---|
| Schedule model | Recurring cron expression in vercel.json | One-off delivery at a specific timestamp |
| Run once at a future time | No. You simulate it with a frequent cron that checks a datastore | Yes, the core feature, up to 365 days ahead |
| Cancel a specific future call | No per-invocation cancel. You edit vercel.json and redeploy the whole job | Yes, one API call cancels a pending job before it fires |
| Timing precision (free tier) | Once per day, up to ~59 minutes of drift on Hobby | Scheduled to the minute on every plan |
| Delivery retries | Not built in. Your function code owns retry logic | Automatic exponential backoff |
| Delivery inspection | Vercel function logs | Per-attempt dashboard: HTTP status, response body, latency, retry timeline |
| What it calls | Invokes one of your Vercel Functions | Delivers an HTTP request to any public HTTPS URL |
| Cost | Included in Vercel plans (you pay for function usage) | Flat plans: Free, $29 Pro, $99 Scale |
| Try without an account | No | Yes, schedule a live webhook from /try without signing up |
Limits and pricing change. Check Vercel's cron documentation and ours for current numbers rather than trusting a table to stay fresh.
Vercel Cron only accepts a recurring cron expression. There is no native way to say "call this URL once at 09:00 on Thursday," so the usual workaround is a cron that runs every minute, scans a reminders table, and sends whatever is due. That works until you need to not send one. There is no API to cancel a single upcoming invocation; disabling a cron means editing vercel.json and redeploying, which affects the whole recurring job.
On the Hobby tier a cron also runs at most once per day with up to roughly an hour of timing drift, which is fine for a nightly cleanup and wrong for a time-sensitive reminder. Webhook Scheduler schedules the one call and cancels the one call. That is the whole lifecycle, and it is the part a recurring cron cannot express.
This is not either/or. Plenty of teams keep Vercel Cron for their recurring jobs and reach for Webhook Scheduler for the user-facing, cancelable ones: trial reminders, dunning follow-ups, and delayed onboarding nudges. If you are on Next.js, the Vercel delayed jobs guide walks through the pattern.
The fastest way to feel the difference is to schedule a real delivery. The playground fires a live webhook with retries and a delivery log in about ten seconds, no account required. If you are weighing other options, compare against GitHub Actions cron, self-hosted cron, and Upstash QStash.
Not natively. Vercel Cron accepts recurring cron expressions only. To run something once at a specific timestamp you run a frequent cron that checks a datastore and fires when a row is due. Webhook Scheduler schedules the one-off delivery directly.
There is no per-invocation cancel API. You disable a cron by removing it from vercel.json and redeploying, which affects the whole recurring job. Webhook Scheduler cancels a single pending job with one API call.
No. Webhook Scheduler is a hosted API that delivers to any public HTTPS URL, so it works from any stack. Many teams run it alongside Vercel Cron rather than instead of it.
Not today. It is built for one-time future deliveries. If your workload is primarily recurring jobs inside a Vercel app, Vercel Cron is the better fit.
Start with the free plan, test a real delivery, then upgrade when the workflow becomes production critical.
Try a scheduled webhook