Back to blog
Threat Intel
Phishing Forensics

The DMARC 'pct' Tag Playbook: Ramping to p=reject Without Breaking Email

The 'pct' tag is your safety valve for a DMARC enforcement rollout, letting you test your policy on a small slice of traffic before going all-in.

MailSleuth Research
Email Security Team
June 13, 20268 min read
Illustration of a hand slowly turning a valve on a data pipe, symbolizing a gradual DMARC rollout from 0% to 100%.

Every security engineer knows the feeling. Your finger hovers over the 'save' button for your domain's DNS zone. You've typed it out: `v=DMARC1; p=reject`. You're about to tell the entire internet to drop any email that fails authentication for your domain. But what if you missed something? What if the new CRM's welcome emails aren't DKIM-aligned yet? You could be silently dropping legitimate mail, and you won't know until the VPoS is on a hot-mic call asking why new leads aren't getting their confirmations.

This is the exact scenario the `pct` tag was designed to prevent. It's the most critical, yet often misunderstood, component of a responsible DMARC deployment. It's not a suggestion to receiving mail servers; it's a statistical instruction defined in RFC 7489.

Using the `pct` tag transforms a high-stakes, binary decision into a controlled, incremental process. It allows you to gather real-world data on the impact of a `p=quarantine` or `p=reject` policy while affecting only a small, manageable percentage of your mail flow. This isn't just theory; it's the professional way to de-risk a project with zero tolerance for error.

Your First Move: Establish Ground Truth with p=none

Before you can enforce anything, you must first listen. The initial phase of any DMARC project is purely about reconnaissance. You need a complete inventory of every service and server that sends email on your domain's behalf. Setting your policy to `p=none` turns DMARC into a global reporting tool without affecting mail delivery in any way.

Deploying Your Listening Post

Your first DMARC record should be as simple as possible. It specifies the DMARC version, sets the policy to do nothing, and provides an address to send aggregate (RUA) reports to. This is the cornerstone of your entire operation.

v=DMARC1; p=none; rua=mailto:dmarc-rua@yourcompany.com;

This TXT record, published at `_dmarc.yourcompany.com`, tells receiving mail servers, 'Check SPF and DKIM for my domain, but take no action on failures. Just send me a daily XML report summarizing what you saw.' These RUA reports are the raw intelligence you'll use to map out your entire email ecosystem.

Interpreting RUA Reports

After a few days, your `rua` mailbox will start filling up with gzipped XML files from providers like Google, Microsoft, and Yahoo. These reports are machine-readable but brutal on the eyes. Inside, you're looking for a few key things: the source IP addresses sending mail, the number of messages, and the `policy_evaluated` section, which shows the SPF and DKIM results and alignment. Your job is to sort these senders into three buckets: fully-aligned legitimate senders, legitimate senders that are failing authentication, and fraudulent senders. Let this record 'bake' for at least two weeks to ensure you capture weekly and monthly automated reports from your business applications.

The Ramp-Up: A Week-by-Week 'pct' Playbook

Once you have a baseline from your `p=none` reports and have fixed the obvious SPF and DKIM alignment issues for your known senders, it's time to start applying pressure. We'll start with `p=quarantine`, which tells receivers to send failing messages to the spam folder. It's a much safer starting point than `p=reject`.

The Quarantine Schedule

The progression is simple. You slowly increase the percentage of failing mail that gets quarantined. At each stage, you watch your RUA reports and internal help desk tickets for signs of trouble. A typical schedule looks like this:

Weeks 1-2: `v=DMARC1; p=quarantine; pct=5; rua=...` The goal here is to dip a toe in the water. With only 5% of failing mail being affected, the chance of a widespread outage is minimal. You're looking for any indication that a legitimate, high-volume sender was missed in your initial audit. In the RUA reports, you'll now see `<disposition>quarantine</disposition>` for a small number of messages.

Week 3: `...pct=25;...` Now you're gathering a more statistically significant data set. If your legitimate mail streams are clean, you shouldn't see any increase in user complaints. If you do, it's time to pause, identify the source, fix its alignment, and possibly drop back to a lower `pct`.

Week 4: `...pct=50;...` This is a major milestone. Half of all non-aligned mail is now being sent to spam. At this point, you should be very confident in your list of legitimate senders.

Week 5-6: `...pct=100;...` You've now fully deployed a quarantine policy. Let this run for at least a week, preferably two, to confirm stability. All unauthenticated mail is being junked, which significantly reduces the phishing threat to your partners and customers.

Where Gradual Rollouts Go Sideways

Even with a careful, percentage-based rollout, things can go wrong. The DMARC standard (RFC 7489) is precise, but the real world of email is messy. Two areas are notorious for causing problems: indirect mailflows and implementation variance.

The Forwarding and Mailing List Nightmare

The classic failure mode is an email forwarder or a mailing list. Imagine a partner sends an invoice to `accounting@yourcompany.com`, which automatically forwards to your external accounting firm. The forwarding server is not in your domain's SPF record, so SPF fails. If the forwarder adds a `[EXTERNAL]` tag to the subject or a footer to the body, the DKIM signature from the original sender will break. Both checks fail, DMARC fails, and with a `p=quarantine` policy, that invoice goes straight to junk.

Authenticated Received Chain (ARC), defined in RFC 8617, was created to solve this. ARC-aware forwarders add a new set of headers (`ARC-Authentication-Results`, `ARC-Message-Signature`, `ARC-Seal`) that cryptographically seal the original authentication results. When the email arrives at its final destination, the receiver can validate the ARC chain and 'trust' the original `pass` verdict, even if the final hop failed SPF and DKIM. ARC adoption is growing, but it's not universal. You will still find failing mail from legacy forwarders.

How Receivers Interpret 'pct'

The `pct` tag is applied probabilistically by each receiving server. A `pct=5` setting doesn't mean a central counter somewhere allows 5 out of every 100 emails through. It means each individual receiving MTA, upon seeing a DMARC-failing message, will generate a random number and apply the policy 5% of the time. For major receivers like Google Workspace and Microsoft 365, this works as expected. But you can't assume every mail provider on the planet implements it perfectly. This is another reason the slow, measured ramp-up is so important—it insulates you from edge-case interpretations by minor players.

The Final Push: Graduating to p=reject

Moving from `p=quarantine` to `p=reject` is the final step in locking down your domain against direct spoofing. The operational difference is massive: mail sent to spam can be recovered; rejected mail is dropped by the receiving server and disappears. It never hits a mailbox. The stakes are as high as they get, so we apply the same `pct` methodology.

After running `p=quarantine; pct=100` for a few weeks with no negative reports, you have the evidence needed to proceed. The process mirrors the quarantine ramp-up, just with a stricter policy.

The Reject Schedule

Start small. Even a tiny percentage of rejection gives you invaluable data.

1. Set your record to `v=DMARC1; p=reject; pct=5; rua=...`. Monitor RUA reports closely. You're now looking for `<disposition>reject</disposition>` entries. Are any of them associated with IPs or senders you recognize? If so, you have a misconfiguration to fix.

2. Incrementally increase the percentage over several weeks: `pct=10`, `pct=25`, `pct=50`. Be even more cautious than you were with quarantine. The feedback loop for rejected mail is worse. Users won't find a missing email in their spam folder; they'll just report that they never received it. This requires more proactive monitoring on your part.

3. Finally, move to `v=DMARC1; p=reject; pct=100; rua=...`. This is the gold standard for domain protection against exact-domain spoofing, the kind used in Business Email Compromise (BEC) attacks. With this policy, you've made it exponentially harder for an attacker to impersonate your domain to your employees, customers, and partners.

Final Syntax and Policy Sanity Checks

Before you publish any DMARC record, especially one with `p=reject`, use a free online DMARC record checker. These tools perform a DNS lookup, parse your record, and flag syntax errors. A simple typo, like using a colon instead of a semicolon, can invalidate your entire policy, leaving you unprotected. This two-second check can save you from a major incident.

The takeaway

The `pct` tag is the single most important tool for executing a DMARC gradual rollout. It converts what could be a career-limiting outage into a controlled, evidence-driven process. By starting at `p=none` to gather intelligence, moving to a phased `p=quarantine` rollout, and finally advancing to `p=reject` with the same incremental discipline, you can achieve maximum email security without breaking critical business communications.

But remember, DMARC is not a 'set and forget' protocol. Your email ecosystem will change as new marketing platforms are adopted and old services are retired. Your RUA reports are the continuous feedback loop that tells you when your authentication posture has drifted. Aggregating and parsing millions of lines of XML from RUA reports is a job for machines. Whether you build your own tooling or use a platform like MailSleuth.AI, you need a clear dashboard to turn that raw data into actionable intelligence.

#dmarc#email-security#spf#dkim#rua-reports#bec-prevention
MailSleuth Research
Email Security Team

We dissect phishing campaigns and email infrastructure so you don't have to.