p and sp can move independently, so enforcement is two decisions rather than one. Which goes first depends on where your unknowns are, and for most organisations the answer is not the apex.
Two shapes, both defensible
p=none; sp=reject subdomains enforced first p=reject; sp=none apex enforced first p=quarantine; sp=reject apex behind subdomains (github.com, apple.com) p=reject; sp=none; np=reject apex + non-existent, subs exempt (gov.uk)
Subdomains first
This is right when subdomains are used for a small number of controlled streams and the apex carries everything else — human mail, legacy systems, whatever a decade of vendors left behind. The controlled half is enumerable; the apex is not yet.
- The enforced half is the one you can actually finish inventorying.
- A mistake affects a known, narrow stream rather than all company mail.
np=rejectcan come at the same time and costs nothing.
The apex first
gov.uk does the opposite, for a reason specific to its structure: the apex is centrally operated and fully known, while the subdomains are delegated to hundreds of departments at every conceivable stage of readiness. The half you control is the apex, so that is the half you enforce.
"v=DMARC1;p=reject;sp=none;np=reject;adkim=s;aspf=s;fo=1; rua=mailto:dmarc-rua@dmarc.service.gov.uk"
Note that np=reject sits alongside sp=none. Non-existent subdomains are enforced hard even while existing ones are exempt, because a name with no DNS records has no department behind it to break.
The rule underneath both
Enforce the half whose senders you have finished enumerating. That is the entire principle; which half that is depends on how your organisation is shaped rather than on any general best practice. If the answer is neither, you are not ready to enforce anything and the work is inventory, not policy.
np=reject is nearly always available early
Whatever order you choose for p and sp, non-existent subdomains can usually be rejected from the start. Nothing legitimate originates from a name that does not resolve, so there is no population to break — and it closes the easiest spoofing shape immediately.