THE QUICK ANSWER
Start with the receiver’s SPF result and the identity it evaluated. Then inspect that domain’s SPF record and trace the path taken by the actual sending IP. A valid-looking record can exceed the lookup budget on a later branch, while another message passes immediately. Repair the demonstrated cause, test representative routes and preserve the evidence needed to reverse the change.
A closer look
Start with the identity the receiver checked
An SPF investigation needs a message, a receiving system and a checked identity. “The domain has an SPF problem” is too broad to assign or repair. Begin with one representative failure and preserve its timestamp, sending route and receiver result before making changes. Two messages bearing the same visible sender can take different routes and produce different evidence.
SPF normally checks the domain in the SMTP envelope MAIL FROM, which can differ from the visible From address. Use the identity reported by the receiver rather than assuming that the website domain is the one to edit. If the evidence identifies HELO instead, record that identity explicitly.
Build a small case record. Ask the sending owner to confirm which application originated the message and which service handled its final outward delivery. Ask the receiving owner for the original result where available. A copied error sentence without the surrounding identity can lead the DNS owner to a perfectly valid but unrelated record.
Keep the case narrow
This guide investigates SPF. Use the authentication guide for the relationship among SPF, DKIM and DMARC, and the bounce guide for SMTP delivery outcomes.
| Field | What to capture | Why it changes the investigation |
|---|---|---|
| Checked identity | Exact domain and whether the result identifies smtp.mailfrom or smtp.helo | Determines the DNS owner name to investigate. |
| Sending route | Application, sending account and observed connecting IP | Selects the path through the policy. |
| Receiver evidence | SPF result, full SMTP diagnostic if present, and timestamp | Keeps a protocol result separate from a delivery decision. |
| Owner | Person responsible for the sending route and person responsible for DNS | Makes the eventual repair assignable. |
References [2]
A closer look
Classify the result before choosing a remedy
A result label should change the next question. A temporary problem calls for evidence about an intermittent dependency; a permanent evaluation error calls for examination of the published policy and its path. Neither label, by itself, proves that the connecting sender should have been authorized.
The receiving system decides what to do with an authentication result. Preserve its complete response before treating an SPF label as a rejection reason. For example, a dashboard may show a failed SPF check alongside a delivered message. Your case should distinguish the check that occurred from the action that followed.
Compare a failing sample with a passing sample from the same intended workflow. Keep differences visible: source IP, envelope domain, time, recipient system and route. This comparison is often more useful than collecting many screenshots of a generic warning. Escalate to the responsible owner when the underlying evidence is unavailable; do not compensate by guessing a new authorization.
| Result | Meaning for the investigation | Next question |
|---|---|---|
| temperror | A transient evaluation problem, such as a DNS failure. | Is it reproducible, intermittent, or limited to a particular resolver or time? |
| permerror | The policy cannot be evaluated correctly, for example because of multiple SPF records or an exceeded limit. | What specific record or evaluated term causes the error? |
| fail | The evaluated policy says this sender is not authorized. | Is this an unintended route, an omitted legitimate sender, or the expected result? |
| softfail | The policy gives a weaker negative indication about the sender. | Does the intended authorization agree with the observed route? |
| pass | The evaluated policy authorizes the sender. | Does this sample represent every route included in the repair scope? |
Worked example
Separate record shape from sender authorization
Inspect the records at the exact checked owner name. Multiple SPF TXT records at that name can produce a permanent error. A single TXT resource record split into several character strings is different: the strings are joined without inserting spaces. Keep that distinction visible when a DNS interface wraps a long value.
Treat a proposed merge as an authorization decision. First inventory the routes each existing record was meant to support. Name an owner for each route, establish whether it still sends, and capture the intended result for a representative address. A syntactically tidy replacement can still break a billing system or leave a retired sender authorized.
The examples below illustrate record shape only. They are not records to paste into a live domain. In the split record, the trailing space inside the first quoted string is deliberate. In a real change, use the DNS editor’s documented input format and compare the resulting record with the approved value.
TWO SEPARATE SPF TXT RESOURCE RECORDS — conflicting policy
shape.example.org. TXT "v=spf1 ip4:192.0.2.10 -all"
shape.example.org. TXT "v=spf1 ip4:192.0.2.20 -all"
ONE TXT RESOURCE RECORD — two character strings
shape.example.org. TXT "v=spf1 ip4:192.0.2.10 " "ip4:192.0.2.20 -all"
Concatenated value of that one record:
v=spf1 ip4:192.0.2.10 ip4:192.0.2.20 -all- Different objects
The two separate records are not made into one policy simply because a control panel displays them together.
- Scope of this illustration
Both addresses are documentation addresses. The example demonstrates formatting, not an approved authorization list.
Worked example
Count the evaluated path, then inspect the DNS dependencies
The ten-term limit covers evaluated include, a, mx, ptr, exists and redirect terms, including nested evaluations. ip4, ip6 and all consume none. The first matching mechanism ends evaluation; redirect applies only when none matches. This is a term budget, not a packet count. MX and PTR also have separate expansion limits. Void lookups are a separate constraint: RFC 7208 recommends a limit of two and permits configuration.
Use the complete fictional answer inventory below to follow one IPv4 message. It contains reserved example domains and documentation addresses. TXT and address answers are assumed to be available as written; the one exception is the stated NXDOMAIN response. This is an evaluation exercise, not a live DNS test or a deployable zone file.
Write the connecting IP beside your trace. Mark each evaluated lookup-causing term in order and keep a separate note for missing answers or DNS errors. Do not add another term merely because an MX evaluation needs an address answer. Do not count an include’s policy fetch twice. The initial SPF record retrieval is not an additional term in this budget.
bounce.example.org. TXT "v=spf1 ip4:192.0.2.10 include:core.example.net include:tools.example.net redirect=last.example.net"
core.example.net. TXT "v=spf1 include:core1.example.net include:core2.example.net -all"
core1.example.net. TXT "v=spf1 ip4:198.51.100.10 -all"
core2.example.net. TXT "v=spf1 ip4:198.51.100.20 -all"
tools.example.net. TXT "v=spf1 a:relay.example.net mx:mail.example.net exists:ok.example.net include:tool1.example.net include:tool2.example.net -all"
tool1.example.net. TXT "v=spf1 ip4:198.51.100.30 -all"
tool2.example.net. TXT "v=spf1 ip4:198.51.100.40 -all"
last.example.net. TXT "v=spf1 a:backup.example.net -all"
relay.example.net. A 192.0.2.20
mail.example.net. MX 10 mxhost.example.net.
mxhost.example.net. A 192.0.2.30
backup.example.net. A 203.0.113.77
Specified negative answer: ok.example.net. A -> NXDOMAIN- The checked identity
The exercise evaluates bounce.example.org for connecting IP 203.0.113.77. Other addresses select different paths.
- What the counter represents
Numbers in the next section represent evaluated terms. They do not measure network requests, cache hits or the number of TXT records in this inventory.
References [1]
A closer look
Reconcile the failure and the proposed repair
For 203.0.113.77, the first ip4 mechanism does not match. The core branch returns fail, so its include does not match the parent; the tools branch later does the same. The parent then reaches its redirect. The table accounts for every counted term on that path.
At term 11, evaluation exceeds the budget before the backup address can authorize the message. The fact that this address appears in the inventory does not rescue the path. The exists check produced one void lookup. It did not itself exceed the recommended void limit; the demonstrated failure is the term budget.
Now suppose the fictional owner confirms that tool1 and tool2 are retired and approves removing their includes from tools.example.net. The same fallback path loses two terms: 11 minus 2 equals 9. Its backup address now matches at term 9. Record that ownership decision alongside the arithmetic; the arithmetic alone is not permission to remove working senders.
Three useful comparison cases
In this fixture, 192.0.2.10 passes with zero counted terms; 198.51.100.10 passes with two. After the approved two-include removal, 203.0.113.77 passes with nine, while an unmatched address such as 203.0.113.88 reaches -all and fails with nine. These results are calculations from the stated fixture, not measurements of any live service.
| Count | Evaluated term | Result in this fixture |
|---|---|---|
| 1–3 | include:core; then include:core1 and include:core2 | Neither leaf address matches; core ends at -all. |
| 4 | include:tools.example.net | Enters the second branch. |
| 5 | a:relay.example.net | 192.0.2.20 does not match. |
| 6 | mx:mail.example.net | Its single host resolves to 192.0.2.30; no match. |
| 7 | exists:ok.example.net | NXDOMAIN; no match and one void lookup. |
| 8–9 | include:tool1 and include:tool2 | Neither leaf matches; tools ends at -all. |
| 10 | redirect=last.example.net | The parent had no matching mechanism. |
| 11 attempted | a:backup.example.net | Budget exceeded: permerror before this term’s address lookup. |
References [1]
LIGHTSPEED LAUNCH
Send 2,000 emails a day.In just 5 days.
Put what you’ve learned to work. We bring fully aged domains, fully aged mailboxes and premium server infrastructure together for your launch.
Put it into practice
Choose a repair that preserves intended controls
Write the smallest proposed change that addresses the demonstrated cause. If the problem is duplicate records, reconcile the intended senders before producing one policy. If it is a long evaluated path, identify unnecessary branches and confirm their ownership. If it is a transient DNS failure, investigate availability before changing the authorization list.
Do not delete an active include merely to make a checker turn green. Do not replace an included policy with a one-time copy of its current addresses unless an accountable owner has accepted the ongoing update obligation. That replacement can become stale when the sending service changes. An apparent simplification can transfer maintenance work to a team that never agreed to perform it.
Keep the DNS proposal, route inventory and test cases in one change record. For each removed item, record why it is no longer required and who confirmed that conclusion. For each retained dependency, record the service or team that owns it. This makes the repair explainable when someone revisits the domain months later.
The essentials
Close the case with representative evidence
A successful test should answer the question the repair was meant to resolve. If a fallback path exceeded the budget, a message that matches the first mechanism is weak evidence for closure. Include a representative sample from the repaired branch and samples from other legitimate routes whose policy was touched.
Record the observed connecting IP and checked identity again. Compare the receiver’s result with the expected outcome and retain the timestamp and full diagnostic. When a sample takes an unexpected route, investigate the difference before declaring the DNS proposal wrong. The comparison must concern the same identity and a relevant path.
Set a rollback trigger that someone can act on: an intended route develops an error attributable to the change, a required sender loses authorization, or the published record differs from the approved value. Restoring the captured record is one possible response, but first consider whether that restores the original fault. Escalate that tradeoff to the named owner rather than hiding it in a generic “revert if needed” note.
Closure means the scoped problem has been resolved with evidence. It does not establish inbox placement or guarantee every future sending address. Leave the ongoing owner with the dependency inventory and explain what should trigger another review, such as adding a new sending application or changing a route.
Put it into practice
Copy the SPF repair handoff
Use this worksheet to turn the investigation into a reviewable request. Keep private message content out of the shared note; reference controlled evidence where necessary. The DNS owner should be able to understand the proposed edit, its affected routes and its acceptance checks without reconstructing the investigation from chat.
Leave unknowns explicit. “Owner not yet confirmed” is more useful than treating an unfamiliar include as disposable. Do not mark the repair complete until the assigned reviewer has compared the expected outcomes with representative receiver evidence.
Make the next launch easier to operate
Carry a clear sending-route inventory into your infrastructure plan. Inbox Leads can help you plan the managed sending foundation around your volume and launch requirements.
SPF investigation and repair worksheet
Copy this worksheet into your own document, then fill it in with your details.
SPF REPAIR HANDOFF Case / date / investigator: Affected workflow and business impact: Checked identity: [smtp.mailfrom or smtp.helo + exact domain] Connecting IP / route / receiver / timestamp: Observed SPF result and full diagnostic reference: Current DNS record snapshot and owner name: PATH EVIDENCE Evaluated lookup-causing terms in order: Highest evaluated term count / failing term: Void answers or separate expansion-limit findings: Passing comparison case and why its path differs: PROPOSED CHANGE Exact record change / reason: Routes retained and accountable owners: Items removed / owner confirmation for each: Expected path and outcome after change: DNS change owner / reviewer / planned window: ACCEPTANCE AND RECOVERY Representative routes and expected results: Receiver evidence references / timestamps: Rollback trigger / authorized decision owner: Captured prior value / tradeoff if restored: Open questions / next review trigger: Final disposition and reviewer:
Copy this into your own workspace. This page does not inspect a live domain, change DNS or verify a message.
Repair the demonstrated path
A useful SPF fix connects the receiver’s result to the evaluated identity, explains the failing path and preserves every intended sending route.
A LITTLE MORE CLARITY
Your questions, answered.
Why can one message pass SPF while another gets permerror for the same domain?+
Compare their connecting IPs and paths. In the worked example, one address matches immediately while another reaches an over-budget fallback branch. Use a representative failing sample to assess the repair; an early passing sample does not exercise that branch.
Does ten SPF lookups mean ten DNS packets?+
No. Keep an evaluated-term ledger like the worked example. DNS traffic can involve caching and additional answers; a packet count is not a substitute for that ledger.
Can I fix the limit by removing an include or copying its IP addresses?+
Only propose a removal after its owner confirms the route is no longer needed. Copying current addresses creates a maintenance obligation that can outlive the investigation. Record who will keep that authorization accurate before accepting such a design.
What should I send to the person who manages DNS?+
Send the checked identity, receiver evidence, current record, failing path, exact proposed edit and representative acceptance cases. Include a named reviewer and recovery decision owner. The worksheet above brings those pieces into one assignable handoff.
Sources and further reading
READY FOR A PREPARED LAUNCH?
Build on a managed sending foundation.
Tell us the volume you want to support and when you want to launch. Request an Inbox Leads plan built around your requirements.
Request access
