Answer · DMARC · with original 2026 data

“DMARC record published but not valid” — what it means, and why it is worse than having none

A DMARC checker has told you your record is invalid, has a syntax error, or that the policy could not be read. The record is there. You can see it in your DNS console. Every field looks right.

This is the one DMARC result that is genuinely worse than publishing nothing, and the reason is short: a receiving mail server does not repair your record, and it does not warn you. It discards it. From that moment your domain is treated exactly as if you had never published DMARC at all — while your DNS console, your reporting address and your compliance checklist all continue to say you are protected.

1 in 514

domains that publish a DMARC record at all publish one that is void — 6 of the 3081 DMARC records among 7,519 small-business and agency-built domains we measured on 2026-09-05. It is rare, and that is precisely the problem: it is too rare for anyone to be looking for it, and every one of those owners believes the control is on.

Free, no signup: what a stranger can already read about your domain

You cannot settle this one by eye, which is the whole problem. This reads the record your domain publishes right now and tells you the policy value it parsed - not merely that a record is there.

Type a domain and get four checks in about ten seconds: whether anyone can send email in your name (SPF, DKIM and DMARC), how long your HTTPS certificate has left, when your domain registration expires, and whether the site answers over HTTPS rather than plain http. No email address, no account, nothing installed. It runs the same code our paid monthly report runs.

Open the free check on its own page → · We measured 604 domains: 72-83% had at least one finding

What the standard actually says

DMARC is defined by RFC 7489. Section 6.3 defines the p tag and admits exactly three values — none, quarantine, reject — and nothing else. Section 6.6.3 then tells receivers what to do with a record that does not carry one of them:

Records that do not include a p tag that is valid are ignored, and the receiver applies no DMARC processing to the message.

“Ignored” is the whole story. Not rejected with an error, not downgraded to p=none, not reported back to you. Silently skipped, on every message, at every receiver, for as long as the typo stands.

Your anti-spoofing record has a typo and is being ignored

yourcompany.com publishes a DMARC record with no usable policy setting. The standard allows only p=none, p=quarantine or p=reject, and a record without one of those is discarded — receiving servers act as though you had published no DMARC record at all. The record still looks present in a DNS console, and any reporting address in it keeps working, which is why this is normally found only by a tool.

The sentence above is the wording our own free checker returns for this finding, reproduced here from the running code rather than retyped.

Why nothing tells you

Four things conspire to keep this invisible, and it is worth naming them because each one is a place you would reasonably have expected a warning:

Compare that with having no DMARC at all, where at least the checker says so and nobody is under any illusion. Here the belief and the reality point in opposite directions, and the belief is the one written down.

The shapes we actually found

These are the void records in our own measurement, quoted as published. None of them is exotic; every one is a plausible thing for a competent person to type once:

Three patterns cause almost all of it. A misspelling of one of the three legal words — quarentine is the common one, and it is one transposed letter from correct. A template placeholder left in place, where p=policy is what a copied example said and nobody substituted the real value. And a missing p tag entirely: a record carrying only v=DMARC1, or one that sets the subdomain policy sp= and never sets the domain policy it inherits from.

That last one deserves a warning of its own, because it is the most reasonable mistake on the list. sp= without p= reads like it should mean “this policy for subdomains, defaults elsewhere”. It does not. Without a valid p the entire record is void, and the sp you carefully set governs nothing.

How to check yours in thirty seconds

Read the record and compare the p= value against the three legal words by eye. Do not trust a tool that only reports presence:

nslookup -type=TXT _dmarc.yourcompany.com
dig +short TXT _dmarc.yourcompany.com

You are looking for a single string beginning v=DMARC1 that contains p=none, p=quarantine or p=reject — spelled exactly, in lower case by convention, with nothing appended. p=rejected is not p=reject. Three further things void a record just as completely:

The fix, and the one decision inside it

Correcting the spelling takes a minute. The decision is what to correct it to, and it is not automatically the value you meant to type. A void record has never been enforced, so your domain has been running with no DMARC in effect for however long the typo has stood — and you have no idea which of your own systems would fail enforcement, because you have never had a working report.

Publishing the p=reject you originally intended is therefore a change from nothing straight to strictest, on a mail estate you have no data about. That is the standard way a business breaks its own invoicing:

v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain

Publish that first. It changes nothing about delivery and starts the aggregate reports flowing from a record receivers will actually read. Once a full billing cycle has passed and every sender you recognise — your mail provider, your invoicing tool, your booking system, your newsletter — is authenticating cleanly, move to p=quarantine, then to p=reject. If the typo you are fixing is itself in a p=reject record, this is not a step backwards: you are not weakening enforcement, because there has not been any.

After you save the change, read the record back. That is the entire lesson of this page: the only proof a DMARC record works is a tool that parses the policy value, not one that confirms a record exists.

Fix it yourself. Then find out when it breaks again.

Everything on this page is the whole fix, free, with nothing held back. What a DNS change cannot do is tell you when somebody edits it back, when a certificate runs out, or when a registration lapses — all three carry dates and none of them announce themselves. A3E’s perimeter monitor re-runs all four checks every month and emails you only when something moves: CA$99/month per site, cancel any time. A single report with no monitoring is CA$29.

Check a domain free See the monitor

Questions

What does an invalid DMARC record actually do?

Nothing. RFC 7489 section 6.6.3 tells receiving mail servers to ignore a record that carries no valid p tag, so they apply no DMARC processing at all. The domain is treated exactly as if no DMARC record had ever been published.

Is an invalid DMARC record worse than no DMARC record?

In effect they are identical — both leave the domain unprotected. In practice the invalid one is worse, because a missing record is reported by every checker and an invalid one still looks present in a DNS console, may still deliver aggregate reports to the address in its rua tag, and so is believed to be working.

Which values are allowed in the DMARC p tag?

Exactly three: none, quarantine and reject. Anything else voids the record. A value that merely begins with a legal word does not count — p=rejected is not p=reject, and some checkers wrongly match the prefix and report the domain as enforcing.

Can I have sp= without p= in a DMARC record?

No. The sp tag sets the policy for subdomains only and cannot stand alone. Without a valid p tag the whole record is discarded, and the subdomain policy you set governs nothing.

I fixed the typo — should I go straight back to p=reject?

No. A void record has never been enforced, so you have no reports telling you which of your own systems would fail. Publish p=none first, read the aggregate reports for a full billing cycle until every legitimate sender authenticates, then move to quarantine and reject.

Why did my DMARC checker say the record was fine?

Many tools test only whether a record exists at _dmarc.yourdomain.com and never parse the policy value. A presence check passes on every void record on this page. Use a checker that reports the p value it read.

The other five in this set

No DMARC record found: what it means and the record to publish

DMARC p=none: what it does, and how to move off it safely

No SPF record found: the record to publish, and why SPF alone is not enough

Gmail 550-5.7.26: what it means and the records that fix it

SPF permerror — too many DNS lookups, and how to get back under ten

The measurement behind every number on this page: 604 domains, method and limitations

Every figure on this page is generated from the stored raw measurement files behind our 604-domain study (522 agency-built sites measured 2026-08-20, 83 independent domains measured 2026-08-01), and the quoted finding wording is read out of the running checker at build time. An automated control re-asserts both against this live page on every operating cycle; if either changed and this page did not, it fails. Generated 2026-09-05T23:34:13Z.

← Back to all articles