What compauth=fail means in Microsoft 365 Authentication-Results headers, every documented reason code (000, 001, 002, 010, 1xx, 2xx, 6xx, 9xx), and how to fix unaligned SPF and DKIM, intra-org spoofing, third-party senders and inbound gateways.
Home › Guides › Microsoft 365 compauth=fail
Last updated 18 October 2026
compauth is Microsoft 365's composite authentication verdict. It is stamped in the Authentication-Results header of inbound mail and combines SPF, DKIM and DMARC with other signals to decide whether the domain in the visible From: address is authenticated. compauth=fail means Microsoft 365 couldn't confirm that domain; the three-digit reason= code says why.
A compauth failure on its own doesn't block a message. Microsoft 365 weighs it with the rest of the message, and spoof intelligence and the anti-phishing policy decide what happens. To make it go away for a legitimate sender:
Many sending domains on the internet still don't publish strong SPF, DKIM and DMARC records, so Microsoft 365 uses implicit email authentication for inbound mail. It extends the regular (explicit) SPF, DKIM and DMARC checks with signals such as sender reputation, sender history, recipient history and behavioral analysis. The combined result is the compauth value, and it uses the From domain as the basis of evaluation.
Microsoft describes three layers:
Explicit DMARC failures from domains with p=quarantine or p=reject are handled by the anti-phishing policy setting Honor DMARC record policy when the message is detected as spoof. Turning spoof intelligence off disables only the implicit protection from composite authentication.
Open the message source (in Outlook: File > Properties, or View message source in Outlook on the web) and paste the headers into the Email Header Analyzer. Microsoft 365 writes a line like this one, adapted from Microsoft's own example:
Authentication-Results: spf=pass (sender IP is 198.51.100.10) smtp.mailfrom=bounces.vendor.example; dkim=pass (signature was verified) header.d=vendor.example; dmarc=fail action=oreject header.from=example.com;compauth=fail reason=000
| Field | What it tells you |
|---|---|
spf | pass, fail (hard fail, -all), softfail (~all), neutral (?all), none (no SPF record, or no result), temperror or permerror (for example a badly formatted record). |
smtp.mailfrom | The MAIL FROM domain (5321.MailFrom, P1 sender, envelope sender) that SPF checked. It is used for bounce messages. |
dkim | pass, fail (reason) or none (the message wasn't signed). |
header.d | The domain in the DKIM signature, which is queried for the public key. |
dmarc | pass, fail, bestguesspass (the domain has no DMARC record, but the message would have passed if it had one) or none (no DMARC record). |
action | What the spam filter did with the DMARC result: none; oreject (the sender's policy is p=reject); pct.quarantine or pct.reject (the message failed DMARC, but the policy's pct was below 100 and the action wasn't applied to this message); permerror (for example a malformed DMARC record) or temperror. |
header.from | The domain of the From address (5322.From, P2 sender) that recipients see. compauth and DMARC are judged against this domain. |
compauth and reason | The composite verdict and its three-digit reason code (tables below). |
In the example, SPF and DKIM both passed, but for the vendor's domains, not example.com. DMARC failed for lack of alignment, the sender's policy is reject, and compauth failed with reason 000.
The X-Forefront-Antispam-Report header adds context: CAT:SPOOF marks a spoofing verdict, SFTY:9.11 intra-org spoofing and SFTY:9.22 cross-domain spoofing. The DIR field shows INB, OUT or INT for inbound, outbound or internal.
| Result | Meaning | Reason codes |
|---|---|---|
pass | The message passed explicit or implicit authentication. | 1xx, 7xx |
fail | The message failed explicit or implicit authentication. | 000, 001, 002, 010, 6xx |
softpass | The message soft-passed implicit authentication. | 2xx |
none | The message wasn't checked for composite authentication (3xx), or bypassed it (4xx, 9xx). | 3xx, 4xx, 9xx |
Microsoft also documents 501 and 502 (DMARC not enforced for valid bounce messages) without tying them to one of these results.
These are the codes Microsoft documents in its anti-spam message headers reference. For a code that isn't listed, the range row (1xx, 2xx, 3xx, 4xx, 6xx, 7xx, 9xx) is the only documented meaning.
| Code | compauth | Meaning |
|---|---|---|
000 | fail | Failed explicit authentication: the message failed DMARC and the sender's DMARC policy is p=quarantine or p=reject. |
001 | fail | Failed implicit authentication: the sending domain has no email authentication records, or only weak ones (SPF ~all or ?all, or DMARC p=none). |
002 | fail | Your organization has a policy, configured by an admin, that explicitly prohibits this sender/domain pair from sending spoofed email. |
010 | fail | Failed DMARC with p=reject or p=quarantine, and the From domain is one of your own accepted domains (self-to-self or intra-org spoofing). |
1xx | pass | Passed explicit or implicit authentication. |
100 | pass | SPF or DKIM passed and the MAIL FROM and From domains are aligned. |
101 | pass | DKIM-signed by the domain in the From address. |
102 | pass | The MAIL FROM and From domains are aligned and SPF passed. |
103 | pass | The From domain aligns with the PTR record (reverse DNS) of the source IP address. |
104 | pass | The PTR record of the source IP address aligns with the From domain. |
108 | pass | DKIM failed because of a body change attributed to earlier legitimate hops, for example your on-premises email environment. |
109 | pass | The sender's domain has no DMARC record, but the message would pass anyway. |
111 | pass | DMARC returned a temporary or permanent error, but the SPF or DKIM domain aligns with the From domain. |
112 | pass | A DNS timeout prevented the DMARC record from being retrieved. |
115 | pass | Sent from a Microsoft 365 organization where the From domain is configured as an accepted domain. |
116 | pass | The MX record of the From domain aligns with the PTR record of the connecting IP address. |
130 | pass | The ARC result from a trusted ARC sealer overrode the DMARC failure. |
2xx | softpass | Soft-passed implicit authentication. |
201 | softpass | The PTR record for the From domain aligns with the subnet of the PTR record for the connecting IP address. |
202 | softpass | The From domain aligns with the domain of the PTR record for the connecting IP address. |
3xx | none | Not checked for composite authentication. |
4xx | none | Bypassed composite authentication. |
501 | (not stated) | DMARC wasn't enforced: a valid bounce (NDR), and contact between sender and recipient was previously established. |
502 | (not stated) | DMARC wasn't enforced: a valid bounce (NDR) for a message sent from this organization. |
6xx | fail | Failed implicit authentication. |
601 | fail | The sending domain is an accepted domain in your organization (self-to-self or intra-org spoofing). |
7xx | pass | Passed implicit authentication. |
701–704 | pass | DMARC wasn't enforced because your organization has a history of receiving legitimate mail from this sending infrastructure. |
9xx | none | Bypassed composite authentication. |
905 | none | DMARC wasn't enforced because of complex routing, for example internet mail routed through on-premises Exchange or a non-Microsoft service before reaching Microsoft 365. |
Reason 000 is an explicit failure: the From domain publishes an enforcing DMARC policy and the message didn't pass it. The usual cause is a service sending as the domain with its own identities. Microsoft's example is a partner whose marketing platform sends From: sender@fabrikam.com with MAIL FROM bounces@adatum.com and a DKIM signature for adatum.com. SPF and DKIM both pass for adatum.com, DMARC fails because neither aligns with fabrikam.com, and compauth fails. Email marketing platforms, cloud email gateways and relay or shared hosting services are the common sources.
The fix belongs to the owner of the From domain (you, or the partner):
marketing.example.com, with its own SPF and DKIM.The DMARC fail with SPF pass guide walks through alignment in detail. If dkim=fail (body hash did not verify) appears, something changed the message after signing; see how to fix DKIM body hash did not verify.
Reason 001 shows up when the From domain has no SPF, DKIM or DMARC, or only ~all, ?all or p=none, and Microsoft's implicit signals didn't vouch for the sender. Microsoft's examples show both sides: a domain with no records fails with 001, while the same domain with an SPF pass for the From domain, or an aligned DKIM signature, can pass as dmarc=bestguesspass with compauth=pass reason=109.
~all while you find the rest, then moving to -all.If it is someone else's domain, ask them to do this. As the recipient you can only work around it, with spoof intelligence or an allow entry (see the last resort below).
These codes mean the From domain is one of your accepted domains, but the message came in from outside without authenticating as you: 601 (and the 6xx range) for an implicit failure, 010 when your own DMARC policy is quarantine or reject. Microsoft counts mail between your accepted domains, and between subdomains of the same domain, as intra-org too. The X-Forefront-Antispam-Report header shows SFTY:9.11.
Legitimate causes are usually an app, scanner, website form or SaaS tool sending as your domain straight to your MX. Find the source IP in the route of the Email Header Analyzer, then either authorize it in your SPF record or have it DKIM-sign with your domain. Mail sent from a Microsoft 365 organization where the From domain is an accepted domain is listed as a pass (reason 115), so sending through your tenant instead of straight to your MX is one way to avoid it, if the device supports that. If the source is unknown, treat it as a real spoofing attempt.
Reason 002 isn't an authentication problem: someone in your organization blocked that sender/domain pair from spoofing. Check the block entries on the Spoofed senders tab of the Tenant Allow/Block Lists page in the Microsoft Defender portal, and remove the entry if it was a mistake.
When your MX points to a non-Microsoft filter, a filtering appliance or on-premises Exchange, Microsoft 365 sees the IP of the last hop in front of it, not the real sender. SPF is checked against the gateway's IP address, so it fails for most senders, and a gateway that rewrites links or adds banners breaks DKIM. Reason 905 (DMARC not enforced because of complex routing) is a sign of this.
X-MS-Exchange-ExternalOriginalInternetSender.d= value from the ARC-Seal header, in the Defender portal or with Set-ArcConfig -Identity Default -ArcTrustedSealers. That parameter replaces the whole list, so include the existing sealers too. A pass through a trusted sealer shows as reason 130.For a legitimate sender you can't get fixed, create an allow entry on the Spoofed senders tab of the Tenant Allow/Block List (or override the verdict in the spoof intelligence insight). An entry is a domain pair:
*./24 if it has no PTR record, a verified DKIM domain, or *.New-TenantAllowBlockListSpoofItems -Identity Default -Action Allow -SpoofedUser bob@contoso.com -SendingInfrastructure contoso.com -SpoofType External
Only that exact pair is allowed to spoof, the limit is 1,024 spoofed-sender entries (allow and block combined), and the entries never expire, so review them. Microsoft calls this the short-term resolution; the long-term one is fixing the sender's SPF and DKIM. Avoid allowed sender and allowed domain lists in anti-spam policies: those senders bypass most of the filtering stack.
compauth=pass with a 1xx reason, ideally 100, 101 or 102, and dmarc=pass.dmarc=fail with spf=pass or dkim=pass? It's alignment: follow how to fix DMARC fail with SPF pass.Need SPF, DMARC and MX checks across a whole client list? Run the Bulk SPF / DMARC / MX Auditor on Apify ($2 per 1,000 domains).
Decode Authentication-Results, compauth and the spam headers with the Email Header Analyzer, check the sender with the SPF Record Checker, DKIM Checker and DMARC Record Checker, audit a domain in one pass with the Email Deliverability Checker, and see every source in the DMARC Report Analyzer. Related guides: DMARC fail with SPF pass (alignment), DKIM body hash did not verify, DMARC for Microsoft 365 and SPF for Microsoft 365.
Composite authentication (compauth) is the verdict Microsoft 365 stamps in the Authentication-Results header after combining SPF, DKIM, DMARC and its own implicit signals for the From domain. compauth=fail means it could not confirm the From domain, and the reason code says why: 000 is an explicit DMARC failure, 001 an implicit failure, 6xx intra-org spoofing.
No. Microsoft says a composite authentication failure does not directly block a message. Spoof intelligence and the anti-phishing policy decide: the message may be delivered, moved to Junk Email or quarantined. Failures for p=reject domains can be rejected when the Honor DMARC record policy setting is on.
Reason 001 is an implicit failure: the sending domain has no SPF, DKIM or DMARC records, or only weak ones such as ~all, ?all or p=none, and Microsoft could not otherwise vouch for it. An SPF or DKIM pass for the From domain itself can turn this into dmarc=bestguesspass with compauth=pass reason=109.
Reason 601 (part of the 6xx range) means intra-org or self-to-self spoofing: the From domain is one of your accepted domains, but the message arrived from outside without authenticating as you. Authorize the real source in SPF or have it DKIM-sign with your domain, or treat it as an attack if the source is unknown.
Only as a last resort. An allow entry lets one spoofed user and sending infrastructure pair through, and spoofed-sender entries never expire. Fix SPF and DKIM at the source first, use Enhanced Filtering for Connectors for your own gateways, and trusted ARC sealers for services that modify mail.
Runbooks, checklists and helpdesk templates: IT Admin Packs on Gumroad.