Setup guide
Step-by-step DNS and Cloudflare configuration for onboarding a domain — what this dashboard does for you versus what you still have to do by hand. Type a domain below to see live examples throughout.
1. Add the domain to the dashboard
On the Domains page, use Add domain. This registers it for live email ingestion and daily DNS checks — it does not touch DNS itself. The three records below are what it tells you to publish; this page explains why each one is needed.
2. DMARC
Publish (or update) the domain's own _dmarc TXT record with this tool's rua/ruf
addresses added. This example is a DMARCbis-aligned, enforcement-ready record — see the p/
sp/np notes below if the domain is still in monitoring mode and not ready for
that yet:
) than the one being monitored, RFC 7489 §7.1
requires an external-destination-authorization record on our side before most receivers will honor
it. That's — it's on the
zone, not the monitored domain's, and Add domain above
returns it automatically; nothing further needed here.3. TLS-RPT
Publish this TXT record on the domain to subscribe it to SMTP TLS reporting — independent of whether you self-host MTA-STS below; a domain can have this without MTA-STS, or MTA-STS without this.
4. MTA-STS self-hosting (optional, per domain)
Adding the domain in step 1 is not the same as this — MTA-STS hosting is a separate opt-in step on the MTA-STS page. It hosts the policy file that tells senders to enforce TLS to this domain's mail servers, and removes that file's cert-expiry risk entirely (Cloudflare manages the certificate, auto-renewed).
- Save a policy on the MTA-STS page — mode, MX hosts (use "Look up current MX" to pull the real records rather than guessing), and max age. This only writes to this project's own database; the next three steps are still needed before it does anything.
- Add a Cloudflare Worker route for
pointing at this Worker. The domain's zone must be on the same Cloudflare account as this deployment — this doesn't work across accounts. Either add a line towrangler.toml'sroutesand redeploy: or, faster and no redeploy needed, via the Cloudflare dashboard either of two ways: Workers & Pages → this Worker → Domains → Add route; or Domains → the domain itself → Worker Routes → Add route. -
Create the
DNS record — this is the part most likely to be set up wrong.What it should point to: it doesn't matter, as long as it's Proxied. Add an A record forwith any value (192.0.2.1is a fine placeholder) — the content is never actually used, because the Worker route from step 2 intercepts the request at Cloudflare's edge before any origin is ever contacted.
What does matter: the record's proxy status must be Proxied (orange cloud), not DNS only (grey cloud). A grey-clouded record bypasses Workers entirely — Cloudflare resolves it as plain DNS, the Worker route never runs, and mail senders trying to fetch the policy get a connection failure instead of your policy file. This is the single most common way this setup breaks.Subdomain policies need an extra certificate. Universal SSL only covers the zone apex plus one label (*.example.com). If the mail domain is itself a subdomain — sayreports.example.com— its policy hostmta-sts.reports.example.comis two labels deep, no certificate covers it, and HTTPS fails at the TLS handshake (not a 404 — the connection itself is rejected). Cloudflare's error for this, if you check SSL/TLS → Edge Certificates on that zone, is "This hostname is not covered by a certificate." Fix, on that zone: enable Total TLS (SSL/TLS → Edge Certificates → Total TLS — auto-issues a certificate for every currently-uncovered proxied hostname on the zone, so it fixes this one and any future one in a single action) or order an Advanced Certificate covering just this specific hostname; both need the Advanced Certificate Manager subscription on that zone. - Verify before publishing the DNS authorization record — confirm the policy file is actually being served: Should return the policy text saved in step 1. A 404 means the Worker route or the DNS record's proxy status (step 2 or 3) isn't right yet; an SSL/TLS handshake error means the certificate-depth problem above — recheck those before continuing.
- Publish the
TXT record — the exact value is shown after saving the policy in step 1 (v=STSv1; id=<policy_id>). Publishing this last, only once step 4 confirms the file is reachable, avoids senders discovering the record while the endpoint still 404s. Theidchanges every time the policy is re-saved — senders cache by it and only re-fetch the file when it changes, so an edit here always needs a matching DNS update.
Version history
| Version | Date | Notes |
|---|---|---|
| v1.44.0 | 2026-08-10 | Hosted BIMI on the BIMI page: upload a domain's logo SVG (validated against the Tiny P/S constraints) and optional VMC/CMC PEM (expiry parsed), served publicly from bimi.dmarcanalyser.online with the exact default._bimi record generated. No certificate = Yahoo/Fastmail display; Gmail/Apple need a VMC/CMC. |
| v1.43.1 | 2026-08-10 | The Aligned DKIM key(s) line shows the full record name (selector._domainkey.domain) instead of "selector (domain)" — copy-paste ready for a dig/nslookup check. |
| v1.43.0 | 2026-08-10 | Report details now show the aligned (custom-domain) DKIM selector per record — provider infrastructure signatures excluded — plus each selector's live-fetched key strength, flagged red below the configurable minimum (DKIM_MIN_KEY_BITS Worker setting, default 2048). A weak key in active use also raises the new dkim-weak-key urgent alert. |
| v1.42.0 | 2026-08-10 | The Domains table shows when each domain's last DMARC and last TLS-RPT report arrived — a quick "is reporting still flowing?" check per domain ("never" when nothing has arrived yet). |
| v1.41.1 | 2026-08-10 | Removed the dmarcanalyser.online note from the top of the DMARC page — superseded by the per-domain "Analyse DMARC record" action on the Domains page. |
| v1.41.0 | 2026-08-10 | The header/nav now stays pinned while scrolling; a "Top" button appears once scrolled and returns to the top; every section title carries a stable HTML id (e.g. /dmarc#emails-processed) so any heading can be linked to directly. |
| v1.40.0 | 2026-08-10 | The Domains page's DNS records panel gained an "Analyse DMARC record" action (shown only when a live _dmarc record exists): triggers a DMARCbis analysis on dmarcanalyser.online and links the report — the analyser runs on a free Cloud Run plan, so cold starts can take up to a minute. |
| v1.39.0 | 2026-08-10 | Emails Processed view (Valimail-style tabs: DMARC status, SPF alignment, DKIM alignment, disposition) on the DMARC page and domain views; sending identities — named, grouped source IPs marked legitimate/forwarder/malicious on the new Senders page, with automatic network-based suggestions to confirm; a known-malicious source sending again raises an urgent alert; receiver override reasons now parsed and shown in report details. |
| v1.38.0 | 2026-08-10 | Report rows on the DMARC and TLS-RPT pages are now clickable: expand any recent report for its full contents (reporter, report ID, received time, published policy, per-source records / policies + failure details) — both tables also gained a Received column. |
| v1.37.0 | 2026-08-06 | Second-review polish pass: the daily cron now proactively enriches recently-seen source IPs (capped 200/run) so the world map converges on complete; trend/geo/sources take ?domain= and the domain view gained the two DMARC charts; the source page charts its daily volume; summary cards show vs-previous-period deltas; DNS-changes card is amber; triage page cached 5 min. |
| v1.36.0 | 2026-08-06 | The readiness gate's "full 28 days of data collected" requirement is now a toggle on the DMARC page — turn it off when the domain's sending cycles are already known; the aligned-pass gate still applies. The wizard follows the same setting. |
| v1.35.2 | 2026-08-06 | Upload moved from the Tools group to Admin in the nav. |
| v1.35.1 | 2026-08-06 | Brand corrected to GoCloudConsulting — always one unbroken word, never spaced or dotted (domains excepted). |
| v1.35.0 | 2026-08-06 | Closing the loop (evaluation Phase C): weekly Monday digest email (volume vs last week, outstanding alarms, new sources, readiness, DNS drift — preview/send-now on the Logs page), and per-rule runbook lines ("what to do", with the exact command) in alert emails, the triage queue, the domain view, and the digest. |
| v1.34.0 | 2026-08-06 | The graphical layer (evaluation Phase B): shared chart system with date axes/gridlines/tooltips and a semantic palette; DMARC stacked volume trend and alignment-vs-98%-gate chart; TLS-RPT failure-rate trend; sparkline cards; the world map (all-volume/threat-only) on Triage; methodology notes behind ? toggles; GoCloudConsulting branding. |
| v1.33.0 | 2026-08-06 | Reoriented around triage (evaluation Phase A): / is now a "needs attention" home; new /source/<ip> investigation view with written verdicts and /domain/<name> posture view; DMARC moved to /dmarc; nav regrouped Triage · Domains · Reports · Tools · Admin; alert delivery lives on Logs. |
| v1.32.0 | 2026-08-05 | No more browser dialogs: every alert()/confirm() replaced with inline dashboard messages carrying more context — BIMI and DNS check-now results show counts, MTA-STS validation/lookup/delete flows are fully inline, and Domains errors land in their panels. |
| v1.31.2 | 2026-08-05 | Full-width layout: the content column no longer caps at 1100px, so tables use the whole screen instead of showing scroll bars; long text columns (alert errors, reasons, from-domains, DNS values) now wrap. |
| v1.31.1 | 2026-08-05 | Verify against live DNS now shows the required value and the actually-published live value side by side for every record, instead of only the check verdict. |
| v1.31.0 | 2026-08-05 | Domains is now the first nav item, ahead of the Reporting group; DNS change history and the purge audit log moved to a new Logs page in Setup & checks. |
| v1.30.0 | 2026-08-05 | Nav split into Reporting (Overview, DMARC, TLS-RPT) and Setup & checks (Domains, SPF, BIMI, MTA-STS, Upload, Setup); Alert delivery moved to Overview, DNS change history to Domains; content links now body-coloured instead of browser-default blue/purple. |
| v1.29.0 | 2026-08-05 | Source-IP enrichment (catalogue 2.6/3.7): every DMARC sending source now shows its reverse DNS, network (ASN), and country via ipinfo.io — cached 30 days per IP, silently off until the IPINFO_TOKEN secret is set. |
| v1.28.2 | 2026-08-05 | "Run check now" on the BIMI page now clears any now-fixed bimi-broken alarm immediately, instead of leaving it stuck in_alarm (and showing on the Overview page) until the next daily cron. |
| v1.28.1 | 2026-08-05 | Overview page: the Active alarms count is now a button — click it to see exactly what's alarming (rule, severity, since, last emailed) without leaving the page. |
| v1.28.0 | 2026-08-04 | Multi-domain overview (catalogue 3.8): new /overview page, one row per domain across DMARC/TLS-RPT/BIMI/MTA-STS. |
| v1.27.0 | 2026-08-04 | Guided enforcement wizard (catalogue 2.5): policy/readiness/known-sources gates to a go/no-go verdict, on the DMARC readiness table. |
| v1.26.0 | 2026-08-04 | RUA/RUF same-incident correlation (catalogue 2.3): forensic samples on the DMARC dashboard now show correlated aggregate-report activity where a match can be found. |
| v1.25.0 | 2026-08-04 | Source classification (catalogue 2.1): every DMARC sending source tagged known-sender / SPF-authorized / Unknown, on the DMARC dashboard’s Top sending sources table. |
| v1.24.2 | 2026-08-04 | Setup guide names Cloudflare’s exact error text ("This hostname is not covered by a certificate") for the subdomain MTA-STS certificate gap, and recommends Total TLS over a one-off Advanced Certificate since it covers every uncovered hostname on the zone at once. |
| v1.24.1 | 2026-08-04 | Documented and surfaced the Universal SSL depth limit: an mta-sts host for a subdomain policy needs an Advanced Certificate/Total TLS on the zone — noted on save, in verify, and in the Setup guide. |
| v1.24.0 | 2026-08-04 | Delete action on the Domains page: removes a domain entirely — all report data, R2 archives, configuration, state, history, and the domain entry itself — type-to-confirm, recorded in the purge audit log. |
| v1.23.0 | 2026-08-04 | Verify is MX-aware: send-only domains (no MX, or null MX) show the TLS-RPT and MTA-STS records as not applicable instead of missing — DMARC and the authorization record are still expected. |
| v1.22.2 | 2026-08-04 | Verify: mta-sts host now checked by confirming it resolves to Cloudflare’s proxy (Worker fetches bypass same-account routes, so the old fetch check could never work); a differing _mta-sts id is a note, not a warning. |
| v1.22.1 | 2026-08-04 | Verify fixes: authorization record correctly not required for same-organizational-domain reporting; same-zone mta-sts hosts no longer misreported (Worker fetches bypass same-zone routes); verify details now listed under each record. |
| v1.22.0 | 2026-08-04 | Domains page can verify the records against live DNS — presence + required tags/values (extras allowed), with per-record status and a clear "couldn’t check" state when the resolver is unreachable. |
| v1.21.0 | 2026-08-04 | Domains page record listings now include the mta-sts A and _mta-sts TXT records (real policy id when saved, placeholder otherwise), with a note pointing at the Setup guide. |
| v1.20.1 | 2026-08-04 | Alert delivery "Check now" reports inline instead of a modal; the log toggles between full history and outstanding-only. |
| v1.20.0 | 2026-08-04 | BIMI moved to its own tab; nav reordered; version shown in the header on every page; this version-history panel. |
| v1.19.0 | 2026-08-04 | SPF include-chain visualizer: recursive tree with 10-lookup counting and void-lookup detection. |
| v1.18.0 | 2026-08-04 | BIMI monitoring: record validity, logo + VMC checks, 30-day VMC-expiry countdown alert, DMARC-enforcement prerequisite. |
| v1.17.0 | 2026-08-03 | DMARC insights: enforcement-readiness scoring, direct/forwarded/threat volume split, first-seen sending-source alerts, threat-spike rule. |
| v1.16.0 | 2026-08-03 | DNS records re-viewable per domain on the Domains page (previously only shown once at add time). |
| v1.15.0 | 2026-08-03 | All dashboard timestamps now render in the browser’s local timezone instead of raw UTC. |
| v1.14.2 | 2026-08-03 | Documented the second Cloudflare dashboard path for adding a Worker route (Domains → Worker Routes). |
| v1.14.1 | 2026-08-03 | Corrected the Cloudflare dashboard navigation path for adding a Worker route. |
| v1.14.0 | 2026-08-03 | Edit and Delete actions on the MTA-STS policies table. |
| v1.13.0 | 2026-08-03 | Favicon (inline SVG envelope). |
| v1.12.3 | 2026-08-03 | Removed a stray second rua recipient from the Setup page’s DMARC example. |
| v1.12.2 | 2026-08-03 | Setup page’s DMARC example upgraded to a full DMARCbis-aligned enforcement record, every tag explained. |
| v1.12.1 | 2026-08-03 | DMARC page links to dmarcanalyser.online for DMARCbis record evaluation. |
| v1.12.0 | 2026-08-02 | Setup guide page: DMARC rua/ruf/fo tags, TLS-RPT, and the MTA-STS Worker route + hostname setup, with live domain substitution. |
| v1.11.0 | 2026-08-02 | Split /upload into three pages: Upload, Domains, MTA-STS. |
| v1.10.0 | 2026-08-02 | MTA-STS self-hosting: policy files served directly from this Worker, per-domain opt-in. |
| v1.9.0 | 2026-08-02 | Self-serve domain onboarding with the DNS records to publish returned (publishing stays manual). |
| v1.8.0 | 2026-08-02 | SES alert delivery: in-alarm/ok/info lifecycle, 7-day suppression window, delivery log. |
| v1.7.0 | 2026-08-02 | Per-domain purge (dry-run, R2 cascade, audit log) and non-destructive un-monitor/re-monitor. |
| v1.6.1 | 2026-08-02 | Pager hides Prev/Next when there’s only one page. |
| v1.6.0 | 2026-08-02 | Real pagination on both reports tables; TLS-RPT reports sorted by the report’s own period. |
| v1.5.0 | 2026-08-02 | Bulk upload of historical DMARC + TLS-RPT reports; monitored/ad_hoc domain status model. |
| v1.4.0 | 2026-08-02 | Dashboard split into separate DMARC and TLS-RPT pages. |
| v1.3.0 | 2026-08-02 | TLS-RPT health score, failure trend chart, and scheduled DNS/policy-file change history. |
| v1.2.0 | 2026-08-02 | Policy-context-aware severity, configurable threshold/escalation rule engine, reporter-quirks table. |
| v1.1.0 | 2026-08-02 | TLS-RPT severity/triage model (RFC 8460) and high-priority failures view. |
| v1.0.0 | 2026-08-01 | First reusable release: rua/ruf/tls-rpt ingestion, forensic parsing, domain allowlist, Cloudflare Access auth. |