How to Monitor Website Uptime for Free (4 Practical Options)
The easiest free way to monitor website uptime is a hosted monitoring service with a free plan, which checks your site every few minutes from outside your network and emails or messages you when it fails. If you prefer to run it yourself, a self-hosted open-source monitor or a small curl script on a separate machine also works, but you then have to keep the monitor itself running.
You can monitor website uptime for free by signing up for a hosted monitoring service with a free plan, adding your URL, and connecting an alert channel such as email or Telegram. The service checks your site from its own servers every few minutes and notifies you when a check fails. Alternatives are a self-hosted open-source monitor or a simple curl script run by cron on a different machine. All of them work; they differ in how much maintenance you take on.
The one rule: monitor from outside
Whatever option you choose, the checker must not live on the server it watches. A script on your web server cannot report that the web server is down. Use a separate provider, or at least a separate machine in a different location.
Option 1: a hosted free plan
This is the fastest route and the one that needs no maintenance.
Setup steps
- Create an account with an uptime monitoring service that has a free tier.
- Add an HTTP(S) monitor for your homepage, for example
https://example.com/. - Add a second monitor for a page that matters commercially, such as
/checkoutor/contact, and give it a keyword check for text that only appears when the page works, for example the label on your submit button. - Connect at least one alert channel besides email. A chat app on your phone is noticed faster.
- Test the alert by adding a temporary monitor for a URL that does not exist, such as
https://example.com/monitor-test-404, and confirm you get notified. Then delete it.
What to look for in a free plan
| Feature | Why it matters |
|---|---|
| Check interval | 5 minutes is standard on free tiers; shorter means faster detection |
| Number of monitors | Enough for every important URL and job |
| Confirmation from a second location | Fewer false alarms |
| Alert channels | Email plus at least one chat or webhook option |
| Heartbeat monitors | Lets you watch cron jobs, not just URLs |
| Status page | Lets visitors check status without contacting you |
PingRobot's free plan, for example, includes 10 monitors with 5-minute checks, re-checks failures from a second region, and sends alerts by email.
Trade-offs: you depend on the provider, and free tiers have limits on interval and monitor count.
Option 2: a self-hosted open-source monitor
Open-source tools such as Uptime Kuma give you a web dashboard and many alert integrations, and they run on a small VPS or a home server.
Setup outline
- Rent a small VPS from a different provider than your website host, or use a machine you already have outside your production network.
- Install the tool, typically with Docker.
- Put it behind HTTPS and a strong password, because the dashboard can reveal your infrastructure.
- Add your monitors and alert channels.
Trade-offs: the software is free, but the VPS usually is not, and you are now responsible for updates, backups and the monitor's own uptime. Ask yourself: who monitors the monitor? A common answer is a hosted free plan watching the self-hosted instance.
Option 3: a curl script and cron
If you only need "tell me when this URL stops returning 2xx", a few lines of shell on any always-on Linux machine are enough.
#!/bin/sh
# /usr/local/bin/check-site.sh
URL="https://example.com/"
STATE_FILE="/var/tmp/check-site.state"
if curl -fsS -o /dev/null --max-time 15 "$URL"; then
NEW=up
else
NEW=down
fi
OLD=$(cat "$STATE_FILE" 2>/dev/null || echo up)
if [ "$NEW" != "$OLD" ]; then
echo "$URL is $NEW at $(date -u)" | mail -s "Site $NEW: $URL" you@example.com
echo "$NEW" > "$STATE_FILE"
fi
Run it every five minutes:
*/5 * * * * /usr/local/bin/check-site.sh
Notes on the script:
-fmakes curl exit with an error on HTTP status 400 and above, so 5xx errors count as down.--max-time 15treats a hanging server as down instead of waiting forever.- The state file means you get one email when the site goes down and one when it recovers, not an email every five minutes.
mailrequires a working mail setup on the machine. You can replace that line with acurlcall to a chat webhook.
Trade-offs: a single location means a network problem near your checker looks like an outage. There is no history, no uptime percentage and no status page unless you build them.
Option 4: a scheduled CI workflow
GitHub Actions and similar CI services can run a curl command on a schedule.
name: uptime
on:
schedule:
- cron: "*/5 * * * *"
jobs:
check:
runs-on: ubuntu-latest
steps:
- run: curl -fsS -o /dev/null --max-time 15 https://example.com/
A failed run triggers the CI provider's normal failure notification.
Trade-offs: GitHub's minimum schedule is every 5 minutes, runs can be delayed during busy periods, and scheduled workflows in public repositories are disabled after 60 days without repository activity. Treat this as a backup, not your only monitor.
Comparison
| Option | Cost | Maintenance | History and status page | Best for |
|---|---|---|---|---|
| Hosted free plan | Free | None | Usually yes | Most sites |
| Self-hosted open source | VPS cost | Medium | Yes | Teams that want full control |
| curl + cron | Free if you have a server | Low to medium | No | Developers, single URLs |
| CI schedule | Free tier minutes | Low | No | Backup checks |
Make free monitoring reliable: a checklist
- Monitor the HTTPS URL your visitors actually use, including the
wwwform if that is canonical. - Use a keyword check on at least one important page. A keyword monitor catches error pages that return 200.
- Set a timeout between 10 and 30 seconds. A page that takes 40 seconds is effectively down.
- Send alerts to two channels so one broken inbox does not hide an outage.
- Add a heartbeat for your backups. See cron job monitoring with heartbeats.
- Test alerts after setup and after changing channels.
- Review the incident history monthly to spot patterns, such as downtime every night at the same time.
When to move beyond free
Free monitoring stops being enough when:
- An outage of a few minutes costs real money, so 1-minute checks are worth paying for.
- You promise clients an uptime level and need precise numbers. See uptime percentage explained.
- Your team coordinates in Slack or Discord and wants alerts there.
- You need more monitors than the free limit allows.
Until then, a free plan plus a good checklist covers the failures that matter most. For background on how checks work, read what is uptime monitoring.
Start monitoring free — 10 monitors, no credit card.
Frequently asked questions
Is free uptime monitoring good enough for a business website?
For most small business and brochure sites, yes. A free plan with 5-minute checks and email or chat alerts catches real outages. Upgrade when minutes of downtime start to cost money or you need faster detection.
Why should the monitor not run on the same server as my website?
If the server goes down, the monitor goes down with it and no alert is sent. External monitoring must run on separate infrastructure, ideally in a different provider or region.
Can I use GitHub Actions as a free uptime monitor?
It works for low-stakes checks, but scheduled workflows run at most every 5 minutes, can start late when GitHub is busy, and are disabled in public repositories after 60 days without repository activity.
How many monitors does a typical small site need?
Usually three to six. The homepage, one key conversion page with a keyword check, an API or health endpoint if you have one, and a heartbeat for each important scheduled job.