DMARC · Subdomains · Policy
Sending subdomains: your root policy has two deputies you've never met
Your organisational domain is the identity; subdomains are staff badges issued in its name. DMARC's root record carries standing orders for badges you never explicitly configured — and, since the current specification, even for badges that don't exist. Most owners have set sp/np by accident: by leaving them blank.
The worked example (memorize this table)
Root record: v=DMARC1; p=reject; sp=quarantine; np=reject
| Mail claims to be from | Governing policy | Why |
|---|---|---|
example.com (the root) | reject | p — the root's own door |
shop.example.com — exists, no own record, auth fails | quarantine | sp — the existing-subdomain deputy |
ghost.example.com — never created (NXDOMAIN), auth fails | reject | np — the ghost deputy (9989-era receivers; a 7489-era receiver ignores np and lands on sp=quarantine — dialects differ, one reason np is a seatbelt not a wall) |
billing.example.com — published its OWN _dmarc with p=none | none | Its own record overrides the root entirely — and its reports go to its rua. Your root reports just went blind to it |
Any of them, with only p=reject at the root | reject everywhere | Blank sp/np inherit p — the “accidental fortress” many domains already live in |
Why the ESPs insisted (the honest three reasons)
- Delegation mechanics: the envelope/return-path must live somewhere the ESP can publish records under your authority — a subdomain you delegate by CNAME (SendGrid's
em…, Article #31; SES's MAIL FROM, Article #32). DKIM-only variants (Mailchimp, Article #15) authenticate a subdomain's signature so DMARC passes on the DKIM leg. - Containment: a marketing blow-up (or a compromised ESP account) stains a subdomain's reputation and can be retired — you can't retire your root.
- NOT volume dilution: the claim “Google recommends separate subdomains in its sender guidelines” is false as stated — our research full-text-searched Gmail's sender guidelines: zero occurrences of “subdomain.” Gmail counts volume at the primary domain (root + subdomain volumes sum; bulk status, once earned, is permanent). Google's separation advice lives in its App Engine bulk-mail documentation and says “different domains for each function.” Credit the right document or don't credit Google.
Three postures — choose one on purpose
| Posture | Shape | Suits |
|---|---|---|
| Unified | One root record; sp/np blank (inherit p); no subdomain records | Most small businesses. Simple, consistent, reports all in one place. The accidental-fortress effect is a feature once senders are inventoried |
| Split | Key sending subdomains publish their OWN records (own policies, own rua) | Distinct business units/streams with separate owners. Cost: report fragmentation — assign each stream's reports an owner or they go unread |
| Fortress | Root p=reject + explicit sp=reject (+ np=reject for 9989 receivers) | After a complete subdomain sender inventory from aggregate reports. Publishing sp=reject BEFORE the inventory is how legitimate subdomain senders (your invoicing tool, your helpdesk) get rejected by your own policy — a failure mode common enough we name it in-house: the self-inflicted subdomain outage |
The risk that reframes all of this
The specification's own security section (§11.8) works the attack: an attacker controlling evil.example.com sends as your domain and passes DMARC under relaxed alignment — because their subdomain mail authenticates. Translate to your DNS: every subdomain you ever delegated to a service you later abandoned (a dangling CNAME to a deprovisioned ESP — the pattern behind the research-named “SubdoMailing” cases) is a badge still active in a stranger's drawer. Your defences, in order:
- Audit delegations: list every subdomain CNAME/NS delegation; for each, name the live service that owns it. No owner → remove it (the inventory discipline of Articles #13/#18, applied to delegations).
- Read reports by subdomain: aggregate reports (Article #36) show sources claiming your subdomains — an unrecognized one is a finding, not noise.
- Set np deliberately as you modernize: ghost subdomains get no benefit of your doubts at 9989-aware receivers.
Traps
| Trap | Reality |
|---|---|
| “sp is a nice-to-have extra” | Blank sp = p applies. You've had an sp policy all along; this guide just introduced you. |
| Publishing a subdomain record “for reports only” | Its p comes with it — a p=none subdomain record under a p=reject root quietly re-opens that subdomain's failing mail AND moves its reports out of your sight. |
| Copying sp into every subdomain record | Ignored by specification. Harmless, but it reveals the copier never tested — test instead. |
| Trusting 7489-era tooling for np | Older receivers ignore np entirely (unknown tag). Your ghost protection is only as wide as receiver upgrades — set it, don't lean on it. |
FAQ
Do I need separate DMARC records for my SendGrid/SES subdomains?
Usually no — those subdomains are envelope infrastructure; the From your customers see is the root, governed by the root record (Unified posture). Their own _dmarc records become relevant when you send as the subdomain (From on the subdomain) as a distinct stream.
We just discovered a subdomain sending we never approved.
That's the spoofing-triage workflow (Article #14) with the delegation audit above: check for a dangling CNAME first — an inherited badge explains “authenticated” abuse better than a breach does.
Should np be reject even while root is at quarantine?
Reasonable and common: ghosts have no legitimate mail to protect, so the ghost door can be strict before the front door is. (State it as your decision, made for that reason — the spec merely supplies the tag.)
Sources
RFC 9989 — §3.2.13 (np), §4.7 (sp semantics, fallback chain, existence test), §4.10.1, §11.8 (the worked subdomain attack) · RFC 7489 §6.3 (legacy sp; no np; PSL discovery) · Gmail Email Sender Guidelines + FAQ (volume counting at primary domain; full-text subdomain check) · Google Cloud App Engine bulk-mail guidelines (separate-by-purpose, different domains) · This site's Packs #13/#15/#31/#32 (dangling delegations, ESP subdomain mechanics).
Did this guide work for you?
Your reaction tells us whether this guide solved the problem it promised to solve.