Netlify Scheduled Functions are convenient for Netlify-deployed code, but tight timeouts, no retries, and platform lock-in push teams toward dedicated schedulers. Here is how the options compare.
Netlify Scheduled Functions let you run Netlify-deployed serverless functions on a cron schedule. You define the schedule in your function code using the @netlify/functions package or in netlify.toml, deploy to Netlify, and the function runs automatically at the specified intervals. It is built into the Netlify platform with no additional setup or services required.
The free Starter plan includes scheduled functions with a 10-second timeout. The Pro plan ($19/month) extends the timeout to 26 seconds. Netlify Scheduled Functions are well-suited for lightweight, recurring tasks within the Netlify ecosystem — cache warming, simple data fetches, or cleanup tasks that complete quickly. The limitations appear when you need external URL support, longer timeouts, retries, or failure alerts.
Quick take
How Netlify Scheduled Functions stacks up against the most common alternatives.
| Feature | Netlify Scheduled | Vercel Cron Jobs | GitHub Actions Cron | cron-job.org | FastCron | Upstash QStash |
|---|---|---|---|---|---|---|
| Type | Platform scheduler | Platform scheduler | CI/CD scheduler | HTTP scheduler | HTTP scheduler | HTTP queue + scheduler |
| Free tier | Included in plan | 2 jobs (Hobby) | 2,000 min/mo (private) | Unlimited jobs | 5 jobs | 500 msgs/day |
| Minimum interval | 1 hour (varies) | 1 day (Hobby) / 1 min (Pro) | 5 minutes | 1 minute | 5 min (free) / 1 min (paid) | 1 minute |
| External URL support | No (Netlify only) | No (Vercel only) | Yes (manual curl) | Yes | Yes | Yes |
| Function timeout | 10s (free) / 26s (paid) | 10s (Hobby) / 300s (Pro) | N/A (full VM) | 30s | 30s (free) / 10 min (paid) | N/A (async) |
| Automatic retries | No | No | No | No | Basic auto-retry | Yes, configurable |
| Failure alerts | No | No | Custom step needed | Email after 15 fails | Email / Slack (paid) | Callback URL |
| Execution dashboard | No (function logs) | No (function logs) | Workflow run logs | 25 entries | 25 (free) / 250+ (paid) | Yes |
| Schedule changes | Code + deploy | vercel.json + deploy | YAML commit + push | Dashboard | Dashboard + API | API |
| Platform lock-in | Netlify only | Vercel only | GitHub repos only | None | None | None |
| REST API | No | No | GitHub API (workflows) | No | Yes | Yes |
| One-off jobs | No | No | workflow_dispatch | No | No | Yes |
| Pricing | Free / $19/mo (Pro) | Free / $20/mo (Pro) | Free / $4/user/mo | Free / ~$1/mo | Free / $5/mo+ | Free / $1/mo+ |
Different tools fit different needs.
Best for: Teams already on Vercel
Built-in cron for Vercel-deployed functions. Same platform lock-in trade-off but with longer timeouts on Pro (up to 300s) and 1-minute minimum intervals. Defined in vercel.json instead of in code.
Read our comparisonBest for: Repo-bound tasks where timing is not critical
Schedule workflows with cron expressions in YAML. Can call any URL via curl, but timing can be delayed 10-60+ minutes during high load. Consumes CI/CD minutes from your GitHub plan.
Read our comparisonBest for: Simple HTTP scheduling on a $0 budget
Free HTTP cron service with unlimited jobs and 1-minute intervals. 30-second timeout, no retries, alerts only after 15 failures. Platform-agnostic — calls any URL directly.
Read our comparisonBest for: Affordable HTTP scheduler with longer timeouts
5 free cron jobs with 5-minute intervals and 30-second timeout. Paid plans from $5/mo with 200 jobs and 10-minute timeout. Has auto-retry. No team management.
Read our comparisonBest for: Serverless apps needing queue + scheduling
HTTP-based scheduler and message queue with configurable retries, delays, and callbacks. Pay-per-request pricing. Works with any URL and is not locked to a deployment platform.
These are the specific limitations that push teams to look beyond Netlify Scheduled Functions.
Netlify Scheduled Functions can only run code deployed as Netlify Functions. You cannot point a schedule at an external URL — your own API, a third-party webhook, or a service on another provider. If your backend is not on Netlify, you need to deploy and maintain a proxy function on Netlify just to forward requests, adding an unnecessary layer to your stack.
The free tier times out after 10 seconds. Paid plans extend this to 26 seconds. If your scheduled task calls a slow API, processes data, or waits on a downstream service, these timeouts will kill the execution before it completes. The common workaround — returning immediately and running the task asynchronously — means the scheduler cannot tell you if the task succeeded.
When a Netlify Scheduled Function fails or times out, the failure is silent. There are no automatic retries, no configurable retry delays, and no failure alert emails. You discover problems by manually reviewing function logs — if you think to check. A transient error at the wrong moment means a missed execution with no recovery.
Cron expressions are defined in code using the @netlify/functions package or in netlify.toml. Changing a schedule means editing source code, committing, pushing, and waiting for a Netlify build. There is no dashboard slider, no API call, and no way to adjust timing without a full deploy cycle. Quick schedule tweaks are not possible.
Netlify has no dashboard for viewing scheduled function execution history as a timeline. Past invocations are mixed into the general function logs with no way to filter by scheduled triggers, track status codes over time, or view response time trends. Debugging intermittent failures or answering "did this run last Tuesday?" requires searching through unstructured logs.
Netlify Scheduled Functions only support recurring cron schedules. There is no way to schedule a one-off delayed job — a deferred webhook call, a post-signup callback, or a timed notification at a specific future time. You need a completely separate queuing system for anything that is not on a fixed recurring schedule.