Eliminating Render Free Tier Cold Starts

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:

  1. Create a job — name it "Render keep-alive"
  2. Set the URLhttps://your-app.onrender.com/health
  3. Set the schedule*/10 * * * *
  4. 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:

  1. Add a /health endpoint to your app
  2. Try Runhooks and schedule a GET every 10 minutes
  3. 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