DMARC Policy Rollout: p=none → p=quarantine → p=reject Migration Cadence (RFC 7489 §6.3)

A practitioner guide to the DMARC policy rollout: how to migrate the p= tag from p=none through p=quarantine to p=reject without breaking legitimate mail. Covers the three policy states, the five-phase rollout sequence with realistic durations, the pct= sampling tag, subdomain policy timing (sp= and np=), a worked Week 0 → Week 26 timeline, and the operational best practices that distinguish a successful rollout from a self-inflicted email outage.

This reference is provided in English. DMARC policy is specified in English-language RFCs (RFC 7489, RFC 9091, draft-ietf-dmarc-dmarcbis) and the canonical vocabulary (p=none, p=quarantine, p=reject, pct=, sp=, np=, "monitoring mode", "aggregate report") does not translate. We keep the body in the source language so technical terms remain consistent with the specifications.

TL;DR

  • DMARC policy rollout is the phased migration of the p= tag through three states: p=none (monitor) -> p=quarantine (route to spam) -> p=reject (refuse at SMTP). Defined in RFC 7489 §6.3.
  • The rollout is OPERATIONAL guidance, not an RFC-defined ramp. Receivers act on whatever p= value is currently published — you control the cadence by editing the DNS record between phases.
  • Typical timeline: 3-6 months end-to-end. 2-4 weeks at p=none to discover senders; 4-8 weeks fixing alignment; 2-4 weeks at p=quarantine; pct= ramp 5 -> 25 -> 50 -> 100 over 4-8 weeks; then p=reject.
  • The pct= tag applies the published policy to a percentage of failing mail — use it to ramp enforcement gradually within a stage rather than between stages. Note: pct= is deprecated in dmarcbis.
  • Never jump straight from p=none to p=reject. Quarantine first — the spam folder is a recoverable failure mode; SMTP reject is not.
  • Aggregate (rua) reports are the single most important signal during rollout. Publish rua=mailto: on day one and read the reports weekly.
  • The sp= and np= tags can advance AHEAD of p= because non-sending subdomains are easier to lock down than the apex.

1. What is DMARC policy rollout?

DMARC policy rollout is the phased migration of the p= tag through DMARC's three policy states. The p= tag tells receiving mail servers what action to take when a message fails DMARC evaluation — either because SPF and DKIM both failed alignment, or because neither produced a verifiable result for the From: header domain. RFC 7489 §6.3 defines three valid values:

  • p=none — request no action; the message is delivered normally and the receiver only reports the DMARC outcome via aggregate (rua) reports.
  • p=quarantine — request that the message be flagged as suspicious; most receivers route it to the spam folder.
  • p=reject — request that the message be refused at the SMTP RCPT TO stage so the sending MTA receives a bounce.

The rollout is the OPERATIONAL JOURNEY through those three states. The DMARC RFCs do not specify a ramp — they describe what receivers SHOULD do when they observe each value. The sender controls progression by editing the _dmarc DNS TXT record. Moving from p=none to p=quarantine means publishing a new TXT record value; receivers pick up the change as the TTL expires (typically within an hour).

Rollout exists because DMARC is unforgiving. Every sending source that fails alignment at p=reject stops delivering — every SaaS sender without custom-domain DKIM, every on-prem MTA with a stale SPF include, every automated job that ships from a third-party domain. You cannot discover those failures without the diagnostic phase that p=none provides; you cannot tolerate them under p=reject; the rollout bridges the gap.

The full DMARC ecosystem context is in the DMARC primer; the tag-by-tag reference is the DMARC records deep dive; the identifier-alignment concept that determines pass/fail in the first place is the DMARC alignment page. This page focuses on the rollout sequence itself.

2. The three DMARC policy states

The keystone reference for this page: every rollout decision is a choice between these three values and the operational consequences of each.

Policy Receiver action Failure visibility When to use Recoverability
p=none None — deliver normally. Aggregate reports only. Discovery phase. Establish which senders exist and which fail alignment. Always start here. N/A — no enforcement.
p=quarantine Route failing mail to the spam folder (receiver discretion). Aggregate reports AND user-visible spam-folder placement. Mid-rollout. Surfaces blocked mail without permanent loss — users can retrieve from spam. Recoverable. Mail is delivered to a folder the user can access.
p=reject SMTP-level refusal at RCPT TO. Aggregate reports AND SMTP bounce messages back to the sending MTA. Goal state. Closes the spoofing window for the From: header domain. Not recoverable. The receiving MTA never accepts the message body.

p=none is sometimes called monitoring mode. It is not the final state of any production DMARC deployment — leaving an active sending domain at p=none indefinitely means publishing a DMARC record that documents WHO IS SPOOFING YOU without actually stopping them. However, p=none with active aggregate-report monitoring is dramatically better than no DMARC record at all because it gives you the visibility needed to plan a rollout.

p=quarantine is the operational middle ground. The receiver still accepts the message but flags it as suspicious — typically routing to the spam folder. Recipients can recover missed legitimate mail from spam during the quarantine phase, which is exactly the failure mode you want during rollout: visible enough to surface alignment problems, recoverable enough that a missed transactional mail is not a service incident.

p=reject is the goal state. Mail that fails DMARC is refused at RCPT TO, before the message body is accepted, so the sending MTA receives a hard SMTP bounce. No spam-folder fallback exists. This is the only state that actually prevents DMARC-failing mail from reaching the recipient — everything else is partial enforcement.

3. The phased rollout sequence

The standard rollout has five phases. Each phase has an entry condition, a published DMARC record, an observation window, and an exit condition. Do not advance phases on a fixed schedule — advance when the exit conditions are met. A larger sending estate takes longer.

Phase 1 — Discovery (p=none, 2 to 4 weeks)

Published record (apex): v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com. Receivers send daily aggregate reports describing which IPs sent mail claiming to be from your domain, what SPF / DKIM results applied, and whether alignment passed. The goal of Phase 1 is INVENTORY: enumerate every legitimate sender and every spoofing source.

Exit when: every sending IP in the aggregate reports is identified as either legitimate (with a remediation plan if currently misaligned) or known-malicious (will be addressed by the rollout itself).

Phase 2 — Alignment Fix-up (still p=none, 4 to 8 weeks)

For every legitimate-but-misaligned sender from Phase 1, fix the alignment. Common remediation work:

  • Enable custom-domain DKIM at every SaaS sender (SendGrid, Mailgun, Postmark, Marketo, HubSpot, ServiceNow). Without this the SaaS signs mail with its own domain and DKIM never aligns with your From:.
  • Update SPF to include legitimate senders that produce SPF-aligned mail (custom bounce domains).
  • Migrate stale third-party DMARC delegation (subdomain CNAME pointing to a vendor's DMARC reporting service).
  • Identify shadow IT — Acme Logging, a one-off survey tool, a forgotten e-commerce platform — and either align them or decommission them.

Exit when: aggregate reports show ≥99% of legitimate mail volume passing DMARC. The remaining ≤1% is acceptable known-failing (typically forwarders) or acceptable spoofing.

Phase 3 — Initial Enforcement (p=quarantine; pct=5, 1 to 2 weeks)

Published record: v=DMARC1; p=quarantine; pct=5; rua=mailto:dmarc-reports@example.com. Receivers quarantine 5% of DMARC-failing mail; the remaining 95% is treated as p=none. The small sample surfaces any blocked legitimate flows that Phase 2 missed — typically a low-volume sender that did not appear in the previous aggregate-report window.

Exit when: 1-2 weeks of aggregate reports with no unexpected blocked legitimate flows.

Phase 4 — Ramping Enforcement (p=quarantine with pct= ramp, 4 to 8 weeks)

Ramp pct= through 25, 50, 100 in 1-2 week increments. Each ramp expands the sample subject to quarantine; each ramp is independently verifiable via the rua reports. The full pct= ramp typically takes 4-8 weeks because each step needs an observation window long enough to surface weekly-cadence senders (a payroll mailer that runs every Wednesday or a quarterly report).

Exit when: pct=100 is published, 1-2 weeks of clean aggregate reports.

Phase 5 — Full Enforcement (p=reject, indefinite)

Published record: v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com. The pct= tag is omitted (or set to pct=100 explicitly). This is the permanent operational state. Aggregate reports continue to arrive — DMARC monitoring is forever, not a one-off project. New SaaS deployments, marketing-tool changes, or partner integrations can re-introduce misalignment, and rua reports are the detection mechanism.

4. The pct= tag for gradual enforcement

The pct= tag specifies the percentage of mail subjected to the published policy. RFC 7489 §6.6.4 defines this as a sampling mechanism for gradual rollout. The default is pct=100 if the tag is omitted.

The receiver semantics: when DMARC fails on a message and pct<100, the receiver applies p= to a random subset of pct-percent of failing messages. The remaining 100-pct-percent are downgraded to the next-lower policy:

  • p=quarantine; pct=25 — 25% of failing mail is quarantined; the other 75% is treated as p=none.
  • p=reject; pct=10 — 10% of failing mail is rejected; the other 90% is treated as p=quarantine.

The standard ramp inside a single policy state:

; Week 0 — initial enforcement at 5%
v=DMARC1; p=quarantine; pct=5;  rua=mailto:dmarc-reports@example.com

; Week 1 — ramp to 25% after clean rua reports
v=DMARC1; p=quarantine; pct=25; rua=mailto:dmarc-reports@example.com

; Week 2 — ramp to 50%
v=DMARC1; p=quarantine; pct=50; rua=mailto:dmarc-reports@example.com

; Week 4 — ramp to 100% (pct= tag omitted)
v=DMARC1; p=quarantine;         rua=mailto:dmarc-reports@example.com

Important dmarcbis note: the in-progress draft-ietf-dmarc-dmarcbis deprecates the pct= tag. The rationale is that pct= is rarely used correctly — operators commonly publish low pct values for months without ever ramping, leaving most mail enforcement-free, and gradual enforcement is better achieved through the phased approach (p=none -> p=quarantine -> p=reject) rather than within-stage pct ramping.

Practical guidance: pct= still works at every major receiver as of 2026 and will continue to work for the foreseeable future. Use it where it helps (the early quarantine phase), but do not rely on a long-running pct ramp as a substitute for advancing through the policy states. If you are starting a fresh rollout today, plan for a rollout that does not depend on pct= existing in five years.

5. Subdomain policy timing: sp= and np=

The p= tag applies to the organizational (apex) domain. RFC 7489 §6.3 defines sp= for subdomain policy override; RFC 9091 §2 adds np= for non-existent subdomain policy. The two subdomain tags are independent of the apex rollout and can advance ahead of it.

The policy waterfall (per RFC 9091 §2):

  1. For mail claiming a non-existent subdomain From: domain — np= applies if present; otherwise falls through to sp=; otherwise to p=.
  2. For mail claiming an existing subdomain From: domain — sp= applies if present; otherwise p=.
  3. For mail claiming the apex From: domain — p= applies. sp= and np= are ignored.

Why subdomain policy advances ahead of the apex: the apex domain is the hardest part of the rollout because it carries the highest-volume legitimate sending estate (marketing, transactional, support, partner integrations). Subdomains often have a much narrower role — and many subdomains have NO legitimate sender at all (parked subdomains, internal-only subdomains, or naming patterns that exist only as DNS records for other services). Those subdomains can move to p=reject on day one without risk.

A typical published record during rollout:

; Apex still at p=none for sender discovery, but every
; subdomain that should never send mail is locked
; down at quarantine/reject from the start.

_dmarc.example.com  TXT  "v=DMARC1; p=none; sp=quarantine; np=reject;
                          rua=mailto:dmarc-reports@example.com"

Reads as: the apex (example.com) is in monitoring; existing subdomains (mail.example.com, smtp.example.com, etc.) are quarantined if they fail DMARC; non-existent subdomains (random.example.com, a.example.com) are rejected — closing the NXDOMAIN-spoofing surface that some phishing campaigns exploit.

6. Worked rollout timeline (Week 0 to Week 26)

A realistic six-month rollout for a mid-size organization with 5 to 15 legitimate sending sources. Adjust the dates based on your sending-estate complexity — larger organizations often need 9-12 months end-to-end.

Week 0 — Publish initial record

_dmarc.example.com  TXT  "v=DMARC1; p=none; sp=none; np=reject;
                          rua=mailto:dmarc-reports@example.com"

Apex at p=none for discovery; np=reject from day one because non-existent subdomains have no legitimate sender by definition. Set up a mailbox for the rua reports — typically a forwarding address routed to a parser (DMARC Analyzer's aggregate-report ingestion pipeline; see includes/DmarcParser.php).

Weeks 1 to 3 — Read the aggregate reports

Daily aggregate reports arrive from Google, Microsoft, Yahoo, and other major receivers. The reports describe alignment outcomes per sending IP. Build the inventory: SaaS senders, on-prem MTAs, marketing platforms, partner forwarders, and spoofing sources.

Weeks 4 to 10 — Fix legitimate-sender alignment

Work through each misaligned legitimate sender. Typical fixes: enable custom-domain DKIM at SaaS senders, update SPF, retire shadow-IT senders. Re-check aggregate reports weekly to confirm each fix landed.

Week 11 — Advance to quarantine (pct=5)

_dmarc.example.com  TXT  "v=DMARC1; p=quarantine; pct=5; sp=quarantine; np=reject;
                          rua=mailto:dmarc-reports@example.com"

Now 5% of failing apex mail is routed to spam. The small sample surfaces any sender that Weeks 4-10 missed. Read rua reports daily for the first week, then weekly.

Weeks 12 to 16 — Ramp pct=

  • Week 12: pct=25
  • Week 14: pct=50
  • Week 16: pct=100 (or omit the tag)

Weeks 17 to 22 — Stabilize at p=quarantine; pct=100

Two to four weeks at full quarantine enforcement, ideally spanning at least one weekly-cadence sender cycle (e.g., a payroll mailer that runs every Wednesday) and one monthly-cadence sender cycle (e.g., a monthly customer newsletter).

Week 23 — Advance to p=reject (pct=5)

_dmarc.example.com  TXT  "v=DMARC1; p=reject; pct=5; sp=reject; np=reject;
                          rua=mailto:dmarc-reports@example.com"

Reject 5% of failing apex mail. Now the failure mode is non-recoverable (SMTP bounce) — keep a close eye on the rua reports and any support tickets about bounced mail.

Weeks 24 to 26 — Ramp pct= to 100

  • Week 24: pct=25
  • Week 25: pct=50
  • Week 26: pct=100 (or omit the tag)

Week 26+ — Operational steady state

_dmarc.example.com  TXT  "v=DMARC1; p=reject; sp=reject; np=reject;
                          rua=mailto:dmarc-reports@example.com"

DMARC reaches the goal state. Aggregate-report monitoring continues forever — new senders (a new SaaS tool, a new partner) can break alignment at any time and rua reports are the detection signal.

7. Rollout best practices

  1. Publish rua= on day one. The aggregate-report stream is the single most important rollout diagnostic. Without rua, you are advancing policy stages blind.
  2. Always go through quarantine. Never jump from p=none to p=reject. The quarantine phase is the recoverable failure mode that surfaces problems without dropping mail.
  3. Lock down non-sending subdomains first. Publish np=reject from day one; publish sp=quarantine as soon as you have inventoried subdomain senders. Subdomains are the easy half of the rollout.
  4. Time observation windows around cadence. A weekly payroll mailer does not appear in a Monday-to-Friday observation window. Ensure each ramp step spans at least one weekly cycle and ideally one monthly cycle for the longest ramps.
  5. Use a low TTL on the _dmarc record. 300-3600 seconds. This lets you roll back quickly if a ramp step blocks legitimate mail.
  6. Maintain a rollback record. Keep the previous DMARC TXT value ready to re-publish if the next ramp step breaks something. Rollback is just a DNS edit — but you do not want to compose the rollback record during an incident.
  7. Communicate the rollout internally. Marketing, HR/payroll, support, and partner-integration teams all need to know that DMARC is rolling out and what the symptoms of misalignment look like (spam-folder placement, bounce messages).
  8. Document every sender. Build a spreadsheet of every legitimate sending source: tool name, owner, SPF include or DKIM selector, current alignment status, remediation owner. This is the artifact you will reference for years.
  9. Monitor after p=reject ships. DMARC monitoring is forever. Schedule a monthly review of aggregate reports indefinitely.
  10. Read forensic (ruf) reports if you have them. ruf reports include the From: header of failing mail; they accelerate debugging when an aggregate report shows a strange sending IP. Most receivers do not send ruf reports, but Google does (and others do partially).

8. Common rollout mistakes

  1. Jumping straight from p=none to p=reject. The single most common cause of self-inflicted email outages. Quarantine first.
  2. Leaving p=none forever. A DMARC record at p=none with no rollout plan publishes the fact that you have DMARC monitoring without actually protecting your domain. After 12-24 months at p=none, the rollout has stalled — fix it.
  3. Ignoring rua reports. Publishing rua= without reading the reports is monitoring theatre. The reports are the signal — without consuming them, you are advancing policy stages blind.
  4. Ramping pct= without an observation window. A pct= ramp from 5 to 100 in one day is no rollout at all. Each step needs at least a week to surface previously-unseen senders.
  5. Forgetting third-party senders. Marketing tools, transactional-email APIs, ticketing systems, and partner notifications all need DKIM alignment. The aggregate reports will surface them — read the reports.
  6. Publishing duplicate DMARC TXT records. RFC 7489 §6.6.3 requires exactly one DMARC TXT record per domain. A second record (often left over from a vendor trial) invalidates the entire policy at receivers.
  7. Missing sp= on a parent domain with active subdomain senders. Without sp=, every subdomain inherits the apex p=. If the apex is p=reject and a subdomain has a separate sending estate that is not yet aligned, the subdomain traffic breaks.
  8. Using a single high TTL. A 24-hour TTL on the _dmarc record means rollback takes 24 hours. Use 300-3600 seconds for the entire rollout, only increasing the TTL after p=reject stabilizes.
  9. Skipping the np= tag. np=reject closes the NXDOMAIN-subdomain spoofing surface at zero risk. There is no legitimate mail that requires sending from a non-existent subdomain. Publish np=reject on day one.
  10. Stopping aggregate-report monitoring after p=reject ships. Rollout is a project; monitoring is permanent. A new SaaS deployment three months after p=reject can reintroduce misalignment — the rua reports are the detection signal.

9. Rollout troubleshooting

Legitimate mail is being quarantined or rejected
Identify the source from the aggregate reports — every quarantine/reject decision is logged with the sending IP. Look up the IP, identify the sender, and confirm whether the sender supports custom-domain DKIM. If yes, enable it. If no, consider whether the sender can be migrated to a DMARC-aware alternative or whether the relevant mail flow should use a different From: domain.
Aggregate reports stopped arriving
Verify the rua= mailbox is accepting mail (the rua mailbox itself must align with DMARC if it is on the same domain — a chicken-and-egg problem during rollout that is best solved by hosting the rua mailbox at a different domain or by publishing a cross-domain authorisation record per RFC 7489 §7.1). Confirm the rua= mail is not being spam-filtered by the mailbox provider.
The pct= ramp surfaced a new misaligned sender
Roll back to the previous pct= value (DNS edit, propagates within TTL). Add the new sender to the inventory. Fix alignment. Re-attempt the ramp step after a clean observation window.
A subdomain breaks after publishing sp=quarantine
The subdomain has senders the apex rollout did not inventory. Either publish a subdomain-specific DMARC record (_dmarc.subdomain.example.com with its own p=) and run an independent rollout for that subdomain, or roll back sp= and inventory the subdomain senders before advancing.
Forwarded mail is failing DMARC at p=reject
SPF alignment routinely breaks during forwarding (envelope rewrite). The fix is to ensure DKIM alignment is solid — DKIM survives forwarding when the message body is not modified. If both SPF and DKIM fail under forwarding, the forwarder should adopt ARC (RFC 8617) to preserve authentication results across the hop.
A short-lived spike in DMARC failures appeared
Usually a new third-party tool was configured to send mail from your domain without alignment. Identify it from the aggregate reports (a new sending IP that was not in last week's report), confirm it is legitimate, and align it.
Receivers ignore the published policy
DMARC enforcement is at receiver discretion — some smaller receivers partially implement DMARC. The major consumer mailbox providers (Google, Microsoft, Yahoo) enforce DMARC reliably. Smaller corporate gateways and some ISP mailers vary. This is not a misconfiguration — it is the reality of DMARC deployment at receivers.

10. Frequently Asked Questions

What is the DMARC policy rollout?
The DMARC policy rollout is the phased migration of the p= tag from p=none (monitoring mode, no enforcement) through p=quarantine (route unaligned mail to the spam folder) to p=reject (refuse unaligned mail at the SMTP level). RFC 7489 §6.3 defines the three policy states; the rollout sequence itself is operational guidance because the receiver acts on whatever p= value is currently published — there is no built-in ramp. Operators advance one stage at a time, monitoring aggregate (rua) reports between stages to confirm no legitimate mail flows are being blocked.
How long should a DMARC rollout take?
A typical DMARC rollout takes three to six months end-to-end. The general cadence: 2-4 weeks at p=none to discover every legitimate sender via aggregate reports; 4-8 weeks fixing alignment for each discovered sender (SaaS DKIM enabling, SPF cleanup, third-party DMARC delegation); 2-4 weeks at p=quarantine; pct= gradual ramping from 5 -> 25 -> 50 -> 100 over 4-8 weeks; then p=reject. Larger organizations with diverse sending estates (HR, marketing, transactional, third-party SaaS, partner portals) typically need the upper end of the range.
What is the difference between p=none, p=quarantine, and p=reject?
p=none requests no action — receivers report alignment results via aggregate (rua) reports but deliver mail normally regardless of DMARC outcome. p=quarantine requests that DMARC-failing mail be routed to the spam folder (the exact action is at the receiver's discretion; most route to spam, some apply additional spam-score weighting). p=reject requests that DMARC-failing mail be refused at the SMTP RCPT TO stage, before the message body is accepted, so the sending MTA receives a bounce. p=reject is the only state that actually prevents DMARC-failing mail from reaching the recipient.
What does the pct= tag do during rollout?
pct= specifies the percentage of mail subjected to the published policy. pct=100 (the default) applies p= to 100% of DMARC-failing mail. pct=25 with p=quarantine applies quarantine to 25% of failing mail and downgrades the remaining 75% to p=none behaviour. RFC 7489 §6.6.4 defines this as a sampling mechanism for gradual rollout: ramp pct= from 1 -> 10 -> 25 -> 50 -> 100 between policy changes so you discover blocked legitimate flows on a small sample before the full rollout. Note: dmarcbis (the in-progress successor draft) deprecates pct= — read the dmarcbis transition notes before relying on pct= for a brand-new rollout.
Should I jump straight from p=none to p=reject?
No. Jumping straight from p=none to p=reject is the single most common cause of self-inflicted email outages during DMARC rollout. p=none gathers DMARC-failure data via aggregate reports but takes no action on failing mail. Moving directly to p=reject means every legitimate sender that was failing alignment under p=none (and was NOT noticed because mail still delivered) now hits a hard SMTP reject. Pass through p=quarantine first — the spam folder is a recoverable failure mode that surfaces problems without dropping mail.
How do I know when it is safe to move from p=quarantine to p=reject?
Three signals: (1) Two to four consecutive weeks of aggregate (rua) reports showing zero DMARC-failing mail from legitimate sources — every aligned source pass-rate at or near 100%, every misaligned source identified and either fixed or accepted as known-failing. (2) No support tickets about missed mail (transactional, password reset, partner notification) that would indicate legitimate mail was hitting quarantine. (3) The pct= sampling ramp at p=quarantine reached pct=100 with no new failure modes appearing. If all three are true, advance to p=reject.
What is the difference between p=, sp=, and np=?
p= sets the policy for the organizational domain (the apex). sp= overrides p= for ALL subdomains. np= (added in RFC 9091) overrides p= for non-existent subdomains specifically — protecting parked subdomains from spoofing without affecting any defined subdomains. During rollout, the sp= and np= tags are often advanced AHEAD of p= because subdomains are easier to control than the apex (a non-sending subdomain can move to p=reject on day one without risk). The RFC 9091 waterfall: np= wins for NXDOMAIN subdomains, sp= wins for existing subdomains, p= wins for the apex.

12. Plan your DMARC rollout now

DMARC Analyzer ingests aggregate (rua) reports via the includes/DmarcParser.php pipeline and surfaces alignment outcomes per sending source in the dashboard — the same view you will rely on through every phase of the rollout. The Domain Security Checker (domain_checker.php) performs live DNS lookups so you can confirm the currently-published p= / sp= / np= / pct= values against the intended rollout stage. The Email Header Analyzer (header_analyzer.php) decodes individual messages when users report missed mail during the quarantine or reject phases.

Check my current DMARC record Sign up — Free plan