How to do DMARC properly: check the record you already have
A setup wizard hands you a p=none record. Replace yours and you weaken it; add it beside yours and receivers apply no DMARC at all. Plus the records that look published and aren't.
Yowl reads your DMARC record before it hands you anything, and refuses to weaken it. If you already
publish a policy we leave it alone, because our own record says p=none and a customer already on
quarantine would be downgrading themselves by pasting ours. It stays advisory throughout: you paste
the record, we never touch your DNS.
DMARC is a ladder, and Yowl climbs it with you
Everyone tells you to “start at p=none and tighten later”. Almost nobody tightens, because the step
from monitoring to enforcing is a judgement call made on evidence you do not have.
Yowl is built around supplying that evidence and then asking. The reports come back to an address on your own domain — which Yowl already hosts, so there is nothing to sign up for and no third party holding your traffic data — and they are parsed into one answer: who actually sent as you, whether they aligned, and for how long that has been true. When it has been clean long enough, the domain page shows one card: it is time to tighten. When there is nothing to do, it shows nothing:
{ "live": { "status": "quarantine", "record": "v=DMARC1; p=quarantine; rua=mailto:..." },
"statusSince": "2026-09-14", "firstReportAt": "2026-09-15",
"card": null,
"note": "nothing to act on — no DMARC card is showing on the owner's dashboard" }
Ask your agent “where are we on DMARC?” and that is what it reads. One rung, or nothing.
And it argues the right way round. The usual reason a domain is stuck on p=none forever is
“but we also use Mailchimp”. That is not a reason to stay unprotected — it is a reason to publish
Mailchimp’s DKIM selector so it signs as you. Authorising another sender is a DNS record, never an
exemption, and if something breaks under enforcement the fix is to authenticate it rather than to
weaken the policy. Yowl will never offer you the weaken option, and will not pretend tightening
improves your own deliverability either: mail sent through Yowl is signed and aligned at every policy
level, so the ladder is about stopping other people forging you, which is the only thing it was ever
for.
⛔ What that buys, stated plainly, because it usually isn’t: at p=quarantine or p=reject, only
the senders you have authorised can send as your domain. Everyone else is blocked — at the
receiver, before your customer ever sees it.
That whole behaviour exists because of the trap below, which is the one most domains are sitting in.
Most DMARC advice assumes you are starting from nothing The interesting failures happen on domains
that already have a record, because the instruction every provider gives — add this TXT record at
_dmarc — has two possible readings and both of them can break you.
DMARC is one TXT record at _dmarc.example.com, saying what a receiver should do with mail that
claims your domain and fails authentication. A message passes when either SPF or DKIM passes
and that pass is aligned with the From domain the reader sees — a newsletter tool with a
Return-Path on bounce.tool.com signing d=tool.com passes both checks, aligns with neither, and
fails.
The fork
You already publish v=DMARC1; p=reject. A new provider’s setup page shows you
v=DMARC1; p=none; rua=... and says to add it.
If you replace yours, you have just moved from reject to none. Every forgery of your domain that was being bounced this morning is delivered this afternoon. Nothing errors. No checker complains — you have a valid DMARC record.
If you add it alongside, it is worse. Receivers query _dmarc, discard anything not starting
v=DMARC1, and if more than one record survives that filter they
abort and take no DMARC action at all. Not the stricter
one, not the newer one, not the first one. Two perfectly valid records produce exactly the same
outcome as having none, deliberately, on the reasoning that an ambiguous policy is more dangerous
than no policy.
⛔ This is not the SPF rule wearing a different hat. Two v=spf1 records give you a PermError —
an error state you can see. Two DMARC records give you silence: policy simply becomes
undiscoverable, and your DNS panel shows two records that are each individually correct.
And silence now costs money. Microsoft’s consumer Outlook requires a resolving, aligned DMARC record
from anyone sending it more than 5,000 messages a day, and since
5 May 2025 it rejects outright
rather than junk-foldering as first announced — 550 5.7.515 Access denied, sending domain does not meet the required authentication level. A duplicate _dmarc reads as no DMARC, so it trips that
rejection while the owner is looking at two valid records and concluding the problem must be
somewhere else.
Records that look published and aren’t
Multiplicity is one of four states that a DNS panel renders identically. Worth knowing all four, because “we have DMARC” is not one fact.
| What is there | What receivers do |
|---|---|
Two or more valid v=DMARC1 |
Nothing. Policy undiscoverable. |
A record with no p=, or a garbled one |
Nothing. No policy tag means no policy — v and p are the only required tags, and a record missing p is invisible as policy however well-formed the rest is. |
p=none with no rua |
Honours the policy, which is take no action, and sends you nothing. |
A real none/quarantine/reject |
What you meant. |
That third row deserves its reputation carefully rather than a slogan. It is not a no-op: receivers
still evaluate DMARC and still stamp dmarc=pass or dmarc=fail, a pass is still a positive signal,
and the record does satisfy the Google, Yahoo and Microsoft bulk-sender requirement. What it does not
do is enforce anything or tell you anything. That combination — compliant, invisible, silent — is why
it is the single most common DMARC record in the wild.
A fifth trap the table cannot show: sp sets the subdomain policy and defaults to p, so a policy
read off the apex says nothing definite about what a subdomain is doing.
Check yours before you paste anything
dig +short TXT _dmarc.example.com
Three questions, in order. How many of those lines start with v=DMARC1? More than one is the
silent failure above. Does the survivor carry a real p=? Does it carry a rua=? A record that
answers “one, yes, yes” is a record you should not let a wizard overwrite.
If your policy is already stricter than the record you have been handed, keep yours and add only the
records the provider actually needs — its DKIM key and its sending record. The _dmarc record is
the one piece of a provider’s instructions that is about your domain’s posture rather than their
authorisation to send, which is exactly why it is the one they should not be dictating.
For what the fields mean and what the 2026 specification changed underneath all of this, see what RFC 9989 changed about DMARC.