When DMARC fails, the DNS record is often blamed first.
In practice, the fastest path to the real cause is usually the message header, specifically the Authentication-Results line. That one line tells you what the receiver believed about SPF, DKIM, and DMARC at evaluation time.
If this still feels a bit abstract, that is normal. Header troubleshooting looks noisy at first, then suddenly becomes very systematic.
DMARC does not care whether SPF or DKIM passed in isolation.
DMARC cares whether at least one of them passed and aligned with the visible From domain.
From: alerts@example.com -> domain is example.comd= value in the DKIM signatureIf alignment still needs a quick refresher, this helps: DMARC alignment: From vs Return-Path (strict vs relaxed).
Provider-specific views are better than copy/pasting from mobile apps because they preserve the full auth context.
Once headers are open, search for:
Authentication-Results:From:Return-Path:DKIM-Signature:Suppose the message claims to be from example.com:
From: Billing Team <billing@example.com>
Return-Path: bounce-4321@mail.example.net
DKIM-Signature: v=1; a=rsa-sha256; d=mail.example.net; s=sel2026; ...
Authentication-Results: mx.google.com;
spf=pass smtp.mailfrom=mail.example.net;
dkim=pass header.d=mail.example.net;
dmarc=fail (p=quarantine) header.from=example.comThis is the classic "everything passed except DMARC" pattern.
Why it fails:
mail.example.net, not aligned to example.commail.example.net, also not aligned to example.comTypical sign:
spf=passdmarc=failsmtp.mailfrom domain differs from header.fromTypical fix:
example.com, ord=example.com or a subdomain of it (under relaxed alignment)Typical sign:
dkim=passheader.d does not match (or align with) header.fromTypical fix:
d= under your From domain namespaceIf this shows up often across tools, Your Google Workspace DKIM setup may be broken (and you may not know it) is a useful diagnostic companion.
Typical sign:
Typical fix:
Use this walkthrough for that part: DMARC reporting 101: how to read aggregate XML reports and take action.
When incident tickets are piling up, avoid deep theory first. Use this order:
header.from domain.dmarc=pass/fail in Authentication-Results.smtp.mailfrom and header.d against header.from.That loop catches most real issues in minutes, not days.
You may see forwarded messages where original auth looked good but current SPF fails. That is expected because forwarding often changes the SMTP path.
In those cases, DKIM survival and ARC context become important, and the header may include extra ARC fields that explain why the receiver still made a trust decision.
No need to solve all ARC details on day one. First get comfortable reading base auth outcomes and alignment.
For operational scale, pair header analysis with aggregate telemetry from DMARC aggregate reports (RUA) explained: how to read the XML and take action.
Once this becomes routine, DMARC stops feeling like random pass/fail events and starts looking like what it really is: identity alignment with clear, repeatable diagnostics.