Features

Monitoring without the mystery.

Duck Stats is built on one honest idea: a monitor is a probe plus an assertion, run on a schedule. For services we can reach: probes run from our external fleet. For boxes behind NAT: your host pushes UP/DOWN to us. No agents, no sidecars, no magic. Here's exactly what runs, where it runs, and what you get back.

01 · Probes

Many probe types, one mental model

Each monitor names a target and a pass condition. Pull-based probes (HTTP, TCP, DNS, SSL, ping, DB) hit you from our fleet. Push-based probes (cron, process) let your box ping us — perfect for things behind NAT.

HTTP/SStatus code, body keyword, header, latency, redirect chain
TCPPort reachability — Postgres, Redis, SMTP, game servers
PINGICMP reachability and round-trip time
SSLCertificate expiry & chain — warned 14 days out
DNSResolve a record and assert the answer
PUSHCron heartbeats — your job POSTs when it finishes
PROCProcess watcher — pgrep on your host pushes UP/DOWN
DBMySQL, Postgres, Mongo, Redis — alive or full health-inspector
MOREgRPC, Kafka, RabbitMQ, JSON-query, Docker container state
DNSBLDaily IP blacklist check across 10+ DNSBLs — email alert on new listings
monitor.yml — declarative config (optional)
- name: API Gateway
  type: http
  url: https://api.acme.dev/health
  interval: 60s
  expect:
    status: 200
    body_contains: "ok"
    max_latency: 500ms
  regions: [us-east, us-west, eu]

# or just paste a URL in the dashboard —
# the YAML is generated for you.
consensus engine
14:33:07 us-east → 503
14:33:07 us-west → timeout
14:33:08 eu → 200 (stale edge?)
14:33:09 re-probe us-east → 503
14:33:09 re-probe us-west → 503
✗ DOWN — 2/3 regions agree, threshold met
→ alert fired in 2.1s
02 · Detection

Multi-region consensus kills false alarms

The fastest way to get ignored is to cry wolf. Before Duck Stats marks anything down, it re-probes from independent regions and requires agreement. A single flaky network hop between us and you won't wake you at 3am. Available on Pro and Team across our five probe locations: US East, US Central, US West, Canada East and Europe.

  • Confirmation re-checks on the first failure
  • Configurable quorum (e.g. 2 of 3 regions)
  • Retry-with-backoff before the incident opens
  • Median latency across regions, not the worst outlier
03 · Latency

Percentiles, not just averages

An average hides your worst customer's experience. Duck Stats records every probe and rolls it into p50 / p95 / p99 by the minute, so a slow tail shows up as a rising line — long before it becomes a support ticket.

p50 · 41 ms p95 · 142 ms p99 · 612 ms

Response time · 24h

142 ms p95
24h agonow
04 · Alerts

Routed, de-duplicated, escalated

One outage should be one notification — to the right place, with enough context to act before you've opened a laptop.

Every channel you use

Email, Slack, Discord, generic webhook, PagerDuty, ntfy and SMS (BYO Twilio). Route by severity or by monitor tag.

Branded HTML or plain text

Email alerts ship as a rich, branded HTML template by default. Flip the per-channel toggle if your inbox prefers bare text.

Quiet during deploys

Open a maintenance window from the UI or POST /maintenance in your CI so a deploy never pages the on-call.

Escalate if unacked

No acknowledgement in N minutes? Escalate to the next channel. Recovery sends an all-clear automatically.

Discord status board

Team plan ships a rich-embed status board for your Discord channel — updated every 90 seconds with per-monitor custom emoji.

Shared SMTP · bring your own

Send via our managed SMTP at no extra cost, or wire in your own provider. Bring-your-own Twilio for SMS.

Daily IP blacklist check

Enable per-monitor to have Duck Stats resolve the target every day at 04:00 and query 10+ DNSBLs (Spamhaus ZEN, Barracuda, SORBS, SpamCop, DroneBL, PSBL, Manitu, Interserver, CBL/Abuseat). If your IP hits a blocklist you get an email — no channel setup needed. Included with all plans.

POST https://hooks.slack.com/… — alert payload
{
  "event": "monitor.down",
  "monitor": "API Gateway",
  "status_code": 503,
  "regions": ["us-east", "eu"],
  "latency_ms": null,
  "started_at": "2026-06-21T14:33:07Z",
  "dashboard_url": "https://app.duckingstats.com/m/api-gw"
}
05 · Push & process

Watch boxes behind NAT

For services we can't reach from the public internet — home labs, internal apps, anything behind NAT — use a push monitor. Your box POSTs UP/DOWN to a unique URL on your interval. The Process Monitor variant is a tiny pgrep script you drop on the host: it pushes UP while the process exists, DOWN when it doesn't.

$ curl -fsS \
  https://stats.duckingstats.com/api/push/$TOKEN?status=up
06 · DB Health Inspector

More than “is it up”

MySQL monitors have an optional DB Health Inspector mode. Each tick runs a multi-query diagnostic sweep — SHOW GLOBAL STATUS, SHOW PROCESSLIST, SHOW SLAVE STATUS, top slow queries from performance_schema — and surfaces connection count, buffer-pool hit rate, replication lag and slow-query digests on the detail page. Postgres, MongoDB, Redis, SQL Server, MQTT, RabbitMQ and Kafka all have their own monitor types for connectivity and health — the deep multi-query inspector sweep above is MySQL-only today.

07 · Status pages

Public status, on your domain

A clean, fast page at status.yourdomain.com with uptime history bars, live incident updates and an email subscribe box. CNAME it, theme it, done. Pro: 5 pages. Team: unlimited and full white-label.

See a live example →
08 · API & data

Your data, exportable

A REST API for every monitor, raw heartbeats for 7 days, rolled-up daily uptime and latency kept long-term, CSV export, and Prometheus-compatible metrics so Duck Stats plugs into dashboards you already run.

$ curl -H "Authorization: Bearer …" \
  https://stats.duckingstats.com/api/v1/monitors
09 · Wall view

Put the whole stack on one screen

One-click fullscreen Wall view — every monitor as a live tile, a probe-network radar, region latency and a streaming event log. Cast it to the office TV and the room knows the second anything turns amber. Share a read-only public link for stakeholders.

10 · WHMCS plugin

Hosting business? Monitor servers from inside WHMCS

If you run a hosting company on WHMCS, drop in our addon and every server you sell appears in the admin panel with live up/down status. Assign monitors to specific products — clients on the “London VPS” product see the London VPS status, clients on “Dallas dedi” see Dallas. Auto-sync from your Duck Stats account; no manual upkeep. Pro tier and up.

Dedicated WHMCS page → See pricing →
WHMCS plugin: admin monitor editor, client issues panel, public network status
Web analytics

Who actually showed up

Uptime tells you the site was reachable. Analytics tells you whether anyone came, where from, and what they did. Both on one bill, one login — no second vendor, no second invoice.

One script tag

Paste one line before </head> and you're collecting. Single-page apps are handled automatically — React and Vue route changes count as pageviews without extra wiring.

Cookieless — no consent banner

No cookies, no local storage, no fingerprinting. Visitors are counted with a salted hash that rotates every day and is never stored in reversible form, so there is nothing to ask consent for.

The numbers that matter

Pageviews, unique visitors, sessions, bounce rate and time on page — plus top pages, entry pages, referrers, campaigns, countries, browsers and devices.

Goals & revenue

Fire duck('signup') from any button and turn it into a tracked conversion. Attach a value and the dashboard reports revenue per campaign.

UTM campaigns, attributed

Campaign links are attributed to the campaign, not to whichever site linked them last. Tracking parameters are stripped from page paths so your top-pages report stays readable.

Share it without a login

Publish a read-only dashboard link for a client or a colleague. Revoke it whenever you like — re-sharing mints a fresh URL rather than reviving the old one.

the entire install
<script defer data-site="your_site_id" src="https://dk.duckingstats.com/dk.js"></script>

Honest about the limits: visitors running ad blockers are not counted, so expect to under-report by roughly 10–25%. That is true of every analytics product, including Google Analytics — anyone claiming otherwise is guessing.

Mail tracking

Did that email actually get opened?

Drop an invisible 1×1 pixel into any HTML email — sent from Gmail, Outlook, WHMCS, a PHP script, a Django job, anything — and Duck Stats records who opened it, when, and on what. It does not have to be an email Duck Stats sent.

Per-recipient, not per-blast

Every recipient gets their own token, so on a message to five people you see which ones opened it — not just a total. You can also track at domain granularity, when “someone at acme.com opened it” is the answer you actually need.

What each open records

Timestamp, IP address, country, mail client, operating system, device type and which open this was — first, second, tenth. The full history sits on the message in your dashboard.

Human opens, counted honestly

Apple Mail Privacy Protection prefetches images at delivery time and Gmail fetches through GoogleImageProxy — with no human involved. Most trackers count those as opens and hand you an inflated number. Duck Stats records every hit but labels it — human, Apple MPP, Google proxy, scanner or bot — and reports a separate human opens count that means what people think “opens” means.

Several domains, one tracking code

Sending as acme.io and acme-support.com is still one sender. Attach domain aliases to a tracking code and every one of those domains reports into a single history, instead of fragmenting into a separate code per domain.

Tell me when it's opened

Opt in to an email the moment a tracked message is opened, carrying the whole record — recipient, code, time, IP, location, client, device, open number and classification. Pick first human open, every human open, or every hit; a cooldown keeps Apple's prefetches from spamming your inbox.

Three states, and no fourth

Opened — a human loaded the pixel. Delivered — only proxy prefetches were seen, which proves the message arrived but not that anyone read it. Unknown — no pixel hits at all. There is deliberately no “not delivered” state: a pixel cannot detect a delivery failure, and we won't pretend otherwise.

Illustration — sample data, not a live account.

How the pixel actually works, and where it lies to you

What you embed. One <img> tag pointing at a 43‑byte transparent GIF, carrying a token unique to that recipient. Either paste it into your signature or template yourself, or call POST /api/inject and let Duck Stats rewrite the HTML for you before you send. No SDK, no SMTP change, no DNS record — and the mail keeps going out through whatever you already use.

Why “opens” is a lie everywhere else. Since 2021, Apple Mail Privacy Protection loads every image the moment mail arrives, from an Apple relay, whether or not the person looks at it. Gmail fetches images once through GoogleImageProxy and caches them — so a second read may record nothing at all. Corporate security scanners open every link and image in the message before the recipient sees it. Every one of those is a pixel hit with no human behind it. Duck Stats stores them all, tags each one as human, Apple MPP, Google proxy, scanner or bot, and reports human opens as a separate figure. The number you see is the number of people.

The three states, and the fourth we refuse to invent. Opened means a human loaded the pixel. Delivered means only machine prefetches were seen — the message arrived, but nobody has read it. Unknown means no hits at all. There is deliberately no “not delivered”: a pixel that never loads proves nothing. Images may be off, the client may be text‑only, or the mail may just be unread. Only SMTP bounce data can prove a failure, and no tracking pixel has it.

Several domains, one history. If you send as acme.io and acme-support.com, you are still one sender. Attach both as domain aliases on a single tracking code and they report into one timeline instead of splitting into a code per domain.

What is recorded per hit. Timestamp, IP address, country, mail client, operating system, device type, and which open this was. Country comes free from the edge; city‑level location is not available today and we would rather say so than round it up to a guess. Raw IP and user‑agent rows age out after 90 days — the per‑recipient counts and first/last open times are kept, so your history survives the cleanup.

Be straight with people. Open tracking records data about your recipients. In the EU and UK that generally needs a lawful basis under GDPR, and some jurisdictions require consent. Say so in your privacy policy. Plain‑text email cannot be tracked at all, because there is no image to load.

Open mail tracking →

See it watching your own stack

Add your first monitor free. It takes about two minutes and zero installs.

Start monitoring free