DMARCbis and RFC 9989: what changed in DMARC, and what should you do?
RFC 9989 (DMARCbis) replaced RFC 7489 in May 2026 and made DMARC a Standards Track protocol. It removed pct, rf and ri, added t (test mode), np and psd, and swapped the Public Suffix List for a DNS tree walk. Most records keep working unchanged. Replace any pct between 1 and 99, and make sure DKIM is aligned before p=reject.
On this page 8 sections
DMARC has a new specification. In May 2026 the IETF published RFC 9989, long known as "DMARCbis", and it obsoletes the 2015 RFC 7489 that every DMARC guide used to cite. Most domains don't have to touch anything, but a few changes matter, and one of them changes the advice about p=reject.
What is DMARCbis?
DMARCbis is the IETF's revision of DMARC. "bis" is IETF shorthand for a second version of a document. The work produced three RFCs, all published in May 2026:
| Document | Covers | Replaces |
|---|---|---|
| RFC 9989 | The DMARC protocol: records, alignment, policy discovery | RFC 7489 and RFC 9091 |
| RFC 9990 | Aggregate (rua) reports and their XML format |
The reporting sections of RFC 7489 |
| RFC 9991 | Failure (ruf) reports |
The failure-reporting sections of RFC 7489 |
The status change is a big part of the story. Appendix C.1 notes that RFC 7489 "was not the product of any IETF work stream" and was published by the Independent Submissions Editor as an Informational RFC. RFC 9989 is an Internet Standards Track document, which means it has IETF consensus behind it.
If you're new to DMARC itself, start with what DMARC is and how it works. This guide assumes you already have a record.
What changed in the DMARC record?
The record format is the same: a TXT record at _dmarc.yourdomain, starting with v=DMARC1. Section 4.7 says receivers must ignore unknown tags, so new tags didn't need a new version number. Appendix C.5 lists the tag changes:
| Tag | Status in RFC 9989 | What it does or did |
|---|---|---|
pct |
Removed | Applied the policy to a percentage of failing mail |
rf |
Removed | Chose the failure report format |
ri |
Removed | Requested an aggregate report interval (default 86400 seconds) |
t |
Added | Test mode: y or n |
np |
Added (from RFC 9091) | Policy for subdomains that don't exist |
psd |
Added | Marks a public suffix domain, or declares an organizational domain |
The DMARC record examples guide documents every current tag with copy-paste records. Here's why each change happened.
pct is gone; t replaces it
RFC 7489 let you apply your policy to, say, 25% of failing mail. Appendix A.6 explains that in practice the tag "was usually not accurately applied, unless the value specified was either 0 or 100", and that the errors "varied widely from one implementation to another."
Meanwhile pct=0 had picked up a second meaning. Mailing lists and some mailbox providers treated it as a signal to rewrite the From header, and domain owners used that to see how much of their mail passed through intermediaries. The authors kept that behavior and gave it a clearer name: t=y is meant to be analogous to pct=0, and t=n (the default) to pct=100.
Under t=y, a receiver applies one level below your policy: p=quarantine is treated as none, and p=reject as quarantine. It doesn't affect reporting, and it does nothing when the policy is already none.
np becomes standard
np sets the policy for subdomains that return NXDOMAIN, meaning they don't exist at all. It was introduced in experimental RFC 9091; RFC 9989 makes it part of the standard. If np is absent, the sp policy applies, and if sp is absent too, p applies. Our subdomain policy guide covers sp and np in detail.
rf and ri are gone
rf only ever had one supported value (afrf). ri asked for a reporting interval, but RFC 7489 itself said anything other than a daily report was handled "on a best-effort basis." Neither tag has a replacement. RFC 9990 describes aggregate reports as "daily (or more frequent)," whatever you ask for.
How does the DNS tree walk replace the Public Suffix List?
This is the biggest technical change, though most domain owners won't notice it.
DMARC needs your organizational domain for two jobs: finding a policy when the From domain has no record of its own, and deciding whether two domains align under relaxed alignment. RFC 7489 found it with a Public Suffix List (PSL), a published list of suffixes like .com and .co.uk. Section 4.10 points out that RFC 7489 never said which list to use or how often to refresh it, so receivers could reach different answers.
RFC 9989 replaces the list with a DNS tree walk. The receiver queries _dmarc at the domain, then removes the left-most label and queries again, up the tree. Without a psd tag in play, the organizational domain is the name with the fewest labels that has a valid DMARC record. To stop abuse, names with more than eight labels are shortened first, so a walk never takes more than eight queries.
Two practical effects:
- Your organizational domain is now the highest name with a DMARC record, not "whatever the registrar sold you". For almost every business those are the same thing.
- Records on deep subdomains may be skipped. Section 5.1.8 warns that because of the eight-query shortcut, when a From domain has more than eight labels, a record published on one of its parent names that is eight or more labels long is never queried. If you need a specific policy on such a long name, publish the record at that exact name.
What is the psd tag for?
psd=y is for public suffix operators, such as registries, that want to publish DMARC for names under their suffix. Section 5.2 says a public suffix operator that publishes a DMARC record MUST include psd=y. Ordinary businesses should leave it out.
psd=n says "this name is an organizational domain for itself and its subdomains". Section 5.1.8 describes it as a tool for large organizations whose departments manage their own DNS. It also changes alignment, so don't add it casually.
Appendix C.3 admits the change can cause disagreements between receivers that use the tree walk and receivers still using a PSL. It says the issue is "entirely avoided" by using strict alignment and publishing explicit DMARC records for every From domain you use. For a typical business with one domain and a record at _dmarc.example.com, both methods give the same answer.
What changed for receivers and p=reject?
RFC 9989 is far more explicit about p=reject than RFC 7489 was. This is the change most likely to affect your plans.
Advice to domain owners
Section 7.4 says that "domains that host users who might post messages to mailing lists SHOULD NOT publish Domain Owner Assessment Policies of 'p=reject'." Those that want to anyway SHOULD first publish p=none "for at least a month," then p=quarantine "for an equally long period of time," and compare the results.
It also says domains that publish p=reject "MUST NOT rely solely on SPF to secure a DMARC pass and MUST apply valid DKIM signatures to their messages." The reason is forwarding. Forwarded mail "will most likely fail SPF checks," while "DKIM signatures will generally remain valid." Our guide to forwarding, SPF and ARC explains the mechanics.
Advice to receivers
Section 7.4 also says receivers "MUST NOT reject incoming messages solely on the basis of a 'p=reject' policy." Without other evidence, they "MUST treat such failing mail as if the policy were 'p=quarantine'." The RFC is candid that this may not change much: it says that "in practice, despite this advice, few Mail Receivers apply any mitigation techniques" for indirect mail.
So p=reject remains a request. Some receivers will reject, some will junk, and some will deliver with a warning.
What else changed?
- Missing
ptag. Section 4.10.1 says a record without a validpis treated asp=noneonly if it has at least one validruaaddress. Otherwise the receiver applies no DMARC processing. - Duplicate records. If a name returns more than one DMARC record, all of them are discarded. That was already the effect in practice; the tree walk spells it out.
- Every report address gets reports. RFC 7489 required receivers to support at least two report addresses. RFC 9989 says a report "SHOULD be sent to each listed URI."
- No report size limit. The
!10msize suffix on report addresses is obsolete, and Appendix C.4 notes it was removed. Receivers should ignore it. - A Domain Owner checklist. Section 5.1 now walks through the steps: aligned SPF, aligned DKIM, a report mailbox, monitoring, then a decision about enforcement. Section 8 says full participation means sending mail that aligns through both SPF and DKIM.
- New terms. "Monitoring Mode" means
p=none; "Enforcement" meansquarantineorreject. "Report Receiver" is now "Report Consumer".
What do you actually need to do?
For most domains, very little. Work through this list once:
- Check your record. Run the DMARC Checker. It flags duplicate records,
pctbelow 100 and unauthorized outside report addresses. - Replace partial
pctvalues. If you havepct=25or similar, updated receivers apply your full policy to everything. Uset=ywhile you test, then remove it.pct=100is harmless and can stay or go. - Decide about
pct=0. Older receivers still read it, and Microsoft's DMARC guide still showedpctexamples when we checked in October 2026. Addingpct=0next tot=ykeeps both kinds of receiver in test mode. - Remove
rfandri. They do nothing now. Leaving them is harmless, but removing them avoids confusion. - Confirm aligned DKIM on every sender, especially before
p=reject. The DKIM Checker shows whether a selector's key is published, and why DMARC fails covers alignment problems. - Add
np=rejectif your main policy isn't at reject yet. It blocks mail from invented subdomains without touching real ones. - Think about mailing lists. If your staff post to outside mailing lists, read section 7.4 before choosing
rejectoverquarantinefor your main domain.
You don't need to change v=DMARC1, your report addresses, adkim, aspf or fo.
What didn't change?
DMARC still asks the same question: did SPF or DKIM pass for a domain that aligns with the visible From address? The policies are still none, quarantine and reject. Relaxed alignment is still the default, and the RFC still notes that "nearly all Domain Owners have found relaxed alignment sufficient." Our guide to relaxed vs strict alignment covers when strict makes sense.
Reports still arrive as gzipped XML by email. If an address is on another domain, that domain still has to authorize it with a _report._dmarc record; DMARC rua and ruf reporting addresses shows how.
Adoption also hasn't changed overnight. In our scan of the Tranco top 1,000 domains in October 2026, 38.3% of these large sites still didn't enforce DMARC. The new RFC changes the fine print, not that gap.
Next steps
- Check your record with the DMARC Checker, and rebuild it with the DMARC Record Generator if it still uses
pct,rforri. - Upload a week of reports to the DMARC Report Analyzer and confirm every legitimate sender passes with aligned DKIM.
- Plan your enforcement stages with moving DMARC from p=none to p=reject.
- Watch for unplanned changes. iBlockSpam's domain monitoring alerts you when your MX, SPF or DMARC record changes.
Browse our other SPF, DKIM and DMARC guides.
Frequently asked questions
Is DMARCbis the same as RFC 9989?
Yes. DMARCbis was the working name for the revised DMARC specification while the IETF DMARC working group wrote it. It was published in May 2026 as RFC 9989, with aggregate reporting split out into RFC 9990 and failure reporting into RFC 9991. Together they obsolete RFC 7489, and RFC 9989 also obsoletes RFC 9091.
Do I need to change my DMARC record because of RFC 9989?
Usually not. The record still starts with v=DMARC1, and p, sp, rua, ruf, fo, adkim and aspf work as before. Change it if you use pct with a value between 1 and 99, because updated receivers ignore pct. Use t=y for testing instead, and consider adding np=reject to block invented subdomains.
Is the version still v=DMARC1?
Yes. RFC 9989 keeps v=DMARC1 as the only valid value, and it must still be the first tag. New tags didn't need a new version, because receivers must ignore tags they don't know. That's also why old tags like pct, rf and ri don't break a record: updated receivers simply skip them.
Does RFC 9989 say not to use p=reject?
Not for every domain. It says domains whose users might post to mailing lists SHOULD NOT publish p=reject, because list traffic can be rejected. Domains that do publish p=reject must sign with aligned DKIM and not rely on SPF alone. Non-sending and purely transactional domains are a different case.
Have Gmail, Outlook and Yahoo adopted RFC 9989?
Large mailbox providers update on their own schedules and don't always announce it. Microsoft's DMARC setup guide, for example, still showed pct examples when we checked in October 2026. Write records that behave sensibly under both versions: avoid pct values between 1 and 99, and treat a t=y stage as real enforcement at some receivers.
Sources
- RFC 9989: Domain-Based Message Authentication, Reporting, and Conformance (DMARC)
- RFC 9989, Appendix C: Changes from RFC 7489
- RFC 9990: DMARC Aggregate Reporting
- RFC 9991: DMARC Failure Reporting
- RFC 7489: DMARC (obsoleted by RFC 9989)
- Microsoft Learn: Set up DMARC to validate email in Microsoft 365
See how your domain measures up
Run a free Email Health Check: MX, SPF, DKIM, DMARC and transport security in one scan, with the raw records shown. No sign-up.
Keep reading
What is DMARC, and how does it work?
What DMARC is, how it uses SPF and DKIM alignment, what p=none, quarantine and reject do, what the reports show, and how to set it up in five safe steps.
9 min read SPF, DKIM & DMARCDMARC alignment: relaxed vs strict, and what adkim and aspf do
How DMARC alignment works, what adkim and aspf do, how the organizational domain is found, a pass/fail examples table, and when strict alignment is worth it.
9 min read SPF, DKIM & DMARCDMARC rua and ruf: how to set up DMARC reporting addresses
What DMARC rua and ruf do, the mailto syntax, how to send reports to another domain with a _report._dmarc record, failure report privacy and report volume.
9 min read