Why Are My Emails Going to Spam?
A developer's guide to diagnosing and fixing email deliverability issues. From authentication problems to content triggers—find out why your emails aren't reaching the inbox.
You checked the logs. The email was sent successfully. Status 200. But your user says they never got it. You ask them to check spam. There it is.
This is frustrating. Let's fix it.
Most common causes:
- Missing or broken authentication (SPF, DKIM, DMARC)
- Sending from a new domain without warming up
- Poor sender reputation (high bounces or complaints)
- Content that triggers spam filters
- Sending to invalid or old addresses
Quick fix: Check authentication first. It's the cause most of the time.
Step 1: Check Your Authentication
This is the #1 reason emails go to spam. Missing or misconfigured SPF, DKIM, or DMARC records.
How to check
First, use our free deliverability checker to instantly verify your domain's SPF, DKIM, and DMARC records.
Then send yourself an email. In Gmail, click the three dots → "Show original". Look for:
Authentication-Results: mx.google.com; spf=pass dkim=pass dmarc=pass
If you see any of these failing:
Authentication-Results: mx.google.com; spf=softfail (domain does not designate 192.0.2.1 as permitted sender) dkim=none (no signature) dmarc=fail
That's your problem.
Fixing authentication
| Issue | Fix |
|---|---|
spf=fail or spf=softfail | Add your email provider to your SPF record |
dkim=none or dkim=fail | Add the DKIM CNAME/TXT record from your provider |
dmarc=fail | Set up a DMARC record (start with p=none) |
Need details? Read our DKIM, SPF, and DMARC guide for step-by-step instructions.
Step 2: Check Your Sender Reputation
Even with perfect authentication, a bad reputation will land you in spam.
Signs of reputation problems
- Emails delivered fine last week, now going to spam
- Some recipients get it, others don't
- Gmail specifically filtering you (they're the strictest)
How to check
Google Postmaster Tools (free): https://postmaster.google.com/
Connect your domain and you'll see:
- Domain reputation (High/Medium/Low/Bad)
- Spam rate
- Authentication success rate
If your spam rate is above 0.1%, you have a problem. Above 0.3% and Gmail will actively filter your emails.
What hurts reputation
| Factor | Impact |
|---|---|
| High bounce rate (>2%) | Severe |
| Spam complaints (>0.1%) | Severe |
| Sending to spam traps | Severe |
| Sending to inactive addresses | Moderate |
| Inconsistent sending volume | Moderate |
How to fix it
- Clean your list: Remove addresses that bounced
- Handle complaints: Never email someone who complained
- Slow down: Reduce volume temporarily while reputation recovers
- Check for spam traps: Old addresses that ISPs use to catch spammers
Step 3: Check Your Content
Spam filters analyze what you're sending. Certain patterns trigger them.
Red flags
Subject lines:
- ALL CAPS
- Excessive punctuation!!!
- "FREE", "Act now", "Limited time"
- Re: or Fwd: when it's not a reply
Body content:
- URL shorteners (bit.ly, t.co)
- Too many links
- Image-only emails (no text)
- Mismatched link text and URL
- Hidden text (same color as background)
The image problem
Emails that are just one big image with no text are a classic spam signal. Spammers use images to hide text from filters.
Bad:
<body>
<img src="promo.jpg" alt="Click here for deals!" />
</body>
Better:
<body>
<h1>Your order has shipped</h1>
<p>Your package is on its way...</p>
<img src="tracking-map.jpg" alt="Delivery map" />
</body>
Always include plain text
Every HTML email should have a plain text alternative. Most email clients won't show it, but spam filters check for it.
Content-Type: multipart/alternative
If you're using an email API, this is usually handled automatically. But verify.
Step 4: Check Your Infrastructure
New domain? Warm it up.
A brand new domain sending 10,000 emails on day one looks like a spammer. ISPs are suspicious of new senders.
Warming schedule:
| Day | Volume |
|---|---|
| 1-3 | 50-100 |
| 4-7 | 200-500 |
| Week 2 | 500-1,000 |
| Week 3 | 1,000-5,000 |
| Week 4+ | Full volume |
Start by emailing your most engaged users—they're most likely to open and not mark as spam, which helps your reputation.
Use a subdomain
Send transactional email from mail.yourapp.com or notifications.yourapp.com, not your root domain.
Why? Reputation isolation. If something goes wrong, your main domain stays clean.
Check your sending IP
If you're on a shared IP (most small senders are), someone else's bad behavior can affect you. This is usually handled by your email provider, but worth checking if you've ruled out everything else.
Step 5: Check the Recipient
Sometimes it's not you.
Corporate email filters
Office 365 and enterprise email systems have aggressive filters. Your email might be fine for Gmail but blocked by a company's IT policy.
Signs:
- Consumer emails (Gmail, Yahoo) work fine
- Business emails (company domains) get blocked
- You see "550 Message rejected" errors
Solutions:
- Ask IT admins to whitelist your sending domain
- Make sure you have proper authentication (they check strictly)
Invalid addresses
Sending to addresses that don't exist hurts your reputation.
550 5.1.1 The email account that you tried to reach does not exist
This is a hard bounce. Remove these addresses immediately.
Debugging Checklist
Start with our free deliverability checker — it verifies SPF, DKIM, and DMARC in seconds.
Work through this in order:
| Check | How |
|---|---|
| Authentication passing? | Use deliverability checker or check email headers |
| Domain reputation? | Google Postmaster Tools |
| Bounce rate? | Check your email provider's dashboard |
| Complaint rate? | Google Postmaster Tools |
| Content issues? | Use mail-tester.com |
| New domain? | Implement warming schedule |
| Specific recipient issues? | Test different email providers |
When Nothing Works
If you've checked everything and emails still go to spam:
- Wait: Reputation takes time to build. Keep sending good email.
- Reduce volume: Send less while you recover.
- Segment: Only email people who engaged recently.
- New subdomain: As a last resort, start fresh with a new subdomain.
Don't create a new domain just to escape bad reputation. ISPs can link related domains. Fix the underlying problem first.
Prevention
Once you're out of spam, stay out:
- Verify addresses: Use double opt-in or email verification
- Monitor metrics: Set up alerts for bounce/complaint spikes
- Remove inactive users: If someone hasn't opened in 6 months, stop emailing them
- Handle bounces automatically: Hard bounces should immediately suppress the address
Next Steps
- Check authentication: DKIM, SPF, and DMARC Explained
- Full checklist: Email Deliverability Checklist
- Ready to send: Check our framework guides for integration examples