Blog · Dmarc
What Happens When Your Own DMARC Monitoring Fails to Catch a Subdomain SPF Gap
The hook
A practitioner who writes DMARC guides for a living recently posted that their own subdomain silently rejected legitimate mail because of a missing SPF record. They found it through their own monitoring. That is the point.
This is not a story about someone who ignores DMARC. This is a story about someone who understands it deeply, set it up correctly for their root domain, and still ended up with a subdomain silently black-holing mail the moment p=reject went live.
If you manage subdomains that send mail, this is for you.
What actually happened
The root domain had full SPF, DKIM, and DMARC with p=reject configured. Everything looked correct. The problem was a subdomain - say, newsletter.example.com - that had its own sending infrastructure but no SPF record of its own.
When a message comes from newsletter.example.com and that subdomain has no SPF record, the receiver falls back to the domain's SPF policy. If that policy does not cover the IP the subdomain actually sends from - which is common when the subdomain uses a separate email service or marketing platform - the message fails SPF.
With p=none, a failed SPF check is just a soft signal. With p=reject, it becomes a silent rejection. No bounce back to the sender. The mail just disappears.
This is exactly what happened to the practitioner in question. The irony is real, but the failure mode is entirely predictable once you understand how subdomain SPF interacts with DMARC alignment.
Why this is especially insidious
The worst part is that there is no warning. The sending system gets no rejection notification because the failure happens at the receiver side. The mail is submitted correctly, transferred correctly, and then silently discarded by the destination server that cannot authenticate the subdomain.
This is different from a hard bounce where the domain does not exist or the MX is misconfigured. The domain exists, the MX resolves, the message arrives at the server - and then the DMARC alignment check fails because the subdomain's SPF does not cover the sending IP, and the receiver drops it.
For the team on the receiving end, it looks like the sender just stopped communicating. For the sender, it looks like the receiver stopped accepting mail. Neither side sees the actual failure without DMARC aggregate reports or detailed server logs.
Who is at risk
Any organization with subdomains that send mail separately from the root domain. This includes:
- Marketing automation platforms sending from
marketing.example.com - Product notification systems sending from
notifications.example.com - Internal tools sending from
tools.example.comorsupport.example.com - Legacy systems that were set up before DMARC was on the radar
The common pattern is that each subdomain evolved independently, often with its own sending infrastructure, its own DNS configuration, and its own team responsible for it. None of those teams knew they needed to check whether their subdomain's SPF record covered the IPs their system actually sends from.
The practitioners most likely to run into this are those who set up DMARC carefully for the root domain, get p=reject working, and then move on - without auditing the subdomain sending landscape that developed over years.
The pre-flight checklist before enabling p=reject
Before you move any domain to p=reject, run through this:
- Audit every subdomain that sends mail. Not just the domains in your DMARC record - every subdomain that has an MX record or that you know sends automated mail.
- For each subdomain, check whether it has its own SPF record. If it does not, find out which IPs it sends from and add them to an SPF record for that subdomain.
- Check DKIM as well. Does each subdomain have its own DKIM key pair published under its own selector, or is it relying on the root domain's DKIM? If it relies on the root domain's DKIM, does the alignment actually work for that subdomain?
- Run a DMARC aggregate report before enabling reject. Look specifically at subdomain sources that appear in the reports and whether their authentication results are consistent.
- Set up monitoring that alerts you when a subdomain's authentication status changes - not just when the root domain's status changes.
Step 5 is where most teams fail. They check the root domain and forget that subdomains are separate sending contexts with separate authentication requirements. Without automated subdomain monitoring, this is a manual audit that gets skipped after the initial setup.
How automated monitoring makes the difference
Manual review misses this because it requires checking every subdomain individually, and the failure only becomes visible when p=reject is actually enabled. By then, mail is already being lost.
Tools like DMARCFlow automatically track authentication results per subdomain, alerting you when a subdomain that sends mail has a missing or misconfigured SPF record - before that gap becomes a mail-breaking problem. The key difference is that DMARCFlow monitors subdomain sources continuously, not just at the point when you are setting up the root domain for the first time.
This is the practical difference between checking your DMARC report once a month and continuous monitoring: one lets a configuration gap go undetected until mail starts bouncing, the other catches it during routine operation before it causes real-world failures.
The expert in this case was monitoring their own setup - which is more than most practitioners do. But the blind spot was specifically in the subdomain authentication status, which their monitoring was not designed to track separately from the root domain. Even with self-monitoring, that gap in coverage is what allowed the failure to happen silently.
If you are relying on your own monitoring, ask yourself whether it tracks subdomain-level authentication separately and alerts you when a subdomain's SPF or DKIM status changes. If it does not, the answer is probably that you have the same blind spot.
If you already have this gap
If you read this and realize your subdomains might be affected, the fix is straightforward:
- Identify every subdomain that sends mail but has no SPF record.
- Determine which IPs or sending services each subdomain uses.
- Add an SPF record for each subdomain that covers exactly those IPs.
- Test by sending a message from each subdomain to a test account you control and checking the authentication headers.
- Re-enable or continue at p=reject if you had disabled it.
The window where mail was silently lost is unfortunate, but fixing the record now means future mail is protected. If you have any evidence of mail that should have been delivered during the silent failure period - particularly if it includes transactional or notification emails - now is the time to audit those flows and confirm they are working.
The takeaway
The irony of a DMARC expert getting caught by their own monitoring is funny in the way that watching a skilled carpenter stub their toe on the sawhorse is funny. It does not mean the person is bad at their job. It means the tool they relied on had a blind spot they did not know to check.
The blind spot in this case is not exotic. It is the gap between what your root domain DMARC record says and what your subdomains are actually doing with SPF and DKIM.
If you manage DMARC at scale, either you have automated subdomain monitoring, or you have a blind spot. There is no third option.
---
FAQ
How does p=reject cause subdomain mail to fail silently?
When p=reject is set and a subdomain sends mail from an IP not covered by an SPF record, the receiver rejects the message with a 550 SMTP response. However, if the sending system does not receive a DSN (delivery status notification) - which depends on how the sending system is configured - the failure can appear silent to the sending organization. The mail is rejected at the receiver side without the sender being notified unless they are actively monitoring their aggregate reports.
How do I check if my subdomains have their own SPF records?
Use a DNS lookup tool to query the subdomain directly. For example: dig TXT subdomain.example.com or nslookup -type=TXT subdomain.example.com. If the subdomain has an SPF record, it will be returned as a TXT record beginning with v=spf1. If the query returns no SPF record, the subdomain is relying on the root domain's SPF policy or has no SPF policy at all.
What is the minimum pre-flight checklist before moving to p=reject?
At minimum: audit every subdomain that sends mail, confirm each has its own SPF record covering its actual sending IPs, confirm each has DKIM alignment if DKIM is in use, and review a recent DMARC aggregate report specifically for subdomain sources. Set up alerts for authentication changes on all subdomain sources before enabling reject.
Can a subdomain inherit the root domain SPF record automatically?
No. SPF records are not inherited across levels of a domain. A subdomain must have its own SPF record or it has no SPF policy. Some hosting and SaaS providers publish SPF records on behalf of their customers, but this must be configured explicitly - it does not happen automatically when you set SPF on the root domain.