Skip to content
Authentication

Anatomy of a DMARC record: every tag explained

A DMARC record is a TXT record at _dmarc.yourdomain.com built from tags: v, p, sp, rua, ruf, adkim, aspf and more. What each does and which you actually need.

A DMARC record is a DNS TXT record published at _dmarc.yourdomain.com, composed of semicolon-separated tag=value pairs. Only two tags are required, a handful are useful, and several exist mainly to be explained and then left at their defaults. This entry walks through the complete record, tag by tag, and ends with the minimal record every deployment should start from.

A complete recordRFC 1035
TXT / SPFMX / PTRA / AAAACNAME / NS / other
_dmarc.yourdomain.com. INTXT"v=DMARC1; p=none;
rua=mailto:dmarc-reports@yourdomain.com;
ruf=mailto:dmarc-forensics@yourdomain.com;
adkim=r; aspf=r; ri=86400"

The required tags

v is the protocol version, always DMARC1, and it must come first. p is the policy for the domain: none, quarantine, or reject. Those two tags make a syntactically valid record. A record without rua provides no visibility, though, so in practice rua should always be included as well.

The full tag reference

Every DMARC tag

FeatureDefaultWhat it does
v (required)noneProtocol version, always DMARC1, always first
p (required)nonePolicy for the domain: none, quarantine, or reject
spinherits pSeparate policy for subdomains
np (DMARCbis)inherits spPolicy for non-existent subdomains
ruano reportsDestination for aggregate reports (mailto URI)
rufno reportsDestination for forensic per-message reports (rarely sent)
adkim / aspfr (relaxed)DKIM / SPF alignment mode: r or s
fo0Forensic report trigger: 0 = both fail, 1 = either fails
ri86400Requested report interval in seconds; advisory, receivers may ignore it
pct (retired)100Percentage rollout; inconsistently implemented, removed in DMARCbis

The table covers every tag, but most records use only a handful. A production record typically carries v, p, rua, and sometimes sp; everything else earns its place only with a specific reason. Extra tags are not harmless decoration: every deviation from defaults is something the next engineer has to understand before touching the record.

Tags that changed with DMARCbis

DMARCbis, the Standards Track revision finalized in 2025, retired pct: percentage-based rollout was implemented inconsistently by receivers and never delivered the gradual enforcement it promised. Records still carrying pct remain valid (receivers ignore unknown or retired tags), but any pct-based rollout plan should be replaced with the staged policy progression. The revision also added np, the policy for non-existent subdomains, which lets a record refuse mail from fabricated names while real subdomains stay at a gentler policy.

The minimal starting record

Where every deployment beginsRFC 1035
TXT / SPFMX / PTRA / AAAACNAME / NS / other
_dmarc.yourdomain.com. INTXT"v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain.com"

This record does two things: it tells receivers a DMARC policy exists (even though none takes no action), and it tells them where to send aggregate reports so the domain owner can see who is sending mail as that domain. From here, the rollout process walks the policy toward enforcement, guided by the aggregate reports that start arriving within a day or two.

Placement and syntax rules

The record lives at the _dmarc label under the domain the From: header uses: _dmarc.yourdomain.com for yourdomain.com. One DMARC record per name; duplicates make the policy unusable, the same failure mode as duplicate SPF records. Tags are separated by semicolons, the v tag leads, and unknown tags are ignored rather than fatal, which is why DMARCbis additions deploy safely. When reports should go to an address on a different domain, the receiving domain must authorize it by publishing a verification record (yourdomain.com._report._dmarc.reportingdomain.com with value v=DMARC1), without which receivers will not send reports there.

Frequently asked questions

Can aggregate reports be sent to a domain I do not own?
Yes, but the receiving domain must authorize it. It needs to publish a DNS record at yourdomain.com._report._dmarc.theirdomain.com with the value v=DMARC1. Without this record, receivers will not send reports to that address. Hosted DMARC report services set this up as part of onboarding.
Should I keep pct in my record?
No. It was inconsistently implemented even before DMARCbis retired it, and its presence signals an unfinished rollout. Complete the policy progression properly and remove the tag.
Do I need a DMARC record on every subdomain?
Not necessarily: subdomains inherit the organizational domain's policy via sp (or the policy discovery walk). Publish subdomain-specific records only when a subdomain needs a different policy or its own reporting address.
What does ri actually change?
It requests a report interval in seconds, defaulting to 86400 (daily). It is advisory only; most receivers send daily regardless. Leave it out.

Key takeaways

  • Only v and p are required, but a record without rua provides no visibility and should not ship
  • The record lives at _dmarc.yourdomain.com, one per name, tags separated by semicolons, v first
  • ruf forensic reports are mostly not sent by major providers; rua aggregates are the real data source
  • DMARCbis retired pct and added np; existing records stay valid because unknown tags are ignored
  • External report addresses need an authorization record on the receiving domain before reports flow
DMARC record tags explained: v, p, sp, rua, ruf | Inbox Theory