Guides

DMARC setup, start to finish

Last updated 2026-08-26

Publishing a DMARC record takes two minutes. Getting to p=reject without deleting your own invoices takes about six weeks, and almost all of it is finding out who sends mail as you.

Should you start at p=none? Yes, and stop reading if that is all you came for. Publish this at _dmarc.example.com, change nothing else, and come back in two weeks:

v=DMARC1; p=none; rua=mailto:reports@example.com

Monitoring changes nothing about delivery. It cannot cause a message to be rejected. The only thing it does is ask receivers to start sending you daily XML reports about mail claiming to be from your domain.

Step 0: write down who sends as you

Before DNS, spend twenty minutes on a list. Ask finance what sends invoices, ask marketing which platform they moved to last year, ask whoever owns the monitoring stack. You will be wrong, and the reports will correct you, but starting with eight known senders and finding three surprises is a much better position than starting with zero and finding eleven.

The usual list: your mailbox provider, one marketing platform, one transactional provider, a helpdesk, a CRM, an HR or payroll system, a monitoring or alerting tool, and something nobody remembers procuring. The provider pages cover the setup for the common ones.

Step 1: publish the record

One TXT record at _dmarc. If your DNS panel already appends the domain, the name is just _dmarc, and if it does not, it is _dmarc.example.com. Getting that wrong produces _dmarc.example.com.example.com, which is invisible to receivers and which I have watched people stare past for an hour.

dig +short TXT _dmarc.example.com

Exactly one string, starting v=DMARC1. Two records at that name means receivers ignore both. Our DMARC checker reads every tag back to you and flags the ones that leave a gap.

The rua= address has to be able to receive a few hundred XML attachments a week and you have to be willing to read them. If neither is true, point it at our weekly digest. It parses the reports and mails you one summary, free for one domain.

Step 2: read the reports for two weeks

Two weeks, not two days. Monthly senders exist, and the payroll run that fails is always the one on the 28th. What you are building is a table with one row per sending source and three columns: what it is, whether SPF aligns, whether DKIM aligns.

Reading a report by hand walks through the XML. The one thing to internalise now: a source can pass SPF and still fail DMARC, because DMARC needs the passing check to match your From domain. Alignment is where most of the work goes.

Step 3: fix the senders

For each source that fails, one of four things is true.

  1. It is a service you use and it supports domain authentication. Turn it on. This is most of them, and it is usually two CNAME records.
  2. It is a service you use and it does not. Rare, and a reason to change supplier. In the meantime you can sometimes get SPF alignment by having it use a return-path on your domain, or route its mail through your own server.
  3. It is forwarding. Recipients forwarding your mail elsewhere show up as SPF failures with DKIM passing. If DKIM passes, DMARC passes, and there is nothing to fix. This is the strongest practical argument for getting DKIM right everywhere.
  4. It is not yours. Someone spoofing your domain. There is nothing to fix and it is the reason you are doing this.

Work down the list by volume. The top three sources are usually 95% of your mail, and the long tail of single-message sources is mostly spoofing and forwarding noise.

Step 4: move to quarantine

All four of these have to be true before I move a domain to quarantine:

v=DMARC1; p=quarantine; rua=mailto:reports@example.com

You can ease into it with pct=25, which asks receivers to apply the policy to a quarter of failing messages. Handling of that tag has always been uneven between receivers, and the revision of DMARC now working through the IETF drops it, so treat it as a comfort blanket rather than a control. If you are not confident enough to go to 100, you are not ready to leave p=none.

Two weeks at quarantine. Watch the reports and watch your helpdesk. What you are listening for is somebody saying a partner stopped receiving something, because quarantined mail goes to spam where a human can still find it. That grace disappears at the next step.

Step 5: reject

v=DMARC1; p=reject; rua=mailto:reports@example.com

Same criteria, tighter numbers: 99%+ aligned for two weeks at quarantine, and no unexplained failures at all in the last week. Then change one word.

Keep rua=. Reject is the state where receivers refuse a new sender's mail and no bounce reaches you, so the reports are your only instrumentation. This is also the point at which a weekly summary earns its place, because nobody keeps reading raw XML week after week.

Subdomains, which is where this goes wrong

Your policy applies to subdomains unless you say otherwise with sp=. Once the parent reaches p=reject, receivers refuse mail from a marketing platform on news.example.com that somebody configured before you started this, and the person who set it up three years ago does not work here any more.

Two clean approaches. Publish a separate DMARC record on the subdomain with its own policy, which is precise and visible. Or set sp=none temporarily on the parent while you sort it out, which is blunt, wide open, and needs a date attached. What you should not do is leave the parent policy weakened to accommodate one subdomain.

Wildcard-style protection for subdomains you never send from is worth publishing early: a DMARC record on the parent with sp=reject stops accounts.example.com being invented by someone else, at no cost to you if nothing legitimate sends from a subdomain.

The policies, side by side

Policy Receiver does Failing mail Move on when
p=none Delivers, reports Arrives normally 98% aligned, 2 weeks, all big senders known
p=quarantine Delivers to spam Recoverable by the recipient 99% aligned, 2 weeks, nothing unexplained
p=reject Refuses at SMTP Gone, sender gets a bounce You are done

What goes wrong on the way to p=reject

Compliance and the bulk sender rules are what got you here. The reason to finish is bigger: until you are at reject, anyone can put your domain on an invoice email and your customers have no way to tell. Six weeks of careful work buys that, and it holds for as long as you keep the record current when your senders change. The only hard part is the inventory.

Run the ramp on real reports

Every step in this guide depends on a few weeks of aggregate reports. We parse them and mail you a weekly summary: the senders that used your domain, what failed, and when tightening the policy is safe. Paid plans email you the day a new source first fails. Your first domain is free.

Get the weekly digest

No card · 12+ months of history · The free plan does not expire

Questions

Can I publish p=reject straight away?

You can, and on a domain that has never sent mail you should. On a domain with real mail flow you will silently delete legitimate messages from senders you have forgotten about, and nobody will tell you, because rejected mail does not generate a support ticket from the person who never received it.

How long does the whole ramp take?

Four to eight weeks for a normal company. Two weeks at p=none to see who sends, two to four weeks fixing senders, two weeks at quarantine, then reject. Larger organisations with acquisitions and legacy subdomains take longer, and the delay is always sender inventory rather than DNS.

Does DMARC stop people spoofing my domain?

It stops direct spoofing of your exact domain at receivers that honour the policy, which is most large ones. It does nothing about lookalike domains, display name spoofing, or a compromised account sending real authenticated mail.

Do I still need the rua tag once I am at reject?

Yes, more than before. Reject is the state in which a new misconfigured sender fails invisibly. Reports are the only thing that tells you it happened.

DomainCanary is a DMARC monitoring service that turns your domain's aggregate reports into one weekly email.