MX TTL Sanity
MX TTL sanity
The MX TTL doesn’t change anything about mail routing. It controls how long resolvers cache the MX record before re-fetching it. That sounds boring until you’re 18 hours into a mail provider cutover and half the senders in the world are still delivering to the old host.
Cathedra runs a small sanity check on the MX TTL. The thresholds are unfussy: under 300 seconds is too low, over 86,400 seconds is too high. The default for most DNS hosts is 3,600 seconds (1 hour), and that’s the right number for steady-state operation.
What Cathedra checks
DnsHygieneCheck pulls the MX records and reads the TTL on the first one. Two conditions trigger findings.
If the TTL is under 300 seconds:
status: warning / severity: low
“MX record TTL is {ttl}s, which is very low. This causes excessive DNS lookups.”
Recommendation: “Set MX TTL to at least 300s (5 minutes). 3600s (1 hour) is typical.”
If the TTL is over 86,400 seconds (24 hours):
status: warning / severity: low
“MX record TTL is {ttl}s. Migrations will be slow to propagate.”
Recommendation: “Before any planned mail provider migration, lower the TTL to 300s.”
If the TTL is between 300 and 86,400 — including the very common 3,600 — Cathedra emits no MX TTL finding at all. No news is good news on this one.
Why the lower bound exists
A 60-second TTL means every recursive resolver in the world re-fetches the MX record at most once a minute. For a popular domain, that’s a measurable load on the authoritative nameservers and a measurable amount of UDP traffic. More importantly: each lookup adds latency to mail delivery. A sender that has to hit DNS before every connection is slower than a sender that can use a cached answer for the next hour.
In practice, you encounter sub-300-second TTLs in three scenarios:
- Migration leftover. Someone lowered the TTL before a cutover (correctly) and never restored it. Most common cause.
- Cloudflare proxy default. Cloudflare-proxied records often default to a 60-second TTL even though MX records aren’t proxied. The DNS host still serves it short.
- Misunderstanding. A tech thought “lower TTL = better performance” and set it to 60 across the board.
The fix in all three cases is the same: raise the MX TTL to 3,600 seconds.
Why the upper bound exists
A TTL over 24 hours means a recursive resolver can cache the MX for a full day. When you change the MX record — most often during a mail provider migration — resolvers that have a fresh cache will keep delivering to the old host until the cache expires. For a one-day TTL, that means up to 24 hours of mixed delivery after cutover. For the multi-week TTLs you occasionally see, it means real mail being delivered to a server that no longer exists.
You’ll encounter long MX TTLs in two scenarios:
- Set-and-forget zones. A domain provisioned years ago with the host’s default TTL, where the default happened to be a week.
- Deliberate “don’t change anything” posture. A previous admin wanted to maximize cache hits and minimize lookups, and didn’t think about what migration would look like.
The fix: lower the TTL to 3,600 seconds for steady state. Lower it further (to 300 seconds) when a migration is coming.
The migration playbook around MX TTL
The standard pattern when you’re prepping a mail provider cutover for a client:
- T-minus 48 hours. Lower the MX TTL to 300 seconds. The whole world re-fetches the MX at most every five minutes from now on.
- T-minus 24 hours. Confirm with
dig isidoregroup.com MXthat the TTL is showing 300. If a cached resolver is still reporting the old TTL, you have a few more hours before cutover safety is guaranteed. - Cutover. Change the MX record. Within five minutes, every resolver in the world should be pulling the new MX.
- T-plus 24 hours. Restore the MX TTL to 3,600 seconds.
That four-step sequence is the most common reason you’ll deliberately violate the lower bound. Cathedra will warn during the migration window. That’s expected and fine — the warning is informational. Document it on the audit report alongside “migration in progress; TTL restored after cutover” so future audits don’t surface it as a regression.
What the check ignores
Cathedra only reads the TTL of the first MX record. If a domain has multiple MX records with different TTLs (legal but unusual), the check sees only the first one. You won’t encounter this in normal operations — most DNS hosts force a single TTL across all records of the same type at the same name — but it’s worth knowing.
The check also doesn’t look at TTLs on any other record type. SPF, DMARC, and other TXT records can have whatever TTL the admin set; Cathedra has no opinion. In practice, you want the same hygiene there: 3,600 for steady state, 300 before a change.
Cheat sheet
| MX TTL | Cathedra status |
|---|---|
| <300 seconds | warning / low — “excessive DNS lookups” |
| 300–86,400 seconds | no finding emitted |
| >86,400 seconds | warning / low — “migrations will be slow to propagate” |
Quick command reference
dig isidoregroup.com MX
;; ANSWER SECTION:
isidoregroup.com. 3600 IN MX 0 isidoregroup-com.mail.protection.outlook.com.
The 3600 in the second column is the TTL. That’s the field Cathedra is reading.
What you should remember
- Cathedra warns when MX TTL is under 300 seconds (“excessive DNS lookups”) or over 86,400 seconds (“migrations will be slow to propagate”).
- 3,600 seconds (1 hour) is the right steady-state value. 300 seconds is the right pre-migration value. Restore to 3,600 after cutover.
- Sub-300 TTLs in the wild are usually migration residue. Raise them back to 3,600 once the migration is done.
- Multi-day TTLs make migrations painful. Lower them to 300 at least 48 hours before any planned mail cutover.
- The check reads only the first MX record’s TTL. Multi-MX domains with mixed TTLs are unusual but possible.
That closes Module 1. Module 2 starts on mail routing itself — MX priority, fallback behavior, and how Cathedra reads the path a message takes to reach a mailbox.
Cathedra alignment: DnsHygieneCheck — MX TTL Sanity
