RFC 9989: What Changed From RFC 7489 for DMARC

RFC 9989 (May 2026) replaces RFC 7489. pct is gone, a DNS tree walk replaces the Public Suffix List, np, psd and t are new, and reporting moved to RFC 9990 and 9991.

October 30, 20265 min read

RFC 9989, published in May 2026, replaces RFC 7489 as the DMARC standard. For most domain owners nothing is urgent: a normal record keeps its meaning. What changed: pct is gone, a DNS tree walk replaces the Public Suffix List, np, psd and t are new, and reporting moved into RFC 9990 and RFC 9991.

Everything below comes from the RFC text itself, mainly Appendix C ("Changes from RFC 7489") and section 4.7 (the tag list). Where we say how many domains are affected, the number is from our own scan of the Tranco top 1,000 on 19 October 2026.

One document became three

Document Covers Status
RFC 9989 The protocol: records, tags, policy discovery, alignment Standards Track. Obsoletes RFC 7489 and RFC 9091
RFC 9990 Aggregate (rua) reports and their XML format Standards Track. Obsoletes RFC 7489
RFC 9991 Failure (ruf) reports Standards Track. Updates RFC 6591, obsoletes RFC 7489

The status line matters more than it looks. RFC 7489 "was not the product of any IETF work stream"; the Independent Submissions Editor published it as Informational. RFC 9989 is an IETF standard. RFC 9091, the experimental spec for public suffix domains, is folded in and retired.

pct is removed, and t takes its useful half

RFC 7489 let you apply a policy to a percentage of failing mail. Appendix A.6 of RFC 9989 explains why that went: "Operational experience showed that the 'pct' tag was usually not accurately applied, unless the value specified was either 0 or 100." A pct=25 meant different things at different receivers.

pct=0 had picked up a second job. Some mailing lists and mailbox providers read it as a cue to rewrite the From header instead of applying the policy, and owners used that to measure how much of their mail passed through intermediaries. RFC 9989 keeps that behaviour under a new name:

  • t=y asks receivers not to apply the policy as written but one level below it. Reject is handled as quarantine, quarantine as none.
  • t=n is the default and means apply the policy as written.
  • t has no effect on a policy of none.

The IANA registry now lists pct as "historic". In our October scan, 10 of the 722 DMARC records in the top 1,000 still set pct below 100, including one p=reject; pct=5.

The tree walk replaces the Public Suffix List

Under RFC 7489, a receiver found your organizational domain with a public suffix list, and the RFC did not say which list or how often to refresh it. Two receivers could disagree about where your domain ends.

RFC 9989 section 4.10 drops the list. The receiver asks for _dmarc at the From domain. If nothing is there, it strips labels from the left and asks again, up to the top-level domain. Names longer than eight labels are shortened first, so a lookup never takes more than eight queries. For a.b.c.d.e.f.g.h.i.j.mail.example.com the RFC's own example queries _dmarc.a.b.c.d.e.f.g.h.i.j.mail.example.com, then jumps to _dmarc.g.h.i.j.mail.example.com and works up to _dmarc.com.

A record with psd=y or psd=n stops the walk. psd=y is for public suffix operators such as a registry. psd=n says "this is an organizational domain". Section 5.1.8 describes it for large organisations that hand parts of their DNS to departments, with a warning: a record placed deeper than the eight-query walk reaches is never found.

Receivers still running RFC 7489 code with a public suffix list may land on a different answer. Appendix C.3 gives the fix: the problem "is entirely avoided by the use of strict alignment and publishing explicit DMARC Policy Records for all Author Domains used in an organization's email."

Tags added and removed

Tag Change What it does
np Added (from RFC 9091) Policy for subdomains that do not exist in DNS. Falls back to sp, then p
psd Added y marks a public suffix domain, n an organizational domain, u (default) leaves it to the tree walk
t Added Test mode, described above
pct Removed Percentage sampling. Registry status historic
rf Removed Failure report format
ri Removed Requested interval between aggregate reports

p also changed status. RFC 7489 made it required in a policy record. RFC 9989 calls it recommended: a record without a valid p but with a valid rua is handled as p=none, and one with neither gets no DMARC processing at all.

Adoption of the new tags is thin so far. Only two domains in our scan publish np (both np=reject) and three publish psd.

Reporting moved into its own documents

Aggregate reports now live in RFC 9990. For a domain owner the differences are small:

  • A report "SHOULD be sent to each listed URI" in rua. RFC 7489 only required receivers to support two.
  • The size suffix on report addresses, such as mailto:[email protected]!50m, is gone.
  • Reports can say how the policy was found (discovery_method is psl or treewalk) and carry the t value as testing.
  • A DKIM result in a report must now include the selector, which makes it easier to tell two signing services apart.

Failure reports moved to RFC 9991. RFC 9989 section 5.3.9 now says plainly that receivers "MAY choose to send them" and that privacy-minded receivers either redact them heavily "or not send them at all." If your ruf mailbox is empty, that is why. Our FAQ on missing ruf reports has the details.

The advice on p=reject got sharper

Section 7.4 is the part most likely to change a decision. It says domains that publish p=reject "MUST NOT rely solely on SPF" and "MUST apply valid DKIM signatures", because forwarding breaks SPF but usually leaves DKIM intact.

It goes further for domains whose users post to mailing lists. Those domains "SHOULD NOT" publish p=reject. A domain that wants to anyway should first run p=none for at least a month, then p=quarantine for as long, and compare the results in its aggregate reports. On the receiving side, receivers "MUST NOT reject incoming messages solely on the basis of a 'p=reject' policy." The RFC admits in the same section that few receivers behave this way in practice.

What a domain owner needs to change

Nothing has a deadline. Work through this list when you next touch the record:

  1. Delete pct. At 100 it was the default and removing it changes nothing. If you used pct=0 to soften a new policy, use t=y instead. Receivers that still run RFC 7489 ignore t, so expect the full policy from them.
  2. Delete rf, ri and any !size suffix in rua or ruf. They no longer mean anything.
  3. Publish a record on every domain you send From, not only the parent. That sidesteps any difference between the tree walk and a public suffix list.
  4. Consider np=reject. It blocks mail from invented subdomains without touching the real ones.
  5. Before p=reject, check DKIM on every sender. Section 7.4 makes it a MUST. Your aggregate reports show which sources pass on SPF alone.

The DMARC record generator now follows RFC 9989 and never writes pct, and the DMARC checker explains np, psd and t when it finds them. Once reports arrive, the report analyzer reads both the RFC 7489 and RFC 9990 formats in your browser.

Frequently asked questions

Is RFC 7489 still valid?

No. RFC 9989, published in May 2026, obsoletes RFC 7489 and RFC 9091. Aggregate reporting moved to RFC 9990 and failure reporting to RFC 9991. RFC 7489 was an Informational document from the Independent Submissions stream; RFC 9989 is an IETF Standards Track document.

Do I have to change my DMARC record for RFC 9989?

Usually not. RFC 9989 sets no deadline, and a record with v, p, rua and the alignment tags means the same thing as before. Clean up only what lost its meaning: pct, rf, ri and size limits on report addresses. Replace pct=0 with t=y if you relied on it.

What replaced the pct tag?

The t tag. RFC 9989 kept the two values of pct that worked in practice: t=y does roughly what pct=0 did and t=n is the default, like pct=100. With t=y, a reject policy is treated as quarantine and a quarantine policy as none.

What is the DMARC DNS tree walk?

It is how RFC 9989 finds a policy and the organizational domain without the Public Suffix List. The receiver queries _dmarc at the From domain, then walks up one label at a time toward the top-level domain, capped at eight queries. A psd=y or psd=n tag stops the walk early.

What is DMARCbis?

DMARCbis was the working name for the IETF revision of DMARC. It was published in May 2026 as three documents: RFC 9989 for the protocol, RFC 9990 for aggregate reports and RFC 9991 for failure reports.

rfc 9989dmarcbisdmarc pctdmarc rfc

Check your own domain

Run the free DMARC, SPF and DKIM checks, or request a 14-day trial of DMARC+ reporting.