Building and running websites and apps on Vercel

UAE · India · Global

Webhooks and nightly jobs without running a server? What to check on Nitro and Vercel

By Shivanath DevinarayananPublished 8 min read
Written forHead of digital, IT manager, or founder who owns the company website or web app, signs the hosting bill and answers client security questionnaires“Our site and web app live on an old server, and the security questionnaire is due.”

The short answer

When does a small Nitro API on Vercel make sense for webhooks and nightly jobs, and what has to be set before it runs?

Nitro fits when you need a few API routes and scheduled jobs without a full web app. On Vercel it deploys with no configuration, but set CRON_SECRET first, write schedules in UTC, and keep client work off the Hobby plan. At Mindcat, we set these three before the first night runs.

A small server box on a night desk with a clock at three and an unlocked padlock beside it, lit in gold

Takeaways

  1. 01Nitro's Vercel cron handler checks a secret only when CRON_SECRET is set. Without it, anyone can call the endpoint.
  2. 02Vercel runs cron schedules in UTC. A 7:00 Dubai reminder is 03:00 UTC.
  3. 03Hobby allows one cron run a day, within the hour, and only for non-commercial use.
  4. 04Waiting on a database or an API does not count as Active CPU time on Vercel.

If your team needs a small API for payment webhooks and a few nightly jobs, and nobody wants to run a server for it, this is for you. Nitro on Vercel is a good fit, once three settings are right.

When is Nitro the right size for the job?

In plain words, Nitro is a small server for code with no pages: the part that receives a payment notice or sends the morning reminders. Technically, it is a small TypeScript server. Vercel describes it as "a full-stack framework with TypeScript-first support" with filesystem routing, built-in caching and multi-driver storage, and says it enables "deployments from the same codebase to any platform with output sizes under 1MB". It is also the server engine under Nuxt and the way Vercel runs TanStack Start.

On Vercel it deploys "with zero configuration". Each server route becomes a Vercel Function on Fluid compute, so it scales with traffic and you pay for the CPU it uses.

Our rule: if the job is a handful of routes and scheduled tasks with no pages, such as webhooks from a payment gateway, a nightly export, or a feed another site reads, Nitro is the right size. If people log in and use screens, pick a full framework instead.

For what Nitro does on Vercel and how it connects to your other systems, see Nitro on Vercel.

What breaks first with scheduled jobs?

Three things, and none of them shows up in testing. The job runs, so everyone assumes it is fine.

The endpoint is open without a secret. Vercel's docs say you secure cron jobs "by adding an environment variable called CRON_SECRET", which Vercel then sends as an Authorization header on each call. Nitro registers its own cron handler on Vercel. An issue opened on 21 August 2026 points out that this handler checks the secret only when CRON_SECRET is set, so without it "any configured scheduled task can be executed on demand, repeatedly". The reporter filed it as a hardening suggestion, not a vulnerability claim, and a maintainer replied that Nitro matches Vercel, where the secret is optional. The fix on your side is one variable: set it.

The clock is UTC. Vercel's cron docs say "the timezone is always UTC". Dubai is four hours ahead, so a reminder you want at 7:00 in Dubai is 0 3 * * *.

Hobby will not do. Hobby is for non-commercial, personal use only. It also limits cron jobs to once a day, and a job set for 1:00 can run any time up to 1:59. Pro and Enterprise run as often as once a minute, with per-minute precision. Every plan allows 100 cron jobs per project.

Three settings before the first night: set CRON_SECRET, write the schedule in UTC, and use Pro for client work
The three settings we check first, from Vercel's cron docs and Nitro issue 4546.

How do you cache answers that change once a day?

So that a list that changes once a day is not rebuilt for every visitor, which keeps it fast and the bill flat. Some routes return the same answer all day: a delivery rate table, a list of available units, a price list another site reads. Nitro on Vercel can serve those with Incremental Static Regeneration (ISR), so the function runs once and the cached answer is served after that.

You set isr on the route in nitro.config.ts, with an expiration in seconds or none at all. To refresh it on demand, for example when your team changes a price, you set a BYPASS_TOKEN and send a request with the x-prerender-revalidate header. If the route takes a query string such as ?area=marina, list it in allowQuery so each area is cached on its own.

For performance by route, Vercel says Nitro 2.12 or later with a compatibility date of 2025-07-15 or later sends routing hints to Observability. Set it, so you can see which route is slow.

How a nightly job runs: Vercel calls the cron endpoint with the secret, Nitro checks it, the task runs and logs
How a scheduled task runs on Vercel, from the cron and Nitro docs.

What does it cost to run, as of 16 October 2026?

Under a dollar of usage for the example below, by our arithmetic. Vercel says cron jobs are included in all plans and are billed as the functions they call.

LineVercel's price
Pro platform feeUSD 20 a month, with one deploying seat and USD 20 of usage credit
Active CPUFrom USD 0.128 an hour; USD 0.14 in Mumbai (bom1)
Provisioned memoryFrom USD 0.0106 per GB-hour
InvocationsUSD 0.60 per million
Cron jobsIncluded; billed as the functions they call

In one line: USD 20 a month for each deploying seat, and well under a dollar of usage for the sample below, inside the included credit. Our arithmetic for the property manager below, from list prices at Mumbai rates, not a measured bill. Assume one reminder job a night for 30 nights, each using 60 s of Active CPU with 2 GB held for 90 s, and 3,000 payment webhooks a month at 100 ms of CPU and 300 ms held. That is 0.58 CPU hours (USD 0.08), 2 GB-hours (USD 0.02) and almost no invocation cost: about USD 0.10, inside the USD 20 credit.

We are not a Vercel partner and earn nothing from your Vercel bill. Our own site runs on Netlify. What stays portable: Nitro builds the same code for other hosts. What is Vercel's: the cron schedule, CRON_SECRET handling and the ISR cache.

The detail that keeps the bill small: Vercel says time spent waiting on a database or another API "does not count towards active CPU time". A webhook that waits two seconds for a payment gateway pays for the milliseconds of work, not the wait. Set a sensible maximum duration anyway. Pro allows 300 seconds by default and up to 800.

Region matters more than price. Functions run in Washington, D.C. (iad1) unless you change it, and there is no region in the UAE or Saudi Arabia. Put the API in the region nearest your database; for Gulf teams that is often Mumbai (bom1).

What does this look like for a property manager?

Take a sample Dubai property manager that wants rent reminders sent each morning and payments marked as they arrive. This is an illustration, not a client story.

  1. 0103:00 UTC (07:00 Dubai). Vercel calls the cron endpoint with the secret. Nitro checks it and runs the reminder task.
  2. 02The task reads which rents fall due in three days from the property system and sends each tenant a reminder through the company's WhatsApp provider.
  3. 03A tenant pays. The payment gateway calls the Nitro webhook, which checks the gateway's signature and marks the rent paid.
  4. 04A cached route serves the list of vacant units to the website, refreshed with the bypass token when the leasing team changes it.
  5. 05Each morning the operations lead reads one log line per task: how many reminders, how many failed, and why.
A property manager example: a 03:00 UTC job finds rents due, sends reminders, and a payment webhook marks them paid
A worked example for a property manager. Illustrative, not a client story.

If the real gap is that leases and payments live in spreadsheets, an API will not fix it. See how we work with property management teams, and Mindcat Lease for one schedule per lease.

What goes on the security questionnaire?

Vercel splits the answers in its shared responsibility model, read on 16 October 2026. Here is who writes each line.

Questionnaire lineWho answers it
Platform certificationsVercel. It holds a SOC 2 Type 2 attestation and ISO 27001:2022; reports are at security.vercel.com. They cover Vercel's platform, so request them from Vercel
Network, infrastructure, encryption in transit and at restVercel, for the services it runs
Where data is processedYou. You pick the function region. None is in the UAE or Saudi Arabia; Mumbai (bom1) is the nearest. Your database is wherever you put it
Logins, keys and source codeYou. Vercel holds environment variables; who can read them is your team setting
Logs kept long termYou, through a log drain. Vercel keeps short-term runtime logs
Cost of bad trafficYou. Vercel's model says the customer pays for malicious traffic, so set a spend limit

If a contract says data must be processed inside the UAE, Vercel cannot meet it today. Say so before you sign, not after.

For a bad month, set Spend Management. Vercel sends alerts at 50%, 75% and 100% of the amount you set, and pauses production when you reach it if Pause Production Deployments is on. A budget alone does not stop usage, and the check can lag by several minutes. If a change breaks the site, Instant Rollback on Pro returns production to any earlier production deployment from the dashboard; environment variable changes are not rolled back with it. For the jobs here, add one line: the cron endpoint checks CRON_SECRET, and webhooks check the sender signature.

What do you check before the first night?

  1. 01CRON_SECRET is set in production, a random string of 16 characters or more, as Vercel recommends.
  2. 02Every schedule is written in UTC, with the local time in a comment next to it.
  3. 03The team is on Pro, so jobs can run more than once a day and on time.
  4. 04Webhooks check the sender's signature, not just the URL.
  5. 05The function region sits next to the database it reads.
  6. 06Someone named reads the failure line each morning.

If your nightly job is one export a week that a person can run by hand in five minutes, keep doing it by hand until it hurts.

What happens on the first call?

We call the method Preview every change: each change gets its own preview link, someone on your side approves it on a phone, then it goes live, and any release can be rolled back. Send us the jobs and webhooks you need and where they run today. The written assessment is free and says what to build, what to keep and what it costs to run. The first build week is a fixed AED/SAR 14,900, and a Run plan keeps the jobs watched afterwards. More on how we build and run this work is on our Vercel page.

Filed under

Building and running websites and apps on Vercelvercel cron jobscron_secretnitro scheduled taskstypescript api backend
Useful to someone on your team?

FAQ

Questions teams ask next

What is Nitro?
Vercel describes Nitro as a full-stack framework with TypeScript-first support, filesystem routing, code-splitting for fast startup, built-in caching and multi-driver storage. It is the server engine under Nuxt, and Vercel pairs it with TanStack Start. It deploys to Vercel with zero configuration, and server routes become Vercel Functions.
Do I need CRON_SECRET for Nitro scheduled tasks on Vercel?
Yes, in our view. Vercel's docs say you secure cron jobs by adding a CRON_SECRET environment variable, which Vercel then sends as an Authorization header. A Nitro issue opened on 21 August 2026 notes that Nitro's Vercel cron handler only checks the secret when it is set, so without it the endpoint is public.
How often can Vercel cron jobs run?
On Hobby, once a day, and Vercel says a 1:00 job can run any time between 1:00 and 1:59. On Pro and Enterprise, as often as once a minute, with per-minute precision. Every plan allows 100 cron jobs per project. Schedules are always in UTC.
Can a Nitro API run in the UAE on Vercel?
No. Vercel has 19 compute regions and none in the UAE or Saudi Arabia. Functions default to Washington, D.C. (iad1). Mumbai (bom1) is the nearest region, and Vercel says to run functions in the same region as your database.

Sources

  1. 01Vercel docs: Nitro on VercelAccessed 16 Oct 2026
  2. 02Vercel docs: Managing cron jobs (securing with CRON_SECRET)Accessed 16 Oct 2026
  3. 03Vercel docs: Cron jobs usage and pricingAccessed 16 Oct 2026
  4. 04Nitro issue 4546: Vercel preset cron handler is public when CRON_SECRET is unset (21 August 2026)Accessed 16 Oct 2026
  5. 05Vercel docs: Functions limitations and Active CPU billingAccessed 16 Oct 2026
  6. 06Vercel pricing and regional pricingAccessed 16 Oct 2026
Shivanath Devinarayanan, founder of Mindcat

Written by

Shivanath Devinarayanan

Founder, Mindcat Consulting · Salesforce MVP Hall of Fame

Runs 200+ agents in production. Reads every brief that comes in and signs the work that goes out.

About Shivanath

Build It, Preview It, Run It · the written assessment

We work in real estate and right now, leads go cold before anyone replies.

Industry
Problem

Brief: Real estate. Leads from portals and WhatsApp. Follow-up has no owner. An agent on a named process. A reviewer on the exceptions. From: /blog/nitro-vercel-scheduled-jobs-webhooks.