If a domain is still publishing ~all, the usual reason is not that softfail is inherently better. It is that the team does not yet trust its sender inventory enough to say, with confidence, "everything not listed is unauthorized."
That instinct is healthy.
Moving from ~all to -all should be treated as an inventory and rollout project, not as a one-line DNS cleanup. The safe goal is simple: get to hard fail only after every legitimate sender is known, aligned where needed, and tested under real traffic.
~all and -all actually meanIn RFC 7208, the SPF qualifiers map to different results:
~all returns softfail-all returns failThe same RFC describes softfail as a weak statement that the host is probably not authorized, while fail is an explicit statement that the host is not authorized.
That difference matters operationally even though receivers still apply their own local policy. A hard-fail SPF record is the domain owner saying: "this list is complete enough that everything else should be treated as unauthorized."
This is where many rollout discussions drift off course.
DMARC only passes when at least one aligned authentication mechanism produces a pass result, per RFC 7489. A message with SPF softfail does not have an SPF pass for DMARC purposes. A message with SPF fail also does not.
So if the question is "will switching from ~all to -all make DMARC start passing?" the answer is no.
The real difference is:
~all gives receivers a weaker SPF signal for non-authorized sources-all gives receivers a definitive SPF fail for non-authorized sourcesIf DMARC alignment needs a refresher, Return-Path vs From: practical implications is the companion read.
~allThere is a practical reason Google documentation still shows ~all in many setup examples, while Microsoft documentation recommends -all for Microsoft 365 domains once the setup is understood.
Those docs are solving slightly different problems:
Neither position is irrational. They reflect different stages of maturity.
That is the right mental model for rollout too: ~all is often a transitional state, not the destination.
Changing ~all to -all does not usually break well-configured mail streams that already have aligned DKIM and correct SPF authorization.
What it exposes is all the mail the organization forgot about.
Typical casualties are:
From but the wrong bounce domainsoftfailThis is why Building a sender inventory with DMARC reports should usually happen before the SPF qualifier change, not after it.
The shortest good strategy is:
~all to -allThe rest of this post expands each step.
Do not trust tribal knowledge here.
Ask a narrower question than "what systems send email?" Ask: "what systems send mail that uses this exact domain in the SMTP envelope sender or visible From path?"
Sources to check:
include: and ip4: or ip6: termsIf the apex domain SPF record already feels crowded or unclear, that is usually a sign the domain is carrying too many unrelated streams. In that case, SPF flattening vs includes: tradeoffs, failure modes, and safer alternatives and Transactional vs marketing email separation are directly relevant.
This is the step teams skip when they focus only on SPF syntax.
Every live sender should have an intended authentication path:
5321.MailFromd= domainIf a sender can only survive because receivers are tolerant of SPF softfail, that sender is already fragile.
Common examples:
example.com. IN TXT "v=spf1 include:_spf.example.net ~all"The sender is authorized by the include and signs with aligned DKIM. Changing the terminal qualifier to -all is probably safe for this source because authorized mail will still SPF-pass before evaluation reaches all.
Mail is sent as billing@example.com, but the actual 5321.MailFrom is mailer.vendor-example.net, and there is no aligned DKIM.
That sender was never in a healthy state. Moving to -all did not create the problem. It merely removed the ambiguity around it.
A common mistake is to discover uncertainty and respond by stuffing more includes into the main SPF record "just in case."
That usually creates two new problems:
If an old platform has not sent legitimate mail in months, delete it rather than preserving it as a hypothetical future need.
If lookup budgeting is already tight, SPF 10-DNS-lookup limit: why it happens, how to audit includes, and mitigation patterns is the better next step than adding more guesswork.
This is often the cleanest way to reach -all on the main domain faster.
For example:
example.com for employee and core transactional mailmarketing.example.com for campaign trafficsupport.example.com for ticketing systemsalerts.example.com for product notificationsMicrosoft explicitly recommends subdomains for email services that are not under your direct control. Operationally, that advice is solid even outside Microsoft 365.
It reduces blast radius and lets the main domain reach a tighter SPF posture without waiting for every external platform to become equally well managed.
Many teams frame this migration as an SPF-only change, but the dangerous cases are usually hybrid ones:
If a sender has aligned DKIM, then switching from ~all to -all is much less likely to affect legitimate delivery. If a sender has no aligned DKIM and marginal SPF, then the environment is already brittle.
That is one reason Microsoft says to deploy DKIM and DMARC alongside SPF, and why Google's sender guidance also expects authenticated mail rather than SPF alone.
RFC 7208 explicitly warns that when SPF records change, there should be a transition period so the old policy remains valid long enough for legitimate mail already in transit to be checked under the expected policy.
In practice, that means:
The DNS edit is small. The monitoring window after it is the real rollout.
For a busy production domain, this pattern is usually safer than debating ~all versus -all in the abstract:
~all to -all.That sequence is boring. Boring is good here.
example.com. IN TXT "v=spf1 include:_spf.google.com include:spf.protection.outlook.com include:mailer.vendor-example.net ~all"Problems:
~all because they do not trust that the record is completeexample.com. IN TXT "v=spf1 include:_spf.google.com include:spf.protection.outlook.com -all"
marketing.example.com. IN TXT "v=spf1 include:mailer.vendor-example.net -all"Why this is better:
~allStaying on ~all is defensible for a while if any of these are true:
But treat that as temporary technical debt, not a best practice to preserve forever.
-all is the right moveMoving to -all is usually justified when:
At that point, -all is not an aggressive setting. It is simply an honest one.
Softfail is often a discovery posture. Hard fail is an enforcement posture. The operational question is not which one feels safer. It is whether the sender inventory is complete enough for enforcement.
The move from SPF ~all to -all should happen after inventory, segmentation, and validation, not before.
If a domain still depends on ~all to avoid breaking legitimate senders, the real work is to identify those senders, fix their SPF or DKIM path, and move high-variance services onto their own subdomains. Once that is done, -all becomes the natural end state rather than a risky leap.