If you’re tightening email authentication,
DMARC reporting
is where the real insight lives. Most teams start with DMARC aggregate reports (high-level trends), then add failure
reporting when they need message-level visibility.
That’s where the DMARC fo=1 setting comes in. It helps surface partial authentication failures that can hide
misconfigurations, alignment gaps, and early signs of spoofing.
This guide explains what the FO tag does, how FO=1 works in practice, how it compares with other options, and when it
makes sense for enterprise environments.
What Is the DMARC FO Tag?
The DMARC FO (Failure Options) tag is a tag in your
DMARC record that influences when a receiving mail server may generate forensic (failure) reports. FO helps define which DMARC
authentication failure conditions should trigger a message-level report.
It’s important to separate FO from an aggregate report:
-
Aggregate (RUA): Summary DMARC reports that show authentication and DMARC alignment results across large volumes
of mail.
- Failure/forensic (RUF): Message-level forensic report data tied to specific failures or conditions.
FO is tied to failure reporting behavior (typically delivered via the address in ruf=), while aggregate summaries are
delivered via rua=.
What FO=1 means in a DMARC policy
FO=1 requests failure reports when either the
SPF authentication fails, or the DKIM authentication fails.
Even if the message still passes
DMARC because the other mechanism passes and aligns, FO=1 can still request a report. That added visibility helps you catch
partial failures, like cases where your
SPF record is correct but your DKIM signature breaks, or where DKIM passes but SPF alignment fails due to third-party senders.
How DMARC FO=1 Works in Practice
When a receiver evaluates a message, it checks SPF and
DKIM, then checks identifier alignment to decide whether the authenticated identity aligns with the visible “From” domain
(DMARC’s core requirement). Alignment is what turns “authentication happened” into “authentication is meaningful for
this From domain.”
Here’s the simplified decision flow:
- SPF check: The receiver evaluates whether the sending IP is authorized for the domain used in SPF, then evaluates alignment
(whether that SPF domain aligns with the From domain configured for sending email addresses).
- DKIM check: The receiver validates the DKIM record signature against the sending domain in the DKIM header, then evaluates
dkim alignment (whether that DKIM domain aligns with the From domain).
-
DMARC check result: DMARC passes if either SPF-aligned pass or DKIM-aligned pass occurs. If both fail alignment,
DMARC fails and the receiver applies your
DMARC policy (p=).
How FO=1 triggers a report
With FO=1, a failure report may be generated when either SPF or DKIM fails, regardless of the final DMARC pass/fail
outcome. This is useful when you’re trying to track down why some mail is intermittently failing one mechanism, even
though legitimate email still lands.
What you can see in FO=1 failure reports
A failure report commonly includes message-level signals such as:
-
Key message headers (enough to troubleshoot routing and identity)
-
Authentication results (SPF/DKIM pass/fail and alignment outcomes)
- Sending infrastructure indicators like source IPs and domains
Because this is message-level data, it can contain sensitive information. Many enterprises treat failure reports as
restricted telemetry: limit who can access them, define retention, and avoid forwarding raw reports broadly.
Also note that failure reporting support varies by mailbox provider. Even if you publish FO and ruf=, receivers may
not send forensic reports in all cases.
DMARC Record Example with FO=1
Here’s a simple DMARC record example showing FO=1 in a DMARC TXT record (published as a DNS TXT record under
_dmarc.yourdomain.com):
|
v=DMARC1; p=quarantine; rua=mailto:dmarc-agg@yourdomain.com; ruf=mailto:dmarc-forensic@yourdomain.com; fo=1;
adkim=s; aspf=s; pct=100
|
-
fo=1 requests failure reporting when SPF or DKIM fails
-
adkim=s and aspf=s tighten alignment (strict mode)
-
rua= receives aggregate summaries; ruf= receives failure reports
If you’re validating records during rollout, a
DMARC record checker can confirm the syntax and whether a DMARC record found result appears for the domain.