Blog · Dmarc
How to Move Your DMARC Policy from p=none to p=reject Without Breaking Email
Moving to p=reject is the right goal. Doing it without visibility is how you end up banning a legitimate SaaS tool your entire marketing team depends on, finding out through a support ticket at 9am on a Monday.
DMARCFlow helps here: it parses aggregate reports automatically, flags unknown senders as they appear, and tracks your failure rate through the tune phase so you know exactly when you are ready to enforce. Without a tool doing this work, the discovery phase takes weeks longer than it should.
Most organizations know they should move to p=reject. Most are afraid to, because they have no idea what will break. The answer is not to wait. The answer is to look first.
This guide covers the three-phase migration method: monitor, tune, enforce. It explains what aggregate reports actually tell you, what breaks first when you enforce, and how to do it in a way that does not require an all-hands incident.
Why p=reject Is the Right Destination
DMARC policies work in three levels. p=none tells receiving servers to accept everything and report failures. p=quarantine tells them to treat failing mail as suspicious. p=reject tells them to refuse failing mail outright.
p=reject is the only level that fully protects your domain from spoofing. If someone sends mail pretending to be from your domain, p=none and p=quarantine let that mail through. p=reject stops it. The security value of DMARC only activates at p=reject.
Staying at p=none indefinitely is not a safe default. It is a risk decision made by default, not by design. Attackers know which domains are at p=none, and they use that information.
The genuine risk is not the policy level. The risk is moving without knowing what is actually sending on your behalf.
What You Need Before You Move: The Third-Party Sender Inventory
The reason most p=none to p=reject migrations break is that organizations do not know who is sending mail for their domain.
Every legitimate email comes from a sender with an IP address. That IP address must be authorized in your SPF record and must sign outbound mail with DKIM. If it does neither, your DMARC policy will reject it.
The gap most organizations discover is this: they have SaaS tools, marketing platforms, subsidiary companies, automated systems, and legacy services sending on their domain. Some of these are authorized in SPF. Many are not. The only way to find out is through aggregate reports.
Aggregate reports are XML files your domain receives from participating mail receivers. They tell you every IP address that has sent mail purporting to be from your domain in the reporting period, whether that mail passed or failed authentication, and why. They are the only complete picture of your sending landscape.
The most important number in an aggregate report is not the pass rate. It is the number of unique sending IP addresses you did not know about.
If you do not know how many IPs are sending for your domain, you are not ready to enforce. No exceptions.
Most organizations need at least four weeks of aggregate report data before they have a complete picture. Anything shorter risks missing senders that only operate during specific periods, such as quarterly newsletter sends or annual survey tools.
Phase 1: Monitor with p=none and Aggregate Reports
The first phase is observation. Keep p=none, collect aggregate reports, and build your sending inventory.
During this phase you want to answer three questions for every sending IP in your reports:
- Is this IP authorized to send for my domain?
- Does it pass SPF on my domain?
- Does it pass DKIM alignment on my domain?
An IP passes DMARC when it satisfies either SPF or DKIM alignment. An IP fails DMARC when it satisfies neither. The goal before you enforce is to have zero IPs that satisfy neither.
As you go through your reports, categorize every IP into one of three groups:
Group 1: Known and authorized. These are IPs you control or have explicitly authorized. If they are failing, fix them.
Group 2: Unknown but legitimate. These are third-party services you use that are not yet authorized in your SPF or DKIM. Add them.
Group 3: Unknown and suspicious. These are IPs sending for your domain that you cannot identify. Investigate before enforcing.
Do not move to p=reject until groups 2 and 3 are both empty for at least two consecutive reporting periods.
Phase 2: Tune -- Finding and Fixing Failures Before They Become Breakage
A properly tuned pre-migration environment has zero authentication failures from known legitimate senders. This is the phase where that happens.
The most common failure patterns are not configuration errors. They are gaps in authorization:
SaaS platforms sending through their own infrastructure with a From address that uses your domain but a Return-Path that uses theirs. The fix is usually adding the platform's sending IPs to your SPF record, if they support it, or routing their mail through a relay that preserves your DKIM signature.
Forwarding services that break DKIM alignment. When a message is forwarded, the forwarding service sometimes modifies headers in a way that invalidates the DKIM signature. The forwarded message then fails DMARC at the final destination. This is a known limitation of DKIM and a reason some organizations use subdomain-level policies for forwarding-heavy addresses.
Subsidiary companies and sister domains using different mail infrastructure. These often send from their own IPs with their own DKIM keys, which will not align with your domain's DMARC policy. Either they need to configure their mail systems for domain alignment, or you need to exclude their mail from your policy using "rua" and "p" flags correctly.
Multi-tenant platforms where many customers send from shared IPs. This is the Proofpoint problem in another form. A shared Return-Path means DMARC alignment will fail for messages that pass through these platforms.
The tune phase is not complete when you think you have fixed the failures. It is complete when your aggregate reports show zero failures from groups 2 and 3 for two consecutive weeks.
One additional check: set up alerting for when your aggregate reports show a sudden increase in failures. A new vendor, a configuration change, or a platform migration can introduce failures at any time. You want to know within hours, not two weeks.
Phase 3: Enforce -- Switching to p=reject Safely
When your aggregate reports are clean, you are ready to change the policy.
This is the step most organizations treat as a leap. It does not have to be.
Before you change anything, decide on your rollback plan. If you switch p=none to p=reject and start seeing rejection bursts from a legitimate sender you missed, you need to be able to revert quickly. Document the change. Document how to undo it. Have someone on call who knows what to look for.
Switch the policy. Set it during business hours, not at 11pm on a Friday. Watch your inbox for rejection reports and support tickets for the first 48 hours.
Watch for a specific pattern: a sudden appearance of rejection reports from a specific domain or IP you had not seen before. This usually means you missed a legitimate sender during the tune phase. The correct response is to roll back to p=none, add the missing sender to your authorization, and wait another two-week clean period before trying again.
Do not stay at p=reject and try to fix it in place. The cost of a rollback is lower than the cost of an extended mail outage from a legitimate sender.
A note on percentage: pct=100 in your DMARC record means 100% of failing messages are rejected. You can start with pct=25 or pct=50 to limit the blast radius while you confirm everything is working. This is a valid approach for large, complex sending environments. For most organizations, going straight to 100% is fine if the tune phase was thorough.
What Breaks First: Common Failure Patterns and How to Fix Them
Based on patterns seen across real DMARC migrations, certain categories of senders break most frequently:
Marketing automation platforms such as HubSpot, Marketo, and Mailchimp often send from their own infrastructure. If you use a custom From domain with these tools, you need to either add their sending IPs to SPF or configure them to send through your authenticated relay.
Legacy ERP and HR systems that send password resets, payslips, or notifications often have no DKIM configuration at all. These rely entirely on SPF. If they are failing DMARC, the fix is usually adding their relay server to your SPF record.
Monitoring and alerting tools that send from generic cloud IPs. Datadog, PagerDuty, and similar tools sometimes send from IPs not associated with your domain. Configure them to send through your mail infrastructure instead of directly.
Acquired companies still on their old infrastructure. Post-merger, it is common to have subsidiaries sending from their own domains while the parent company's DMARC policy is applied to all subdomains. These need domain alignment configuration or a separate subdomain policy.
Each of these cases has a specific fix. The fix is only discoverable if you have aggregate report data showing which IP is failing and why.
How DMARCFlow Makes Each Phase Faster
Aggregate reports are genuinely difficult to work with manually. They arrive as compressed XML attachments in your inbox. They do not normalize easily across different mail receivers. A 30-day dataset from a moderately active domain can contain thousands of rows.
Most organizations that try to do the tune phase manually either miss senders or give up halfway through. The tune phase requires cross-referencing sending IPs against known services, tracking failure trends over time, and catching new senders as they appear.
This is where dedicated tooling helps. DMARCFlow parses aggregate reports automatically, normalizes failure data across reporting periods, and alerts you when new IPs appear that are not yet authorized. It tracks the tune phase progress by showing which senders have been authorized and which are still failing. During the enforce phase, it flags rejection spikes within hours rather than waiting for a support ticket.
The alternative is spreadsheet-based tracking with manual XML parsing. At small scale it works. At any real volume, it does not.
Are You Ready? A Pre-Migration Checklist
Before you change p=none to p=reject, confirm the following:
Your current DMARC record is p=none with an rua=mailto:aggregate@yourdomain.com reporting address. If you do not have aggregate reports being collected, stop here.
You have at least 30 days of aggregate report data. Anything less than four weeks will miss monthly senders.
All IPs in your aggregate reports are categorized: known and authorized, unknown but legitimate, or unknown and under investigation. No uninvestigated IPs remain.
All known legitimate senders pass either SPF or DKIM alignment. You have a record of what was fixed during the tune phase.
You have tested rollback. You know exactly what command changes your policy back to p=none, and you have tested it in a non-production context.
Someone is watching for new senders. If a new SaaS tool is added next month without proper authentication, it will fail p=reject immediately.
If all six checkboxes pass, you are ready. If they do not, stay at p=none and keep monitoring. The cost of an extra month of observation is lower than the cost of a mail outage that affects your customers.
One thing most DMARC migration guides do not say plainly: p=none does not protect you. It watches. It reports. It does nothing about domains that fail authentication. Every month you stay at p=none is a month your domain is spoofable and receiving servers have no instruction to refuse spoofed mail.
FAQ
What is the minimum time to safely move from p=none to p=reject?
Four weeks of aggregate report data at minimum. Eight weeks is safer. If your sending environment is complex, plan for three months. The tune phase cannot be rushed without risking missed senders.
Can I skip p=quarantine and go straight to p=reject?
Yes. p=quarantine provides minimal additional protection compared to p=none and introduces the same discovery problems as p=reject without the full rejection protection. Most organizations go straight to p=reject when they are ready.
What does p=reject actually reject?
It rejects mail that fails both SPF and DKIM alignment. Mail that passes either SPF or DKIM alignment passes DMARC and is delivered normally. The most common mistake is assuming p=reject rejects all unauthenticated mail. It only rejects mail that fails both checks.
What happens if I switch and something breaks immediately?
Roll back to p=none immediately. The longer you stay at p=reject while a legitimate sender is failing, the more mail that sender's recipients will not receive. Revert, fix the sender, wait two clean weeks, and try again.
Can I use a subdomain policy instead of the root domain policy?
Yes. A subdomain policy of p=reject while the root domain remains at p=none is a valid approach for organizations with complex sending environments. It lets you enforce on subdomains you control while leaving flexibility for subdomains that have not yet been audited.
How do I know if a failure in my aggregate report is from a legitimate sender or from spoofing?
Authenticated senders appear in aggregate reports with consistent patterns: the same IPs sending regularly, aligned with known services. Spoofing attempts tend to appear in bursts from IPs that do not match any of your known infrastructure. Consistent monitoring over time makes this distinction clear.
---BODY_LEN=14288---