Email deliverability troubleshooting
When mail goes to spam or bounces: diagnose authentication, reputation and configuration.
"It sent but they did not get it" has a short list of causes. Work through them in order.
1. Did it actually send?
Check your provider's logs / the panel's mail queue. A message stuck in the queue means delivery never started — usually a connection or authentication problem on the sending server.
2. Is authentication correct?
dig example.com TXT +short # SPF present and syntactically valid?
dig _dmarc.example.com TXT +short # DMARC present?
dig selector._domainkey.example.com TXT +short # DKIM key present?Use the SPF/DMARC checker. Common faults: two SPF records, a lookup that exceeds the 10-lookup limit, -all before a sender is authorised, a DKIM key published at the wrong selector.
3. Reputation
Send a test to a mailbox you control at Gmail/Outlook and read the full headers. Look for Authentication-Results — it says whether SPF, DKIM and DMARC passed. It also often explains a spam filing.
Check whether your sending IP is on a blocklist: DNS blacklist checker.
4. Reverse DNS
Your PTR must match the hostname your mail server announces itself as (EHLO). Mismatch is a common silent spam-filter trigger. Set PTR with your provider — it cannot be set in your own DNS zone.
5. Content and behaviour
Even with perfect authentication, these get you filtered:
Sending to old or purchased lists (the fastest way to a blocklist).
Sudden spikes in volume from a domain with no history.
Shorteners, all-caps subjects, deceptive claims, too many images, too few words.
A single domain sending both transactional and bulk marketing mail.
6. Warm up sending
A new IP or domain has no reputation. Ramp volume gradually, send to engaged recipients first, and process bounces and complaints promptly.
The step-by-step test
Send from your domain to a Gmail/Outlook address you control.
View full headers →
Authentication-Results.If SPF/DKIM/DMARC fail → fix DNS first.
If all pass but it is in spam → reputation/content/PTR.
If it bounces → read the bounce code; it says which rule triggered.
Related reading