Why two SPF records are not additive
SPF does not treat separate `v=spf1` TXT records as two halves of one allowlist. RFC 7208 expects the SPF check to obtain one policy record for the identity being evaluated. If DNS returns multiple records that qualify as SPF records, evaluation can produce `permerror`. That means adding a second record for a new sender can break a domain that previously authenticated correctly. A small operator should therefore think of SPF as a single policy document: every legitimate sending path that needs SPF authorization has to be represented inside that policy, subject to the protocol's processing limits.
Inventory actual sending paths before editing DNS
Start with traffic, not with the DNS dashboard. List the mailbox provider, any transactional sender, support system, form service, billing platform, and any legacy system that still sends mail using the domain. For each one, capture a recent message and inspect its `Return-Path` and `Authentication-Results`. SPF is normally evaluated against the SMTP identity, which may not be the same domain users see in the From header. This inventory prevents a common migration mistake: deleting an old `include:` because it looks unused while a password-reset or invoice system still relies on it.
Merge mechanisms into one deliberate policy
If both providers truly need SPF authorization, combine their mechanisms into the same record rather than publishing independent policies. A simplified example might contain two `include:` terms followed by an all mechanism. Do not copy a provider's sample blindly if the current record already contains other legitimate mechanisms. Keep a change log showing which service each term belongs to. That makes later cleanup possible and reduces the chance that an operator leaves obsolete authorizations in DNS indefinitely.
v=spf1 include:_spf.mailhost.example include:spf.transactional.example ~allRespect DNS lookup limits instead of creating an include chain
Consolidating records does not mean adding unlimited `include:` statements. SPF has a limit on DNS-querying terms during evaluation, and nested provider policies can consume that budget quickly. Count the mechanisms that cause lookups across the full evaluation path, not just the visible number of words in your top-level TXT value. If the policy is already complicated, remove senders that are genuinely retired and ask providers whether they offer a supported subdomain or other architecture. Do not “flatten” provider IP ranges into static data unless you own the operational burden of keeping those ranges current.
Test from each sender, not with a generic SPF checker alone
A DNS syntax checker can confirm that a record parses, but the useful acceptance test is a real message from every legitimate path. Send one controlled message through the mailbox provider and one through the transactional service. In the received headers, confirm the SPF result and the identity that was evaluated. Then confirm DKIM and DMARC separately, because a raw SPF pass is not evidence that every authentication layer is aligned. Store those headers with the DNS change so a future operator can compare against a known-good state.
Use subdomains when different systems need different blast radii
A small company does not have to place every type of mail behind the same organizational workflow. Transactional traffic, support traffic, and outbound prospecting can use purpose-built subdomains when that architecture fits the provider and brand. Subdomains can make ownership and troubleshooting clearer because each stream can have its own DNS and operational history. They are not a trick for evading reputation systems, and the parent brand is still visible to recipients. The value is separation of responsibility: one sender's configuration change is less likely to require editing a crowded single policy used by unrelated systems.
A safe change sequence for a small sender
Before the change, export the current DNS value and capture a passing message from each sender that still works. Edit the existing SPF policy once, wait for the authoritative DNS answer to reflect the change, and retest each path with fresh messages. If one path fails, roll back or correct the specific mechanism instead of adding another SPF record as a patch. After a few days, revisit the inventory and remove only senders that are proven inactive. The goal is a policy that describes current infrastructure, not a historical museum of every vendor the domain has ever used.
Count DNS-triggering terms before the record becomes fragile
SPF has a hard operational constraint that is easy to miss when adding SaaS senders one at a time: mechanisms such as include, a, mx, ptr, exists and redirect can cause DNS lookups, and the SPF specification limits the number of terms that trigger DNS queries during one evaluation. A record that looks short can still expand through nested includes. The result of exceeding the processing limit is not “the last include is ignored”; evaluators can return a permanent error. Before adding another provider, expand the include chain and count the DNS-triggering mechanisms across the recursion path. If the policy is already close to the limit, treat that as an architecture problem instead of squeezing in one more include. Subdomains, direct ip4/ip6 mechanisms for stable infrastructure, or removing retired senders may be safer than an endlessly growing root-domain policy.
Test the envelope identity from each real sending path
A DNS checker can tell you that the SPF record parses, but it cannot prove that every production message is using the identity you think it is. Capture a delivered message from each provider and inspect the Authentication-Results header along with the envelope sender or Return-Path. SPF is evaluated against the RFC5321 identity, not simply the address visible in the From header. If a provider uses its own bounce domain, SPF may pass for that provider-owned domain while DMARC relies on DKIM for alignment with your visible From domain. That can be perfectly valid, but it changes which mechanism carries DMARC. Record the actual identity for each sender so a later migration or include removal does not accidentally break the one aligned path the message was depending on.
Field checklist
- Keep exactly one SPF policy record for each evaluated domain identity.
- Inventory mailbox, transactional, support, billing, and legacy senders before editing.
- Trace Return-Path and Authentication-Results from a real message for every path.
- Account for nested DNS-querying mechanisms and the SPF lookup limit.
- Retest SPF, DKIM, and DMARC after the change; do not stop at a DNS syntax check.
- Document which provider owns each mechanism so obsolete authorization can be removed safely.
Primary sources
Standards and provider policies can change. These links are the reference points used for this field note.
- RFC 7208 — Sender Policy FrameworkIETF / RFC Editor — SPF protocol and evaluation semantics.
- Email sender guidelinesGoogle Gmail Help — Authentication, TLS, DNS, spam-rate and bulk-sender requirements.
