Site Monitor
Forgot password?
← Back to login
Site Monitor
Overview
Incidents
Monitors
Sites
SSL
Keywords
Checkout Flow
Alerts
Channels
Admin
Settings
Users
Account
View as
Sign out

Overview

Uptime & response time (last 30 days)
Incidents per day

Top offenders last 7 days

View all sites →

Recent incidents

View all →

Sites

—
—

Uptime — last 30 days

Today

Response time last 24 hours

Response time heatmap last 7 days · hover for detail

Loading…

SSL certificate

DNS status

Port / TCP

Heartbeat monitor

Security headers

No header scan yet

Enable "Security headers scan" in Settings to activate

Probe locations last 24 hours

Recent incidents

Response time (last 30 days)

Check log

TimeStatusResponseLocationError

Monitored keywords

Keywords are checked on each monitoring cycle. A "Missing" or "Present!" result opens an incident automatically.

Simulates a real purchase to catch broken cart pages before customers do.

Last run result

Test mode

Steps (0)

Quick setup

Apply a ready-made step set for your platform. Replaces any existing steps.

+ Add a step manually (advanced)

Each step navigates to a URL and waits for the CSS selector to appear. Optional Action JSON runs after, e.g. {"type":"click","selector":".add-to-cart"}

Site settings

Basic
How often this site is checked. Min 1 min.
Monitoring
Disable to pause checks without deleting the site.
Enable for SPAs where keywords load after JS runs. Uses more RAM.
Alert when the page body changes unexpectedly.
Alerts
Open a "slow" incident when response time exceeds this value. 0 = disabled.
Optional features
Check for missing security headers (CSP, HSTS, X-Frame-Options, etc.) on each cycle.
Monitor TLS validity and expiry. Alerts when the certificate expires within 14 days.
Checks DNS resolution every 15 minutes. Alerts if the domain stops resolving or the IP address changes unexpectedly.
Tests TCP reachability every 15 minutes. Alerts when the port stops accepting connections.

Notifications

Channels checked below receive alerts for this site. Manage channels →

Heartbeat monitor

Passive monitoring for cron jobs and background services. Your job pings a secret URL; if no ping arrives within the window, an incident is opened automatically.

SLA target

Set an uptime target (%). Shown in the Overview tab as a visual indicator. No extra alerts are fired — it's a reporting tool for client-facing conversations.

Leave empty or set to 0 to disable SLA tracking for this site.

Maintenance windows

Schedule planned downtime. Checks still run and results are recorded, but no alerts are sent during the window. All times are in your browser's local timezone.

Title
Duration
Custom start
Custom end

Keyword Monitor

Loading…

Checkout Flow Monitor

Loading…

SSL Monitor

Certificate expiry status across your sites. Click a row for full details.

Loading…

Incidents

Loading…

Notification channels

Create reusable destinations (Slack, email, Telegram, webhook) once, then attach them to any of your sites in Site → Settings → Notifications.

Channel groups

A group bundles several channels under one name. Attach a group to a site and all its members will receive notifications.

Settings

Deployment-wide settings (affect all users). Personal preferences live under Account.

Performance

Older check rows and resolved incidents are pruned automatically.
A funnel run is forcibly stopped if it exceeds this limit.
Pre-filled when creating a new site. Each site can have its own interval.
How many consecutive failed checks before a "down" incident is opened. 1 = alert immediately, 2 = require 2 in a row (recommended to reduce false alarms).

Maintenance

Stops URL, keyword, funnel and SSL checks for everyone. Manual “Check now” still works.

Tools

Users

Account

Profile

Username cannot be changed. Contact your admin if needed.
Used for password reset and email alert channels. Required to use "Forgot password".

Notifications

If an incident stays open, send a reminder after this many hours. 0 = never re-alert.

Status page branding

Applied to your sites' public status pages.

Public status page

A public URL that shows all your sites' uptime — no login required. Share it with your clients. Your brand name and colors apply automatically.

/status/

Data export

Download all your data as a JSON file inside a ZIP archive.

SLA report

Download a CSV with uptime %, incident count, and SLA status per site. Share with clients or import into Excel.

API keys

Use API keys to authenticate probe agents and external integrations. Add X-Api-Key: <key> to your requests. The key is shown only once at creation — copy it immediately.

New key — copy it now, it will not be shown again:

Loading…

Change password

Are you sure?

How to use Site Monitor

Welcome to Site Monitor — a lightweight uptime and performance dashboard for web agencies.

1
Add your first site
Go to Sites in the sidebar and click Add site. Enter the URL and a name. The first check runs within one minute.
2
Set up an alert channel
Go to Channels and add a Slack webhook, email address, or Telegram bot. Then attach it to a site inside the site's Settings tab.
3
Share a status page
Go to Account and set a public slug. Your clients can view a live status page at /status/your-slug.

Need help? This panel is always available from the ? button in the sidebar.

Every site is monitored independently. Open a site to see its detail view.

⏱
Check interval
Default is 5 minutes. You can set it as low as 1 minute per site in the Settings tab.
📈
Response time chart
The Response time tab shows a 30-day bar chart with p50/p95 stats. The Overview tab shows a 24-hour SVG bar chart.
🔒
SSL monitoring
Enable per site in Settings → Optional features. Checks once per hour. Alerts when a certificate expires within 14 days.
🌐
DNS monitoring
Enable per site in Settings → Optional features. Checks every 15 minutes. Alerts if the domain stops resolving or the IP address changes from the stored baseline. Use "Accept new IPs as baseline" to update after a planned DNS migration.
🔌
Port / TCP check
Enable per site in Settings → Optional features. Verifies that a TCP connection can be established on the configured port (defaults to 443 for HTTPS, 80 for HTTP). Checks every 15 minutes. Useful for detecting firewall changes or services that return HTTP errors but refuse TCP connections at the network level.
💓
Heartbeat / Cron monitor
Enable per site in Settings → Heartbeat monitor. A secret ping URL is generated. Your cron job or scheduled task must call this URL at regular intervals. If no ping arrives within the configured window, an incident is opened automatically. Example cron:
* * * * * curl -fsS -X POST https://your-domain/api/heartbeat/ping/YOUR_TOKEN
📥
Bulk CSV import
Add many sites at once. Click Import CSV on the Sites page, drop your file, preview the parsed rows, and submit. Required columns: name, url. Optional: interval (minutes), active (0 or 1). Download the template from the import modal for the correct format.
🛠
Maintenance windows
Schedule planned downtime in the Settings tab. Alerts are suppressed while a window is active. Use the duration picker to start a window immediately, or set a custom start/end time.

Channels are reusable notification destinations. Attach them to one or many sites.

💬
Slack
Create an Incoming Webhook at api.slack.com → Apps → Incoming Webhooks. Paste the URL as the target.
✉️
Email
Enter a recipient address. Requires SMTP to be configured in your server environment (SMTP_HOST, SMTP_USER, SMTP_PASS).
✈️
Telegram
Create a bot with @BotFather, then enter chat_id:bot_token as the target.
🔗
Webhook
Any URL that accepts a POST with a JSON body. The exact payload structure is shown in the channel modal when you select the Webhook type — use it to configure your receiving endpoint. Useful for custom scripts, PagerDuty, or any HTTP-based integration.
📦
Channel groups
Bundle multiple channels into a group, then attach the group to a site. One attachment — all channels in the group receive alerts.
🎯
Per-event filtering
When attaching a channel or group to a site, you can choose which event types trigger it: down, recovered, SSL expiry, keyword, and more. This lets you route critical alerts to one channel and SSL warnings to another.

Tip: use the Test button on a channel to send a sample alert before going live.

Each user account gets a public status page — a server-rendered page your clients can bookmark.

1
Set your slug
Go to Account → Public status page. Choose a short URL-safe slug like acme. Your page will be at /status/acme.
2
What clients see
All active sites associated with your account, their current status, uptime for the past 30 days, and any open incidents.
3
Branding
Go to Account → Branding to set a custom name, accent color, and logo URL that appears on your status page.
📎
Embeddable badge
Add a status badge to any webpage: <img src="/badge/your-slug.svg">. The badge shows overall status (green/red) and uptime.
🔑
Keywords monitoring
Add expected (or forbidden) words per site. An alert fires if a required keyword is missing or a forbidden one appears. Access via the Keywords tab inside a site.
🛒
Checkout flow (funnel)
Playwright-driven end-to-end checkout simulation. Enable per site in the Checkout flow tab. Uses more CPU — consider a longer check interval.
⚡
Response time anomaly detection
Automatically opens an rt_degraded incident when the 24-hour average response time exceeds 1.5× the 7-day baseline and is above 500 ms. Resolves automatically when response time returns to normal. No configuration required — runs on every check.
📊
SLA report
Download a CSV with uptime %, incident count, and SLA status per site. Go to Account → SLA report. Choose a period (7 / 30 / 90 / 365 days).
🔐
Security headers scan
Enable per site in Settings → Optional features. Grades your site (A–F) on CSP, HSTS, X-Frame-Options, and similar headers.
🗝
API keys
Go to Account → API keys to generate keys for external integrations. Send the key in the X-Api-Key header instead of a Bearer token. All authenticated endpoints support API key auth. Keys can be revoked at any time without affecting your login session.
⚙️
Global settings (admin)
Admins can configure data retention, default check interval, and pause all checks globally via Settings in the sidebar.

Probe agents are small scripts you run on remote servers (VPS, cloud instances, Raspberry Pi) to check your sites from multiple geographic locations. Results appear in each site's Overview → Probe locations section.

1
Create an API key
Go to Account → API keys, enter a name like VPS-Frankfurt and click Generate key. Copy the key immediately — it is shown only once.
2
Copy the agent script to your remote server
The file probe_agent.py is in the root of the project. Copy it to your VPS:
scp probe_agent.py user@your-vps-ip:~/probe_agent.py
3
Install the only dependency
pip install httpx
4
Run the agent
Replace the values with your own server URL, API key, and a location label:
SM_SERVER_URL=https://uptime.yourcompany.com \
SM_API_KEY=smk_... \
SM_LOCATION="VPS-Frankfurt" \
SM_INTERVAL=60 \
python3 probe_agent.py
The agent runs every 60 seconds, checks all active sites, and posts results back to the main server.
5
Run as a background service (Linux)
To keep it running after SSH disconnect, create a systemd service:
# /etc/systemd/system/sitemonitor-probe.service
[Unit]
Description=SiteMonitor Probe Agent
After=network.target

[Service]
Environment=SM_SERVER_URL=https://uptime.yourcompany.com
Environment=SM_API_KEY=smk_...
Environment=SM_LOCATION=VPS-Frankfurt
Environment=SM_INTERVAL=60
ExecStart=/usr/bin/python3 /home/user/probe_agent.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
systemctl enable --now sitemonitor-probe
6
View results in the dashboard
Open any site → Overview tab → scroll down to Probe locations. You will see one row per active probe with uptime %, average response time, and number of checks in the last 24 hours.
💡
Multi-location setup
Run a probe agent on each remote server with a different SM_LOCATION label. If a client's site is unreachable from one location but online from others, the dashboard shows the discrepancy per location — useful for diagnosing geo-specific DNS or routing issues.

Import sites from CSV

CSV must have a header row with at least name and url columns. Optional columns: interval (minutes, default 5), active (0 or 1).
📂
Click or drag a CSV file here
Preview
Name URL Interval Active Status

Add site

Add channel group

Add notification channel

Create one at api.slack.com → Apps → Incoming Webhooks

Payload preview — what will be POSTed on an incident

    

Create user