CertaDNS
Skip to lesson

The Policy Record · lesson 1 of 3

Every tag, including the unused ones

After this lesson you can

Write a policy record in which every tag is there for a reason you can state.

A DMARC record has eleven defined tags. Most published records use four of them, and the seven that are usually absent are absent for good reasons you should be able to state.

All eleven

TagDefaultWhat it does
vVersion. Must be DMARC1 and must come first.
pPolicy for the domain itself. Required.
spinherits pPolicy for subdomains.
npinherits spPolicy for subdomains that do not exist in DNS.
ruanoneWhere aggregate reports go.
rufnoneWhere failure reports go.
adkimrDKIM alignment mode.
aspfrSPF alignment mode.
pct100Percentage of failing messages the policy is applied to.
fo0Which conditions generate a failure report.
ri86400Requested reporting interval, in seconds.
rfafrfFailure report format.

The ones worth setting

Cloudflare states every default explicitly, which costs nothing and makes the intent readable to whoever inherits the record:

$ dig +short TXT _dmarc.cloudflare.com
"v=DMARC1; p=reject; sp=reject; adkim=r; aspf=r; pct=100;
  rua=mailto:a1c47f179bc04efd8ee4dcd4d85dfc65@dmarc-reports.cloudflare.net,mailto:rua@cloudflare.com"
Checked 2026-09-15.

PayPal states almost nothing, and relies on the defaults doing what it wants:

$ dig +short TXT _dmarc.paypal.com
"v=DMARC1; p=reject; rua=mailto:d@rua.agari.com,mailto:dmarc_agg@vali.email;
  ruf=mailto:d@ruf.agari.com,mailto:MTc4Mzcw@ruf.vali.email"
Checked 2026-09-15.

Both are correct. The difference is that the first survives being read by someone who does not know the defaults, and the second does not — most importantly for sp, which inherits p silently and is the tag people most often assume is set when it is not.

The ones you can ignore

TagWhy it is usually absent
riReceivers send daily regardless. A shorter interval is a request nobody honours.
rfOnly one format was ever defined. Setting it says nothing.
pctAmbiguously implemented, and a poor rollout tool for reasons that need their own lesson.
rufAlmost no receiver sends failure reports, and the few that do send personal data.

The BBC sets ri=86400 and fo=0 — both exactly the defaults — which is harmless, and worth recognising as decoration rather than configuration when you meet it.

p is the only required tag besides v

v=DMARC1; p=none is a complete and valid record. It asks for nothing and reports nothing, which makes it the one shape genuinely not worth publishing — without rua you get no visibility, and p=none asks receivers for no action. RFC 7489 §6.3 defines the rest.

Try it on a real domain

Free, no account, public DNS only.

Last reviewed