Email authentication
DMARC pct= Rollout: Staged Enforcement in 30 Days [2026]
TL;DR: The pct= tag tells receivers what percentage of failing email to apply your policy to. It's how you safely ramp from p=quarantine to p=reject without flipping a switch and breaking everyone. The canonical ladder is 10 → 25 → 50 → 75 → 100, gated on alignment-rate evidence between each step. Plan on a 30-day rollout in the best case; expect to pause for two to four weeks at one of the rungs while a misaligned sender gets fixed.
What pct= actually does
The pct= tag is defined in RFC 7489 §6.3 as the percentage of messages from the sender's mail stream to which the DMARC policy is to be applied:
“Percentage of messages from the Domain Owner's mail stream to which the DMARC policy is to be applied. However, this MUST NOT be applied to the DMARC-generated reports, all of which must be sent and received unhindered.”
In plainer English: when you publish p=quarantine; pct=10, you're telling receivers “if a message from my domain fails DMARC alignment, quarantine 10% of them — and treat the other 90% as if my policy were p=none (just monitor and report).” The mechanism is sampling at the receiver. You don't choose which 10% — the receiver does, on a per-message basis.
A few details that get lost in the typical pct= explainer:
pct=only modifiesp=quarantineandp=reject. Atp=none, it has no meaningful effect — there's no policy to apply to a fraction of. Most receivers ignorepct=atp=nonegracefully; some validators flag it as a noop. Don't bother publishingpct=until you're atp=quarantineor higher.- The remainder gets the next-weakest disposition. RFC 7489 §6.6.4: at
p=reject; pct=10, 10% of failing mail is rejected and the other 90% is quarantined (not “treated asp=none”). Atp=quarantine; pct=10, 10% is quarantined and the other 90% is treated asp=none. This matters when you ramp from full quarantine to staged reject. - Receivers report what they actually did. Aggregate reports include both
policy_published(what you said) andpolicy_evaluated(what the receiver applied, including the sampling outcome and any local override). When you readrua=reports during a staged ramp, you'll see both — that's how you measure whether the sample is doing what you expect. - Default is
pct=100. If you don't specifypct=, the receiver applies the policy to 100% of failing mail.
The whole point of pct= is to give you a sampling lever. Used well, it lets you observe a small slice of enforcement consequences in production before they land on 100% of failing mail. Used badly — set once and forgotten, or moved up the ladder without checking the evidence — it's just a misleading way to publish enforcement.
The canonical ladder (10/25/50/75/100)
Almost every DMARC vendor recommends a different pct= ladder. We've seen 1/10/50/100, 5/25/75/100, 10/50/100, and “just go straight to 100.” None of them are wrong in any strict sense — but the rungs aren't equally useful, and the right ladder is the one whose rungs actually tell you something between steps.
Our canonical ladder is 10 → 25 → 50 → 75 → 100.
p=quarantine; pct=10 ↓ (≥7 days; alignment rate ≥ 99% on legitimate volume) p=quarantine; pct=25 ↓ p=quarantine; pct=50 ↓ p=quarantine; pct=75 ↓ p=quarantine; pct=100
Why each rung matters:
pct=10— enough sample to detect breakage, low enough customer impact. If a misaligned sender exists you haven't found yet, a 10% sample produces enough quarantined mail in your aggregate reports to surface it within a few days, and few enough to recover from without a customer complaint storm.pct=25— confirmation. The same evidence you collected at 10% should hold at 25%. If alignment rate drops between rungs, that's a signal something changed mid-ramp.pct=50— halfway gate. Half your failing volume is now being enforced. If you were going to discover a hidden sender via enforcement, you've discovered it by now.pct=75— approaching parity. The remaining 25% sampled-out is small enough that the difference frompct=100is mostly noise. A clean week here is the strongest pre-publish signal thatpct=100will be uneventful.pct=100— full quarantine. Every failing message is dispositioned by the receiver. If you're going to advance from quarantine to reject, this is the rung you hold at while the evidence accumulates.
The rungs aren't sacred — what's sacred is the gating between them. We use this specific ladder because it's the Microsoft / RFC-recommended primitive cited in spike #11 and because it's locked as the canonical UX across the DMARCit product surface and our customer-facing pages. If you cherry-pick a different ladder, fine — but commit to it, gate it on evidence, and don't skip rungs.
Diagram 1 (designer flag): “DMARC pct= ladder” — horizontal staircase with five rungs (10, 25, 50, 75, 100), each rung annotated with the dwell-time gate and the alignment-rate threshold to advance.
The alignment-rate gate (the differentiator)
Most DMARC tools let you flip pct= on a calendar. You set a reminder for “advance to 25% next Monday,” and when Monday rolls around the tool surfaces a button. The tool doesn't check whether the evidence supports the advance. That's a policy-toggle workflow.
The right approach is alignment-evidence-gated: advance only when alignment rate clears a threshold over a configurable lookback window. Same destination, different rigor. (This is the same framing locked across /enforcement-readiness and the /compare/mimecast page — consistency is the point.)
What “alignment rate” means in practice: the percentage of legitimate volume from your domain in the lookback window where SPF or DKIM passed and aligned with the From: header domain, divided by the total legitimate volume. A typical advance threshold is 99% or higher [VERIFY 7] over a 7-day lookback window [VERIFY 8]. (See /enforcement-readiness for the readiness-evaluator UX that surfaces this.)
A few things to internalize about alignment rate as a gate:
- It's not real-time. DMARC aggregate reports arrive on a daily cadence at best. Receivers batch across a 24-hour window, and delivery can lag another day. Anyone selling “real-time alignment-rate dashboards” is overstating the input data. The honest framing is at-best next-day evidence — a lookback over discrete daily data, not a live signal.
- It's measured on legitimate volume only. Including unauthorized volume (spoofing, sources you've classified as “ignore”) in the denominator pushes the rate down for reasons unrelated to readiness. The DMARCit readiness evaluator excludes flagged-unauthorized sources from the gate; if you're computing this manually, do the same.
- It accounts for
policy_evaluatedoverrides. If a receiver applied a local override (forwarded,mailing_list,local_policy,sampled_out) and didn't enforce, that's not a failure of your alignment. Strip overrides from the gate calculation, or you'll under-count alignment. - One bad day shouldn't reset the clock. A flaky DKIM key on Tuesday that got fixed Wednesday isn't a reason to back off, but it should pause the advance until the next clean lookback window.
Most “stuck at p=none” stories reduce to one of two failures: the ramp had no gate, or it had a tool that toggled policy on a calendar with no evidence check. The cure in both cases is the same — make the evidence visible at every rung, and only advance when it clears.
Worked example: 30-day staged rollout
Here's a defensible 30-day rollout plan, assuming you've already completed sender inventory at p=none and SPF is healthy. (If you haven't, read /learn/p-quarantine-vs-p-reject first, and fix /learn/spf-permerror before you touch enforcement.)
| Day | Action | What you check |
|---|---|---|
| Day 0 | Publish v=DMARC1; p=quarantine; pct=10; rua=mailto:agg@yourdomain.com (preserving any existing rua= / ruf= / sp=). | DNS poll confirms record landed. Validators clean. |
| Day 1-6 | Aggregate reports flow in. | First daily reports show ~10% of failing volume in policy_evaluated.disposition=quarantine; remainder shows disposition=none. No spike in customer support tickets. |
| Day 7 | Review week-1 evidence. If alignment rate ≥ 99% on legitimate volume over the 7-day lookback, advance to pct=25. | New record published. DNS poll confirms. Note any new sources that appeared during the week and classify them. |
| Day 8-13 | Continued reports at 25% sampling. | Alignment rate holds. No new unclassified sources of meaningful volume. |
| Day 14 | Advance to pct=50. | Half your failing volume is now quarantined. This is the rung where hidden senders typically surface; expect to find one or two. |
| Day 15-20 | Reports flow. | If alignment rate dipped, don't advance — drop back to the previous rung, classify the source that broke, fix it, then re-advance. |
| Day 21 | If clean, advance to pct=75. | Approaching parity; the gap from pct=100 is small. |
| Day 22-27 | Reports flow. | The week-3 reports should look almost identical to what pct=100 will look like. |
| Day 28 | Advance to pct=100. Hold here. | Every failing message is now quarantined. |
| Day 28-34 | Monitor for 7 days at full quarantine. | Same gates as before — alignment rate ≥ 99% over the rolling 7-day window. |
| Day 35 | If 7 days at full quarantine were clean, change p=quarantine to p=reject (consider entering reject staged at pct=10 rather than going straight to full reject — same ladder logic applies). | DNS poll confirms. Bounces start appearing for spoofed traffic; legitimate mail unaffected. |
That's the optimistic case. Real rollouts often pause for two to four weeks at one of the rungs while a misaligned sender gets fixed, or while a stakeholder team negotiates with a vendor whose DKIM signing is broken. A 30-day rollout that takes 60 days because you held at pct=50 for three weeks is a successful rollout. A 14-day rollout that finished on time but rolled back two weeks later because the gate was wrong is a failed rollout dressed in the costume of a fast one.
Diagram 2 (designer flag): “30-day rollout calendar” — horizontal timeline with the seven advance points (Day 0, 7, 14, 21, 28, 35) and the daily-report cadence underneath, showing where the gate is checked and where pauses commonly happen.
When to pause and back off
The whole point of staged rollout is that you can stop and reverse. Failure modes that justify pausing or backing off:
- Alignment rate drops mid-ramp. A previously-aligned sender broke — an ESP rotated DKIM keys without telling you, marketing migrated a vendor over the weekend, an internal flow got rerouted through a forwarder. Aggregate reports will show the drop within 24-48 hours. Back-off action: revert
pct=to the previous rung (orpct=0to disable enforcement entirely if the breakage is severe), publish, confirm via DNS poll, then investigate. - A new sender appeared and isn't yet aligned. Sometime between rungs, a new sending source showed up — usually a vendor someone signed up for without telling IT. Hold at the current rung. Don't advance until the new source is either aligned or explicitly classified.
- Quarantine bounce-back complaints. A customer or internal user reports a legitimate email landed in spam. Shouldn't happen if your alignment rate is genuinely above 99%, but the long tail is real. More than a couple per week: drop back a rung and investigate.
- Aggregate reports stop arriving. If
rua=mail stops, you've lost the gate. Fix the report flow before you advance.
The back-off sequence is the same in every case: revert the pct= value, confirm via DNS, investigate, fix or classify, then re-advance from where you were (not from pct=10 — you don't lose all your evidence by backing off one rung).
Revert isn't free. DNS caching and report delays mean the revert doesn't take effect instantly at all receivers. Plan on a 24-48 hour window. If the breakage needs to be gone now, that's an argument for pct=0 or a temporary p=none republish — not a reason to skip the revert.
The DMARCit approach
Most DMARC tools treat the pct= ladder as a calendar event: pick a date, click a button, the record updates. That's a policy-toggle workflow. We think it's the wrong shape — the ladder isn't the hard part, the gate is.
DMARCit's enforcement-readiness flow is alignment-evidence-gated, not policy-toggle. The product surface tracks each sending source on your domain, lets you mark it legitimate, unauthorized, forwarded, or needs-review, computes alignment rate over a configurable lookback window with overrides excluded, and gates the advance CTA on the rate clearing the threshold for the configured dwell time. The CTA isn't “advance to pct=25 because Monday.” It's “alignment rate is 99.4% over the last 7 days; advance to pct=25 is unblocked” — or, more often, “alignment rate dipped to 97.8% on Tuesday; advance is blocked, here's the source that broke.”
We don't auto-write your DNS. The tool generates the new TXT record value for you to apply yourself, with the rollback value pre-computed and visible alongside it. Existing rua=, ruf=, and sp= tags are preserved in the diff (losing them is a customer incident, and we won't risk it). After you publish, we poll DNS to confirm the change landed and warn about the report-lag window before you check the next gate.
We automate the mechanics. You still own the call to advance. That's the honest framing — alignment-evidence-gated isn't enforcement-by-autopilot. It's a tool that surfaces the evidence and the rollback in the same place as the advance CTA, so the decision is informed.
For the full guided walkthrough — the staged-quarantine UX with source-marking and the pct ladder integrated with alignment-rate evidence at each step — see /enforcement-readiness. For pricing, /pricing.
Common pct= pitfalls
The most common mistakes we see:
- Setting
pct=atp=none. No meaningful effect — receivers ignore it gracefully and validators flag it as a noop. Drop thepct=tag while you're atp=none; only add it once you're publishingp=quarantineor higher. - Advancing too fast. Skipping the alignment-rate gate is the version of “moving fast” that ends in a customer-incident retrospective. If you advance on a calendar and not on evidence, you've published the rung but not earned it.
- Forgetting to advance. The operator publishes
p=quarantine; pct=10to satisfy an auditor and then never moves it. Six months later the record still sayspct=10and 90% of failing mail is being treated asp=none. That's not enforcement; that's enforcement cosplay. Set a calendar reminder plus an evidence gate. - Interaction with subdomain policies.
pct=applies to the org-domain policy. The subdomain's effective policy is whateversp=says (orp=ifsp=is absent). If you want staged rollout for subdomains, think about it explicitly. (See/learn/dmarc-subdomain-sp-tag(coming soon).) - Misunderstanding what the receiver does with the remainder. At
p=reject; pct=10, the 90% sampled-out is quarantined, not treated asp=none. RFC 7489 §6.6.4 has the receipt. - Treating
pct=as a long-term posture. It's a ramp, not a destination. Holding atpct=50indefinitely means the gate isn't being checked or it's broken. Either advance to 100 or back off to a defensible rung.
The path from pct=100 to p=reject
p=quarantine; pct=100 is not the same as p=reject. Quarantine sends failing mail to spam; reject bounces it. The mail still gets to the recipient at quarantine — it might rot in junk, but a determined human can rescue it. At reject, the mail is gone, and the only artifact is a bounce notification at the sender.
The path from pct=100 quarantine to p=reject looks like:
- Hold at
p=quarantine; pct=100for at least the configured lookback window (typically 7-14 days). Alignment rate ≥ 99% on legitimate volume, no new unclassified sources, no overrides driving the rate down. - Publish
p=reject; pct=10(preserving all other tags). DNS poll confirms. - Walk the same ladder you walked for quarantine: 10 → 25 → 50 → 75 → 100, gated on the same alignment-rate evidence.
- At
p=reject; pct=100, you're done. Maintenance mode is monitoringrua=for drift and watching for new senders that need to be aligned or classified.
For the full quarantine-vs-reject framing — when reject is the right end-state and when quarantine forever is fine — see /learn/p-quarantine-vs-p-reject. The short version: if you're a phishing target, a bulk sender meeting Gmail/Yahoo 2024 requirements, or under a regulatory regime that names p=reject explicitly, finish the ladder. Otherwise, p=quarantine; pct=100 is a defensible end-state for many domains.
What to do next
If you're planning a staged DMARC rollout:
- Check that your SPF is healthy (no
permerror, notemperror, lookup count well under 10). Run a free SPF check before you publish enforcement. - Confirm you have at least 30 days of
rua=aggregate reports and a complete sender inventory. (See/learn/dmarc-monitoringfor the signal set.) - Read
/learn/p-quarantine-vs-p-rejectfor the policy-value framing if you haven't. - Publish
p=quarantine; pct=10. Walk the canonical 10 → 25 → 50 → 75 → 100 ladder, gated on alignment rate ≥ 99% over a 7-day lookback. - Hold at
p=quarantine; pct=100for at least the configured lookback window before consideringp=reject.
Check your DMARC posture in 60 seconds
Free DMARC checker pulls your current record, identifies every sending source, computes alignment rate, and tells you which rung of the pct= ladder is the right next move. Want a guided walkthrough of the rollout? Most calls take 30 minutes and end with a concrete advance plan and the rollback values pre-computed. You can also book a demo.
Related reading
Learn more
- Enforcement Readiness — Staged Quarantine for DMARC — the LP that surfaces the alignment-evidence-gated ramp
- DMARCit vs the DMARC tool category — and the four head-to-heads (EasyDMARC, dmarcian, PowerDMARC, Mimecast)
- DMARCit pricing