
A note from the founder. Need a reliable way to keep your services warm? I'm looking for a small group of early users to try Runhooks and share honest feedback. Early adopters get upgraded plans for free.
You send your app link to a friend. They click it, stare at a blank screen for 50 seconds, assume it's broken, and close the tab.
That delay isn't a bug in your code. It's a cold start — and if you're hosting on Render's free tier, it happens to every visitor who arrives after 15 minutes of inactivity.
Why Render's Free Tier Spins Down
To manage resources across thousands of free apps, Render enforces an inactivity timeout: if your service receives no requests for 15 minutes, Render shuts down the container entirely.
This isn't a sleep mode. The process is stopped. When the next request arrives, Render has to provision a new container, pull your image, start the process, and wait for it to become healthy. Depending on your stack, that takes 30 to 90 seconds — a Node.js/Express app typically lands around 50 seconds; Python/Django can take over a minute.
For a portfolio site, that's a bad first impression. For an MVP demo, it can kill the conversation before it starts.
The Fix: A Health Check + Keep-Alive Ping
The strategy is simple: ping your app before the 15-minute window expires so Render never shuts it down.
Add a lightweight /health endpoint that does no real work:
app.get('/health', (req, res) => {
res.status(200).json({ status: 'ok' });
});
Then schedule an HTTP GET to that endpoint every 10 minutes (*/10 * * * *). The 10-minute interval leaves a 5-minute buffer — enough margin to absorb network delays or a slow response without risking a shutdown.
Why a DIY Cron Job Isn't Enough
The first instinct is to set up a cron job that curls your health endpoint. In practice, this falls apart quickly:
- Requires an always-on machine. A local cron job stops when your laptop sleeps. A VPS-based cron job means paying for a server to keep your free server alive.
- Fails silently. If the curl times out or gets a
502, cron does nothing — no alert, no retry, no log. Your app stays down and you don't know. - No execution history. There's no record of when pings succeeded or failed. When something breaks, you're guessing.
- No retries. A transient network blip means a missed ping. The next attempt isn't for another 10 minutes — potentially past Render's 15-minute window.
You end up building retry logic, logging, and alerting around a simple curl — or you accept the gaps and hope nothing goes wrong.
How Runhooks Solves This
Runhooks is a scheduled HTTP execution service with built-in reliability. Setting up a keep-alive ping takes two minutes:
- Create a job — name it "Render keep-alive"
- Set the URL —
https://your-app.onrender.com/health - Set the schedule —
*/10 * * * * - Enable retries — 3 attempts with exponential backoff
From there, Runhooks handles everything a cron job doesn't:
- Execution logs — every ping is recorded with timestamp, HTTP status, response body, and duration
- Automatic retries — transient failures retry at 1s → 2s → 4s, so a brief network blip doesn't cost you the window
- Failure alerts — if all retries fail, you get an email or webhook notification immediately — not hours later when a user complains
- Managed infrastructure — runs 24/7 without depending on your machine being on
This also means you get keep-alive and uptime monitoring in one job. The ping keeps Render from spinning down your app, and the alerts tell you when it's genuinely down — a crashed process, a failed deploy, or a Render outage. A DIY cron job can't distinguish between the two.
Get Started
Render's free tier is great for side projects and MVPs — the cold start problem is the only real downside, and it's fully solvable:
- Add a
/healthendpoint to your app - Try Runhooks and schedule a
GETevery 10 minutes - Your app stays warm, and you get alerted if it actually goes down
Test your cron schedule with the cron expression visualizer, and compare plans when you need more jobs or longer log retention.
Read next: Scheduled HTTP Requests vs. Cron Jobs · Why Cron Jobs Fail in Production · What Is a Cron Job? A Beginner's Guide