Skip to main content
by DMARCguard Team
23 min read

SPF PermError: What Causes It and How to Fix It Step-by-Step

In our SPF Supply Chain Study, we scanned 5,499,028 domains and found 148,655 with SPF configurations that exceed the 10-lookup limit — the most common trigger for SPF PermError. If your emails are silently failing authentication, an invalid SPF record is one of the most likely culprits.

SPF PermError is a permanent Sender Policy Framework evaluation failure that cascades into DMARC failure, causing legitimate email to land in spam or get rejected outright. Most domain administrators do not know they have one until email deliverability drops and recipients stop receiving messages.

The root cause is a supply chain problem: every SaaS email service you add — marketing automation, CRM, support desk, HR platform — adds include: mechanisms to your SPF record and pushes you closer to the RFC-defined limit. The failure is silent. There is no bounce notification or error log on the sending side. The only way to discover a PermError is to check your record with a tool or notice the impact in DMARC aggregate reports.

This guide covers every cause of PermError, how to diagnose it with free tools, and step-by-step fixes with real DNS record examples. Whether you manage a single domain or hundreds, you will leave with a clear action plan.

What Is SPF PermError?

SPF PermError is a permanent error returned when a receiving mail server cannot evaluate your SPF record. Unlike a temporary DNS timeout, PermError means your SPF record itself is broken — and every email sent from your domain fails SPF authentication until you fix it.

RFC 7208 Section 2.6.7 defines PermError as a result code meaning “the domain’s published records could not be correctly interpreted.” This is not a judgment on whether the sender is authorized — it means the record is unreadable. The receiving server cannot make any determination at all.

Understanding how SPF evaluation works clarifies why PermError is distinct from other results. When a receiving server gets an email, it queries the Return-Path (envelope sender) domain’s DNS TXT record, walks the entire include chain, and returns one of seven results: Pass, Fail, SoftFail, Neutral, None, TempError, or PermError.

PermError is not the same as SPF Fail. A Fail (-all) means the sending server is explicitly unauthorized. A PermError means the SPF record is so broken that the server cannot even determine whether the sender is authorized or not.

SPF PermError vs SPF Fail vs SPF SoftFail
ResultMeaningRecord Is Valid?DMARC Treatment
PermErrorRecord cannot be interpretedNoTreated as “fail”
FailSender is explicitly not authorizedYesTreated as “fail”
SoftFailSender is not authorized but accept mailYesTreated as “fail”

How Common Is SPF PermError? (DMARCguard Research Data)

SPF PermError is more common than most administrators realize. Our first-party research data quantifies the scale of the problem across the internet.

DMARCguard’s SPF Supply Chain Study (2026) scanned 5,499,028 domains from the Tranco Top Sites list, walking every SPF include chain to count actual DNS lookups. Of the 3,077,219 domains with valid SPF records, 148,655 exceeded the 10-DNS-lookup limit — the most common PermError trigger. That is 4.8% of all SPF-enabled domains, or 2.7% of all domains scanned.

Independent research confirms the scale. A 2024 analysis by DMARC Checker / Wulfsoft of the top 1 million domains found approximately 2% with invalid SPF setups, with approximately 13,000 (1.3%) having multiple SPF records — an instant PermError trigger.

The underlying cause is a supply chain problem. Every SaaS email service you add — marketing, CRM, support, HR — adds include: mechanisms to your SPF record and pushes you closer to the 10-lookup ceiling.

Our study found that the include mechanism accounts for 32.3% of all SPF mechanisms across 5.5 million domains. Microsoft 365 is the #1 SPF include (19.6% of domains), Google Workspace #2 (13.6%).

Vendor-reported data from AutoSPF (2025) across 1,200 onboarded domains breaks down the causes: 62% of PermErrors were caused by multiple SPF records, 24% by exceeding the 10-lookup limit, 8% by malformed syntax, and 6% by modifier errors. The average lookup count before remediation was 9.6 — just under the limit (vendor-reported; sample skewed toward domains with existing SPF issues).

What Causes SPF PermError? (5 Root Causes)

SPF PermError has five distinct root causes. Each one triggers the same result — a broken, unreadable SPF record — but each requires a different fix.

Cause 1: Too Many DNS Lookups (The 10-Lookup Limit)

RFC 7208 Section 4.6.4 limits SPF evaluation to 10 DNS-querying mechanisms. The mechanisms that count toward this limit are: include, a, mx, redirect, exists, and ptr (deprecated). Exceeding 10 total lookups triggers PermError.

Mechanisms that do not count: ip4, ip6, all, and the exp modifier. These are resolved locally without DNS queries.

The problem compounds quickly with real-world email stacks. Most major providers use flat ip4:/ip6: ranges with no nested includes, so each include: costs exactly 1 DNS lookup. Google Workspace (1), Microsoft 365 (1), Mailchimp (1), SendGrid (1), HubSpot (1), and Zendesk (1) all cost 1 lookup each. The exception is Salesforce, whose _spf.salesforce.com record uses an exists: macro that adds a second lookup (2 total). With 9 services you hit the ceiling — and enterprise email stacks routinely exceed that count.

Our study confirms the pressure: the include mechanism accounts for 32.3% of all SPF mechanisms across 5.5 million domains — making it the single biggest lookup consumer.

What Counts as a DNS Lookup vs What Does Not
Mechanism / ModifierCounts as DNS Lookup?Why
include:YesTriggers DNS query for another SPF record
a / a:YesTriggers DNS A record lookup
mx / mx:YesTriggers DNS MX record lookup
redirect=YesTriggers DNS query for replacement record
exists:YesTriggers DNS A record existence check
ptr (deprecated)YesTriggers reverse DNS lookup
ip4:NoContains literal IP — no DNS query needed
ip6:NoContains literal IP — no DNS query needed
allNoCatch-all mechanism — no DNS query needed
exp=NoExplanation modifier — evaluated post-match

Here is an example of an SPF record that exceeds the 10-lookup limit:

SPF Over-Limit Example dns
; SPF record with 11 DNS lookups — triggers PermError
v=spf1 include:_spf.google.com           ; 1 lookup — corporate email
      include:spf.protection.outlook.com ; 1 lookup — corporate email
      include:sendgrid.net               ; 1 lookup — transactional email
      include:servers.mcsv.net           ; 1 lookup — email marketing (Mailchimp)
      include:_spf.salesforce.com        ; 2 lookups — CRM (1 include + 1 exists macro)
      include:mktomail.com               ; 1 lookup — marketing automation (Marketo)
      include:_spf.hubspotemail.net      ; 1 lookup — marketing automation (HubSpot)
      include:mail.zendesk.com           ; 1 lookup — customer support
      include:spf.mandrillapp.com        ; 1 lookup — transactional email (Mandrill)
      include:amazonses.com              ; 1 lookup — transactional email (Amazon SES)
      ~all
; Total: 11 lookups — PermError (limit is 10)

Cause 2: Multiple SPF Records on One Domain

RFC 7208 Section 3.2 states that a domain MUST NOT have more than one SPF record. If a receiving server finds two v=spf1 TXT records on the same domain, it returns PermError for all email from that domain.

This is the #1 cause of PermError by frequency. Vendor-reported data from AutoSPF attributes 62% of PermErrors to multiple SPF records (sample is domains onboarded to AutoSPF).

How it happens: different teams or vendors each add their own SPF record instead of merging into the existing one. During an email provider migration, the IT team adds a new SPF record for the new provider without removing the old one. In a documented case, an e-commerce company experienced a 30% deliverability drop from dual SPF records during a provider migration (Infraforge, citing Mailforge Blog, 2023).

The error is silent. You will not see a bounce or error message. Emails simply fail SPF authentication at the receiver, and the only way to discover it is to check with a tool or see the impact in DMARC reports.

Multiple SPF Records Using dig bash
# Example: dig reveals two v=spf1 records — instant PermError
$ dig TXT example.com +short
"v=spf1 include:_spf.google.com ~all"
"v=spf1 include:spf.protection.outlook.com ~all"

# Fix: merge into a single record
"v=spf1 include:_spf.google.com include:spf.protection.outlook.com ~all"

Cause 3: SPF Syntax Errors

Malformed SPF records trigger PermError because the receiving server cannot parse the record. Common syntax errors include typos, spacing issues, and invalid mechanism formatting.

Common SPF Syntax Errors and Corrections
ErrorWrongCorrect
Space in version tagv=spf 1v=spf1
Space in CIDR notationip4:192.168.1.0 /24ip4:192.168.1.0/24
Double qualifier at end~all -all~all or -all not both
Missing v=spf1 prefixinclude:... ~allv=spf1 include:... ~all
Colon after allall:-all

Vendor-reported data attributes 8% of PermErrors to malformed syntax (AutoSPF, 2025).

SPF Record Syntax Quick Reference

A valid SPF record follows this structure: v=spf1 [mechanisms] [qualifier]all. The v=spf1 prefix is mandatory and must be the first element. Each mechanism authorizes a set of senders; the trailing all mechanism with a qualifier sets the default policy for unlisted senders.

SPF Record Syntax: Mechanisms and Qualifiers
ElementSyntax ExamplePurpose
include:include:_spf.google.comAuthorize all IPs in another domain’s SPF record
ip4:ip4:192.0.2.0/24Authorize an IPv4 address or CIDR range
ip6:ip6:2001:db8::/32Authorize an IPv6 address or CIDR range
aa or a:mail.example.comAuthorize the A record IP(s) of a domain
mxmx or mx:example.comAuthorize the MX record IP(s) of a domain
redirect=redirect=_spf.example.comReplace this record with another domain’s SPF record
exists:exists:%{i}._spf.example.comPass if DNS A record exists (advanced macro use)
+ (Pass)+allDefault qualifier — authorize the sender
- (Fail)-allExplicitly reject unlisted senders
~ (SoftFail)~allMark unlisted senders as suspicious but accept
? (Neutral)?allNo assertion — treat as if no SPF exists

Cause 4: Void Lookup Limit Exceeded

RFC 7208 Section 4.6.4 specifies that SPF evaluation must not produce more than 2 void lookups — DNS queries that return either NXDOMAIN (domain does not exist) or an empty answer. Exceeding this limit triggers PermError.

This happens when include: targets no longer exist. A vendor changed their SPF domain, a service was decommissioned, or there is a typo in the include target. Each of these dead references counts as a void lookup.

For example, if your SPF record contains include:old-vendor-spf.example.com and include:decomissioned.example.com, and neither domain has a DNS record, both queries return NXDOMAIN — hitting the 2-void-lookup ceiling and triggering PermError.

Cause 5: Infinite Loops and Circular Includes

If a.example.com includes b.example.com which includes a.example.com, the SPF evaluation enters an infinite loop and cannot terminate. Per RFC 7208, this produces PermError.

Circular includes are rare but devastating — they affect all email from the domain until the circular reference is resolved. They typically occur when DNS records are managed by multiple teams without coordination or when a redirect= modifier points to a domain that redirects back.

SPF Results Explained: Pass, Fail, SoftFail, PermError, TempError, None

Understanding all SPF result codes helps you distinguish PermError from other failures and determine the correct fix. Our study found that 53.6% of domains use softfail (~all), while 40.2% use hardfail (-all).

Complete SPF Result Codes
ResultRFC QualifierMeaningDMARC TreatmentReceiver Action
Pass+allSender is authorizedSPF aligned (pass)Accept
Fail-allSender is explicitly not authorizedSPF not alignedReject or quarantine
SoftFail~allSender is probably not authorizedSPF not alignedAccept but mark suspicious
Neutral?allNo assertion about senderSPF not alignedAccept (treat as if no SPF)
NoneNo SPF record foundSPF not alignedAccept (no policy)
TempErrorTemporary DNS failureRetry laterAccept or defer
PermErrorRecord is broken and cannot be evaluatedTreated as “fail”Accept or reject (receiver-dependent)

The critical distinction: PermError is permanent (your record is broken and needs fixing), while TempError is transient (a DNS timeout or server issue that resolves on its own). DMARC treats PermError as a “fail” for alignment purposes, which means your SPF PermError cascades into the DMARC evaluation — the subject of the next section.

Why SPF PermError Breaks DMARC (The Cascade Effect)

A broken SPF record does not just fail SPF — it cascades into DMARC failure and can cause legitimate email to be quarantined or rejected.

Here is the chain reaction:

  1. SPF PermError — the receiving server cannot evaluate your SPF record
  2. DMARC treats SPF as “fail” — PermError means SPF alignment is not established
  3. DMARC falls back to DKIM — the only remaining authentication mechanism
  4. If DKIM also fails (key rotation, forwarding, misconfigured selector) — DMARC has no aligned authentication
  5. DMARC result = fail — email is quarantined or rejected per your domain’s DMARC policy
Flow diagram: SPF PermError leads to DMARC failure when DKIM also fails, resulting in email quarantine or rejection
The SPF PermError cascade: when SPF returns PermError, DMARC relies solely on DKIM alignment. If DKIM also fails, the email is quarantined or rejected.
Flow diagram: SPF PermError leads to DMARC failure when DKIM also fails, resulting in email quarantine or rejection

The SPF PermError cascade: when SPF returns PermError, DMARC relies solely on DKIM alignment. If DKIM also fails, the email is quarantined or rejected.

The business impact is measurable. Vendor-reported data from AutoSPF (2025) shows domains with duplicate SPF records or over-limit policies triggered PermErrors on up to 8.7% of messages. Domains with valid, lookup-budget-conscious SPF had 24-38% fewer spam-folder placements (vendor-reported).

A documented case illustrates the cascade at scale: a multi-vendor retailer using 11 third-party email senders accumulated 17 DNS lookups in their SPF record — 7 over the RFC 7208 limit. During peak sending hours, 6-12% of outbound messages failed SPF authentication. With DMARC enforcement, these cascaded into DMARC failures and spam-foldering (AutoSPF case study, 2025; vendor-reported).

The enforcement context makes this urgent. As reported in our Email Authentication Adoption Study 2026, Google’s 2024 DMARC enforcement push resulted in 265 billion fewer unauthenticated messages — a 65% reduction. Enforcement is tightening, and SPF PermError is no longer something receivers will silently tolerate.

How to Find SPF PermError

Before you can fix a PermError, you need to identify exactly what is broken. Follow these three diagnostic steps.

Step 1: Check Your SPF Record

Use DMARCguard’s free SPF record checker to see your full SPF record with syntax validation, lookup count, and any errors flagged. Paste your domain and the tool immediately shows whether you have a PermError condition.

Alternatively, check from the command line:

Check SPF From Terminal bash
# Check your SPF record from the terminal
$ dig TXT your-domain.com +short | grep spf
"v=spf1 include:_spf.google.com include:sendgrid.net ~all"

If you see two lines starting with v=spf1, you have duplicate SPF records — an instant PermError (Cause 2).

DMARCguard SPF checker showing a PermError result with 11 DNS lookups and error details highlighted
DMARCguard's free SPF checker flags PermError conditions, counts DNS lookups, and identifies the specific cause.
DMARCguard SPF checker showing a PermError result with 11 DNS lookups and error details highlighted

DMARCguard's free SPF checker flags PermError conditions, counts DNS lookups, and identifies the specific cause.

Step 2: Count Your DNS Lookups

Walk the include chain manually or use the SPF checker to see your total lookup count. Each include, a, mx, redirect, and exists counts as one lookup. Each nested include within those counts as additional lookups.

Here is a manual walkthrough for a common configuration:

Example SPF Walkthrough dns
v=spf1 include:_spf.google.com include:sendgrid.net include:spf.protection.outlook.com ~all

Lookup 1: _spf.google.com
v=spf1 ip4:74.125.0.0/16 ip4:209.85.128.0/17 ip6:2001:4860:4864::/56 ... ~all
  → Flat IP ranges only — no nested includes

Lookup 2: sendgrid.net
  → TXT query costs 1 lookup

Lookup 3: spf.protection.outlook.com
v=spf1 ip4:40.92.0.0/15 ip4:40.107.0.0/16 ip4:52.100.0.0/15 ... -all
  → Flat IP ranges only — no nested includes

Total: 3 lookups — well under the limit
Most major providers resolve to flat ip4/ip6 ranges with no nested includes.
Each include: costs exactly 1 lookup regardless of how many IPs it contains.

For automated counting and optimization, use DMARCguard’s SPF flattener.

Step 3: Validate SPF Syntax

Check for the common syntax errors listed in Cause 3 above. Verify that only one v=spf1 TXT record exists (Cause 2). Confirm that all include targets actually resolve — dead includes count toward the 2-void-lookup limit (Cause 4).

For a comprehensive domain-level check that covers SPF, DKIM, DMARC, and more in a single scan, use the domain health check.

How to Fix SPF PermError (Step-by-Step)

Once you have identified the cause, apply the appropriate fix. Here are five fixes, ordered from most common to least common.

Fix 1: Remove Duplicate SPF Records

If dig TXT your-domain.com returns two v=spf1 records, merge them into one. Keep the record that contains the most authorized senders, and add any missing include: mechanisms from the second record.

Merge Multiple SPF Records into One dns
; BEFORE: Two separate SPF records — instant PermError
Record 1: "v=spf1 include:_spf.google.com ~all"
Record 2: "v=spf1 include:spf.protection.outlook.com ~all"

; AFTER: Single merged record — valid
"v=spf1 include:_spf.google.com include:spf.protection.outlook.com ~all"

Delete the duplicate TXT record in your DNS provider’s dashboard. DNS changes may take up to 48 hours to propagate fully, though most propagate within 1-4 hours.

Fix 2: Reduce DNS Lookups with SPF Flattening

Replace include: mechanisms with their resolved ip4: and ip6: addresses to reduce your total lookup count below 10.

SPF Flattening dns
; BEFORE: 11 lookups — triggers PermError
v=spf1 include:_spf.google.com           ; 1 lookup
      include:spf.protection.outlook.com ; 1 lookup
      include:sendgrid.net               ; 1 lookup
      include:servers.mcsv.net           ; 1 lookup (Mailchimp)
      include:_spf.salesforce.com        ; 2 lookups (1 include + 1 exists)
      include:mktomail.com               ; 1 lookup (Marketo)
      include:_spf.hubspotemail.net      ; 1 lookup (HubSpot)
      include:mail.zendesk.com           ; 1 lookup (Zendesk)
      include:spf.mandrillapp.com        ; 1 lookup (Mandrill)
      include:amazonses.com              ; 1 lookup (Amazon SES)
      ~all
; Total: 11 lookups — PermError

; AFTER: Flatten 6 low-churn services to ip4: ranges — 4 lookups remaining
v=spf1 include:_spf.google.com           ; 1 lookup (keep — high IP churn)
      include:spf.protection.outlook.com ; 1 lookup (keep — high IP churn)
      include:_spf.salesforce.com        ; 2 lookups (keep — uses exists macro)
      ip4:205.201.128.0/20               ; Mailchimp (flattened)
      ip4:148.105.0.0/16                 ; Mailchimp (flattened)
      ip4:199.15.212.0/22                ; Marketo (flattened)
      ip4:185.28.196.0/22                ; Marketo (flattened)
      ip4:188.172.128.0/20               ; Zendesk (flattened)
      ip4:216.198.0.0/18                 ; Zendesk (flattened)
      ~all
; Total: 4 lookups + flattened ip4 entries
Side-by-side comparison of an SPF record before flattening (11 DNS lookups) and after flattening (4 DNS lookups)
SPF flattening replaces include: mechanisms with resolved ip4: ranges, reducing DNS lookups from 11 to 4 in this example.
Side-by-side comparison of an SPF record before flattening (11 DNS lookups) and after flattening (4 DNS lookups)

SPF flattening replaces include: mechanisms with resolved ip4: ranges, reducing DNS lookups from 11 to 4 in this example.

Use DMARCguard’s SPF flattener for automated flattening that tracks provider IP changes.

Fix 3: Use Subdomain Delegation

Move high-lookup senders to subdomains. For example, configure Mailchimp to send from marketing.your-domain.com and Salesforce from crm.your-domain.com. Each subdomain gets its own SPF record with its own 10-lookup budget via the Return-Path (MAIL FROM) domain.

This works with relaxed DMARC alignment (aspf=r), which is the default. It breaks with strict alignment (aspf=s), because the subdomain does not exactly match the organizational domain.

Subdomain delegation is the most scalable long-term solution for organizations with 5 or more email sending services. It avoids the fragility of static flattening and the maintenance burden of IP tracking.

Fix 4: Consolidate Unused Include Mechanisms

Audit your SPF record. Which includes are still active? Old CRM, decommissioned marketing tool, migrated email provider — remove them.

Over time, SPF records accumulate includes from services you no longer use. Each one costs at least one DNS lookup and serves no purpose. Vendor-reported data from AutoSPF shows that targeted cleanup and flattening reduced average lookups by 41% across 1,000+ managed domains (vendor-reported).

Fix 5: Fix Syntax Errors

Reference the common errors table from Cause 3. After every change, validate your record with an SPF checker to confirm it parses correctly.

If you need to generate a correct SPF record from scratch, use DMARCguard’s SPF record generator — select your email services and it builds a syntactically valid record.

SPF PermError Fixes: Summary
FixWhen to UseEffortDurability
Merge duplicate recordsTwo v=spf1 records on one domainMinutesPermanent
SPF flatteningOver 10 DNS lookupsHoursRequires maintenance
Subdomain delegation5+ email sending servicesHoursPermanent (scalable)
Remove unused includesStale or decommissioned servicesMinutesPermanent
Fix syntax errorsTypos or malformed recordMinutesPermanent

Each email service’s include: mechanism consumes a different number of DNS lookups. Use this table to budget your 10-lookup limit.

DNS Lookup Cost per Email Service
ServiceInclude MechanismLookupsNotes
Google Workspaceinclude:_spf.google.com1Flat ip4/ip6 ranges, no nesting
Microsoft 365include:spf.protection.outlook.com1Flat ip4/ip6 ranges, no nesting
SendGrid (Twilio)include:sendgrid.net1Costs 1 lookup
Mailchimpinclude:servers.mcsv.net1Flat ip4 ranges, no nesting
Salesforceinclude:_spf.salesforce.com21 include + 1 exists: macro
Marketo (Adobe)include:mktomail.com1Flat ip4 ranges, no nesting
Mailchimp Transactionalinclude:spf.mandrillapp.com1Flat ip4 ranges, no nesting
Amazon SESinclude:amazonses.com1Flat ip4 ranges, no nesting
HubSpotinclude:_spf.hubspotemail.net1Flat ip4 ranges, no nesting
Zendeskinclude:mail.zendesk.com1Flat ip4 ranges, no nesting

Combination example: Most providers cost exactly 1 lookup each. Google Workspace (1) + Microsoft 365 (1) + SendGrid (1) + Mailchimp (1) + Salesforce (2) + HubSpot (1) + Zendesk (1) + Marketo (1) + Amazon SES (1) = 10 lookups. You are at the limit with 9 services. Add one more include: or an a/mx mechanism and you trigger PermError.

From our study: Microsoft 365 is the #1 SPF include, appearing in 19.6% of SPF-enabled domains. Google Workspace is #2 at 13.6%. Together, these two providers appear in roughly one-third of all SPF records across 5.5 million domains (DMARCguard SPF Supply Chain Study, March 2026).

Platform-Specific PermError Scenarios

These are real-world email stacks that commonly trigger PermError. Each scenario includes the full SPF record, annotated lookup count, and the recommended fix.

Enterprise Stack: 10 Services (At the Limit)

Example Enterprise Email Stack dns
v=spf1 include:_spf.google.com           ; 1 lookup
      include:sendgrid.net               ; 1 lookup
      include:servers.mcsv.net           ; 1 lookup (Mailchimp)
      include:_spf.salesforce.com        ; 2 lookups (1 include + 1 exists macro)
      include:mktomail.com               ; 1 lookup (Marketo)
      include:_spf.hubspotemail.net      ; 1 lookup (HubSpot)
      include:mail.zendesk.com           ; 1 lookup (Zendesk)
      include:amazonses.com              ; 1 lookup (Amazon SES)
      a                                  ; 1 lookup (own mail server)
      ~all
; Total: 10 lookups — exactly at the limit
; Adding any include: or a/mx mechanism = PermError

Fix: Flatten low-churn services (Mailchimp, Marketo, Zendesk, Amazon SES) to ip4: ranges — each one saved frees a lookup. Or delegate marketing and transactional email to subdomains like marketing.your-domain.com and crm.your-domain.com, each with its own 10-lookup budget.

Growth-Stage SaaS: Microsoft 365 + 5 Services

Growth-Stage SaaS Email Stack dns
v=spf1 include:spf.protection.outlook.com   ; 1 lookup (Microsoft 365)
      include:_spf.hubspotemail.net         ; 1 lookup (HubSpot)
      include:mktomail.com                  ; 1 lookup (Marketo)
      include:sendgrid.net                  ; 1 lookup
      include:servers.mcsv.net              ; 1 lookup (Mailchimp)
      include:mail.zendesk.com              ; 1 lookup (Zendesk)
      ~all
; Total: 6 lookups — under the limit, but 4 more services triggers PermError

This combination is safe today, but growth brings risk. Every new SaaS tool that sends email — HR onboarding, invoicing, project management — adds another include: to the budget. In a documented case, a marketing agency’s client sending newsletters through Marketo saw nearly 50% hard bounce rates when their SPF record either lacked Marketo’s include or exceeded the lookup limit from combining multiple service includes (SRPro Marketing, 2023).

Fix: If you need to add more services, delegate marketing email to a subdomain or start flattening low-churn services to IP ranges. If you manage SPF records across multiple client domains, the same patterns apply — audit each domain’s lookup budget independently.

Frequently Asked Questions

What is SPF PermError?

SPF PermError is a permanent error returned when a receiving mail server cannot evaluate your domain’s SPF record. It means the record itself is broken — due to syntax errors, too many DNS lookups, or duplicate records — and every email from your domain fails SPF authentication until the record is fixed. The result code is defined in RFC 7208 Section 2.6.7.

How do I fix SPF PermError?

Identify the cause first: check for duplicate v=spf1 records, count your DNS lookups (max 10), and validate syntax. The most common fix is merging duplicate records into one, followed by reducing lookups through SPF flattening or subdomain delegation. Use a free SPF checker to diagnose the specific issue.

Can I have two SPF records on one domain?

No. RFC 7208 Section 3.2 requires exactly one SPF record per domain. If a receiving server finds two v=spf1 TXT records, it must return PermError, failing SPF authentication for all email from that domain. Merge all authorized senders into a single SPF record.

How many DNS lookups does SPF allow?

SPF allows a maximum of 10 DNS-querying mechanisms per evaluation (RFC 7208 Section 4.6.4). The mechanisms that count are include, a, mx, redirect, exists, and ptr. The ip4, ip6, and all mechanisms do not count because they require no DNS resolution. Exceeding 10 lookups triggers PermError.

What is the difference between SPF PermError and TempError?

PermError is a permanent failure caused by a broken SPF record (syntax error, too many lookups, duplicate records). TempError is a temporary failure caused by a DNS timeout or server issue — the receiving server can retry later. DMARC treats PermError as “fail” but may retry on TempError. The distinction matters for troubleshooting: PermError requires you to fix your SPF record, while TempError typically resolves on its own.

What happens when SPF fails?

When SPF returns PermError or Fail, DMARC falls back to DKIM alignment. If DKIM also fails, the DMARC result is “fail,” and the receiving server applies the domain’s DMARC policy: quarantine (spam folder) or reject (bounce). With p=none, the email is delivered but flagged in DMARC reports. This cascade is why fixing SPF PermError is critical — it removes half of your DMARC authentication options.

Conclusion

SPF PermError is a permanent, record-level failure — not a transient DNS issue. Here are the five key takeaways:

  1. The 10-lookup limit and duplicate SPF records are the top two causes, accounting for 86% of PermError cases in vendor-reported data
  2. 148,655 domains in our 5.5-million-domain scan exceed the 10-lookup limit — placing them at PermError risk (SPF Supply Chain Study)
  3. PermError cascades into DMARC failure, directly impacting email deliverability when DKIM is also not aligned
  4. Fixes range from minutes to hours: merging duplicates takes minutes; SPF flattening and subdomain delegation take hours but provide long-term scalability
  5. Regular monitoring prevents recurrence as you add new email services over time

SPF PermError is preventable with the right tools and regular monitoring. Check your SPF record now with DMARCguard’s free SPF checker — no signup required.

If your DMARC is also failing, see our complete DMARC troubleshooting guide for a full walkthrough of DMARC authentication failures beyond SPF.