What RFC 9989 changes for your DMARC record
DMARC is on the Standards Track. The Public Suffix List is out, the DNS tree walk is in, and your record needs a few small edits.
DMARC is a DNS record telling receivers what to do with mail that fails authentication, and where to send reports. For most of its life, it has depended on a text file. Before a receiver can check your policy it has to work out your organizational domain, the main domain a policy belongs to, such as example.co.uk for mail.example.co.uk. For that it consulted the Public Suffix List, a catalogue of every registry-controlled suffix on the internet, maintained by volunteers. RFC 9989 replaces that list with a DNS tree walk: asking DNS for _dmarc records one level up at a time. This article covers what changed, why, and the handful of edits your own record needs.
DMARC policy lives at the organizational domain, and alignment is judged against it. So before a receiver can do anything with a message from mail.example.co.uk, it has to decide whether the organizational domain is example.co.uk or co.uk. RFC 7489 answered that with the Public Suffix List: find the longest public suffix, add one label, and that is your organizational domain. The list began as a Mozilla project in 2007 for scoping browser cookies, and DMARC borrowed it because nothing better existed.
It worked, and it worked because volunteers kept it current through every new TLD and every private suffix for more than a decade. But it was a dependency the protocol did not own: an external file that every receiver had to download, cache, and refresh, with no standard saying how often. Two receivers holding copies of different ages could reach different organizational domains for the same message, and neither would know.
DMARC was never a standard until now
RFC 7489, the document everyone deployed, was Informational. It was published in 2015 on the Independent Submission stream, so it never went through IETF working group consensus, and vendors had room to interpret it, which some of them used. Operators deployed it anyway. They compared notes in forums and in groups like the Messaging, Malware and Mobile Anti-Abuse Working Group, built tooling, and worked out from aggregate reports what each alignment failure meant. An aggregate report, requested with the rua tag, is a daily summary from receivers of who sent mail as you and whether it passed. By the time Gmail and Yahoo required DMARC from bulk senders in 2024, the practice was mature; the mandate made it compulsory.
The revision went by the working group name DMARCbis for years. In May 2026 the IETF published it as three Standards Track documents: RFC 9989 for the protocol, RFC 9990 for aggregate reporting, and RFC 9991 for failure reporting. Together they obsolete RFC 7489. RFC 9989 also retires RFC 9091, the experimental public suffix domain spec, and keeps its np tag, the policy for subdomains that do not exist. Now that it is published, the standard is RFC 9989, and that is the name to use.
| What changes | RFC 7489 (obsolete) | RFC 9989 |
|---|---|---|
| Org domain lookup | Public Suffix List | DNS tree walk |
pct tag |
Supported | Removed |
rf and ri tags |
Optional | Removed |
t tag |
Not defined | New, replaces pct |
np tag |
Not defined | Imported from RFC 9091 |
psd tag |
Not defined | New |
| Document status | Informational | Standards Track |
The tree walk replaces the list
Under RFC 9989 the receiver asks DNS directly. For the policy, it queries _dmarc at the From domain first and uses that record if one exists. To find the organizational domain, which relaxed alignment needs, it moves up one label at a time, querying _dmarc at each parent, capped at eight queries so a domain with fifty labels cannot tie a receiver up. The walk stops early only at a record carrying psd=y or psd=n. Otherwise it runs to the top, and the record with the fewest labels marks the organizational domain.
A receiver uses the From domain's own record when there is one. When there is not, the same walk supplies the policy from the organizational domain or, failing that, the public suffix.
How DMARC finds your organizational domain
PSL lookup
-
1
Email arrives
mail.example.co.uk -
2
Load the Public Suffix List External text file, about 10,000 rules
-
3
Find the longest matching public suffix
co.uk -
4
Organizational domain identified
example.co.uk -
5
Query DNS for the DMARC policy
_dmarc.example.co.uk
DNS tree walk
-
1
Email arrives
mail.example.co.uk -
2
Query DNS at the From domain
_dmarc.mail.example.co.uk→ no record -
3
Query DNS one label up
_dmarc.example.co.uk→ record found -
4
Keep walking
_dmarc.co.uk,_dmarc.uk→ no record -
5
Pick the record with the fewest labels Organizational domain =
example.co.uk
That removes the download, the cache, and the question of whose copy of the list is current. It also fixes things operators had reported for years: inconsistent handling of the list, the unreliable pct tag, and spoofing of subdomains that do not exist, which the np tag now covers.
Publication is not deployment. Most receivers still evaluate DMARC the RFC 7489 way, and tree walk support will arrive one receiver at a time over a long period. For most domains the record keeps working unchanged. If you publish records at more than one level, or send from a domain on the private part of the Public Suffix List, the old and new methods can disagree. Publishing a record at every From domain removes that risk. There is no deadline and nothing to rush. There are a few edits worth making so the record reads cleanly under both specs.
What to change in your record
Most of the work falls on receivers. On yours, it is five checks, three of them edits, and all fit in one sitting.
- Remove the retired tags. RFC 9989 removes
pct,rf, andri. Receivers on the new spec ignore them, and they clutter the record. If you were usingpctto ramp enforcement in stages, there is no replacement. The newttag has two values. Witht=y, receivers apply one level below your policy, so reject is treated as quarantine and quarantine as none. Witht=n, the default, they apply the policy as written. That is less of a loss than it sounds. Receivers applied percentage sampling inconsistently, sopctnever gave the control it promised. Stay atp=noneuntil your aggregate reports show every legitimate sender passing with aligned DKIM, not SPF alone, and usespto enforce on subdomains ahead of the organizational domain if you want a staged path. - Drop the report size suffix. If a
ruaorrufaddress carries a size limit such asmailto:[email protected]!10m, remove the!10m. RFC 9989 Appendix C.4 removes that syntax, and receivers on the new spec ignore it. The address itself is unchanged. - Leave
psdalone unless you run a public suffix. The tag has three values:yfor a public suffix domain,nfor an organizational domain, andufor unknown, which is also the default when the tag is absent and lets the tree walk decide. Registries and public suffix operators declarepsd=y. Everyone else can omit it. - Consider
np=rejectwhile you are still below full enforcement. Under RFC 9989 a subdomain that does not exist inheritsspif you publish it, otherwisep, so a domain atp=rejectalready covers them. If you are still working through your senders atp=noneorp=quarantine,np=rejecttells receivers that support it to reject mail from subdomains that are not in DNS, at no risk to real mail, because no real mail comes from a subdomain that does not exist. - Check external reporting authorization. If
ruapoints at a domain you do not control, that domain has to publish a TXT record atyourdomain.example._report._dmarc.thirdparty.examplecontainingv=DMARC1, which says it accepts your reports. The rule moved from RFC 7489 into RFC 9990, Section 4, and the record is unchanged. Most report processors publish it for you. Confirm it anyway, because without it receivers drop the reports and nothing tells you.
dns-audit.com checks your record both ways, against RFC 9989 and against RFC 7489, and shows what changes between them.