DomainCanary Start free

Guides

Moving DMARC to p=reject: the checks before each step

Last updated 28 Oct 2026

Your domain has sat at p=none for months, the reports look fine, and you're still nervous about p=reject. I run the checks below before every step. This page also shows the change each step makes to the record, and how to roll back when a step blocks mail you wanted delivered.

Go to p=reject only when every check below passes against the last four weeks of aggregate reports. If you can't answer one of them, stay where you are for another week.

The checks

  1. You can name every source above 1% of your volume, and each one aligns. Its mail passes DMARC on SPF or DKIM with the domain matching. How alignment works covers the matching part.
  2. Aligned mail is above 98% of volume for two weeks running. For the step to reject, it needs to be above 99%. Take the number from the reports. A checker reads your record and can't see your mail.
  3. DKIM carries most of the passes. At least four in five passing messages pass on aligned DKIM. SPF fails the moment a message is forwarded and DKIM survives it, so a domain passing on SPF alone is far more likely to lose mail at enforcement than its pass rate shows.
  4. SPF is at eight lookups or fewer. The limit is ten. At nine, a new include can take the record past ten, and a sender that receivers need an eleventh lookup to find fails SPF. The SPF 10-lookup guide has the count and the fix.
  5. Your monthly senders have run inside the window. Think of invoicing, payroll and the quarterly statement. You need at least four weeks of reports to catch a monthly sender once.
  6. Reports are still arriving. If Google or Microsoft sent no report for a week, you're missing evidence. Don't count a quiet week as a pass.

Reading an aggregate report shows where each of these numbers sits in the XML. If you have never opened one, start there and come back.

Step 1: p=none to p=quarantine

v=DMARC1; p=quarantine; pct=25; t=y; rua=mailto:reports@example.com

Before you publish it, drop the TTL on the _dmarc record to 300 seconds. The TTL is how long a receiver caches your record, so it is also how long a rollback takes to reach them. At five minutes, you can roll back from your phone and see it take effect. At a day, you can't.

Then change none to quarantine and add pct=25 and t=y. Gmail, Outlook and Yahoo apply pct and ignore t=y. Receivers that follow RFC 9989 read t=y instead and apply the policy one level down, so p=quarantine acts as p=none.

Change nothing else, and leave sp= alone in this step. If you move the subdomain policy at the same time, more can break, and you won't know which change caused it. If the record has sp=quarantine, leave pct and t=y out, because both tags loosen the subdomain policy too.

After three days of reports with none of your own mail failing, raise pct to 50. After three more, remove pct and t=y:

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

At quarantine, a failing message goes to the recipient's spam folder. That's how you find out about a sender you missed. Someone at a partner says your invoice went to junk, and the message is still there to prove it. Watch the helpdesk as closely as the reports for two weeks after you remove pct and t=y.

Step 2: p=quarantine to p=reject

v=DMARC1; p=reject; pct=25; t=y; rua=mailto:reports@example.com

Run the checks again with the tighter pass rate. Then change quarantine to reject and add pct=25 and t=y. If the record has sp=quarantine, leave out pct and t=y. Raise pct to 50 after three days, and remove pct and t=y after three more:

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

If your domain shows a BIMI logo, the logo disappears while pct is under 100.

Once pct and t=y are gone, receivers refuse a failing message during delivery. The sending server gets a 550 5.7.1 bounce, and you get nothing. Keep rua= for as long as the domain exists, because the reports are the only way you'll see those failures.

Rolling back

A rollback stops receivers refusing new mail. Mail they already rejected stays rejected. Put the previous record back, and with a 300 second TTL every receiver is reading the old policy within five minutes. Rejected mail is gone. The sender has a bounce, and the only remedy is asking them to resend. Quarantined mail is in a spam folder, and the recipient can move it back to the inbox.

Roll back when the reports show a sender you've marked as your own failing more often after the step. Fix that sender at p=none or p=quarantine, wait for two clean weeks, and take the step again. Rolling back is a normal part of the process. Leaving a domain at quarantine for a year out of caution is worse. It has taken on the delivery risk, and spoofed mail still reaches spam folders.

By hand and with DomainCanary

By hand, you keep a spreadsheet with one row per sender and a column for each check, and fill it in every Monday from the week's reports. Cloudflare's free DMARC Management parses the reports for you if your DNS is there, and it covers a single domain on Cloudflare well.

With guided enforcement on the paid plans, we run these checks against your reports every day, work out how many messages the next step could cost you, and mail you the proposal with the evidence. You approve it from a link in the mail. For three days after we publish it, we read the reports. If a sender you've marked as yours starts failing, we move the record back and email you what happened. Hosted DMARC is how we publish and revert the record. You point _dmarc at us once, and every step takes effect within a quarter hour.

DMARC enforcement with automatic rollback

We check your DMARC reports before each policy step to p=reject

Add your domain and mark the senders that are yours. We email you each step once your reports pass the checks in this guide, and you approve it.

  1. p=nonereports only
  2. p=quarantineyou approve
  3. p=rejectyou approve

Rollback needs hosted DMARC, on the Starter plan and up. You can try it free for 30 days with no card. Rollback works in the days after each step, and it can't bring back mail a receiver already refused. How rollback works

Create your account

Continue with Google

or

Free for your first domain · No card · Per-source totals kept for life

MSPs can group domains by client.

Read your domain's DMARC record

The policy, the alignment modes and where the reports go, with the gaps marked.

Free · No signup · The result names what to change

Questions

How long should I stay at p=quarantine before p=reject?

Two weeks with every check on this page passing, and long enough that your monthly senders have run at least once. A payroll run on the 28th is the classic sender that passes a two-week window and fails the step.

Can I skip quarantine and go from p=none to p=reject?

You can, and on a domain that sends no mail you should. On a domain with real mail, quarantine is the only step where you can recover from a mistake. The message sits in a spam folder, where a person can still find it. At reject the same mistake is a bounce.

What does losing mail look like once I am at p=reject?

You hear nothing, and the sender gets a 550 bounce. Receivers refuse the message during delivery and tell the sending server, not you. If the sender is one of your own systems, the bounce lands in its logs. The aggregate reports are the only place you see it, which is why they matter more after reject than before.

Does pct=25 make the step safer?

Yes. Gmail, Outlook and Yahoo apply pct and ignore t=y, so a sender you missed loses less mail there in the first days. Receivers that follow RFC 9989 read t=y instead, so publish pct=25 and t=y together. Some receivers apply pct unevenly, so plan for the full step from the first day.

Keep reading

Checking as you go? The DMARC checker reads the policy you are moving up, the SPF and DKIM checkers show whether your senders will survive it, and the report analyzer reads an aggregate report you already have. No signup.

DomainCanary is a DMARC enforcement service that protects your domain from email spoofing without blocking your own mail.