DMARC · Subdomains · Policy

Sending subdomains: your root policy has two deputies you've never met

First published 20 October 2026 · Semantics from RFC 9989 (§4.7, §3.2.13, §4.10.1) read directly, with the RFC 7489 dialect differences kept visible. The Google “separate subdomains” claim is corrected against Google's own pages in §3.

The worked example (memorize this table)

Root record: v=DMARC1; p=reject; sp=quarantine; np=reject

Mail claims to be fromGoverning policyWhy
example.com (the root)rejectp — the root's own door
shop.example.com — exists, no own record, auth failsquarantinesp — the existing-subdomain deputy
ghost.example.com — never created (NXDOMAIN), auth failsrejectnp — 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=nonenoneIts 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 rootreject everywhereBlank sp/np inherit p — the “accidental fortress” many domains already live in

One precision: sp inside a subdomain's own record is ignored in both spec dialects. And discovery itself walks the tree (RFC 9989's label-by-label walk replaced the old public-suffix shortcut — Article #20's mechanics).

Why the ESPs insisted (the honest three reasons)

Three postures — choose one on purpose

PostureShapeSuits
UnifiedOne root record; sp/np blank (inherit p); no subdomain recordsMost small businesses. Simple, consistent, reports all in one place. The accidental-fortress effect is a feature once senders are inventoried
SplitKey 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
FortressRoot 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:

  1. 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).
  2. Read reports by subdomain: aggregate reports (Article #36) show sources claiming your subdomains — an unrecognized one is a finding, not noise.
  3. Set np deliberately as you modernize: ghost subdomains get no benefit of your doubts at 9989-aware receivers.

Traps

TrapReality
“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 recordIgnored by specification. Harmless, but it reveals the copier never tested — test instead.
Trusting 7489-era tooling for npOlder 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).

Verification note: tag semantics and the fallback chain were confirmed from RFC 9989's text on 20 October 2026; receiver adoption rates for np are unmeasured anywhere we could verify, and Yahoo's position on separation has no first-party text — both absences are stated rather than papered over.