How to Reduce Email Bounce Rate: A Technical Guide
A 2% bounce rate sounds small. It isn't. Email providers like Gmail and Microsoft track bounce rates at the domain and IP level. Cross the thresholds they enforce internally — typically 1–2% for cold senders — and your future emails start going to spam, or stop being delivered at all. Google's Postmaster Tools makes this visible; most senders don't check it until it's too late.
This guide explains what causes bounces, how to measure them, and what to do about them before they compound.
Hard bounces vs soft bounces
Not all bounces are equal.
Hard bounces are permanent failures. The destination mail server responded with a 5xx error that means "this address does not exist and never will." Common SMTP codes:
550 5.1.1— mailbox does not exist550 5.1.2— bad destination mailbox address551 5.1.1— user not local, please try forwarding
Hard bounces should be immediately and permanently removed from your list. Sending to them again hurts your reputation without any possibility of reaching the recipient.
Soft bounces are temporary failures. The address exists but the email couldn't be delivered right now. Common causes:
- Mailbox full (
452 4.2.2) - Server temporarily unavailable (
421 4.3.2) - Message size exceeded (
552 5.3.4)
Soft bounces are typically retried by your email provider for 24–72 hours. If a soft bounce becomes persistent over multiple sends, treat it as a hard bounce.
What causes high bounce rates
1. Old or purchased lists
Lists degrade at 20–30% per year. An employee leaves; the mailbox is deleted. A company changes its email domain. A Gmail account goes inactive and Google reclaims it. Any list you haven't sent to in 6+ months has meaningful decay built in.
Purchased lists are worse. They often contain:
- Harvested addresses that were never opted in
- Spam traps (addresses maintained by anti-spam organizations specifically to catch senders using bad lists)
- Addresses that haven't existed for years
Sending to a purchased list is one of the fastest ways to get your sending domain blacklisted.
2. No validation at collection
Signup forms without verification accept:
- Typos (
gmial.com,yahooo.com) - Fake addresses entered to access gated content
- Disposable emails that expire before your first send
- Role addresses that auto-reject marketing (
noreply@,bounce@)
Each of these becomes a bounce, and your bounce rate climbs with every send.
3. Inactive subscribers
Users who signed up and never engaged don't always hard bounce — their mailbox still exists. But providers like Gmail track engagement. If a large percentage of your sends to Gmail addresses go unread or get marked as spam, Gmail will start routing your mail to the spam folder for everyone.
4. Configuration problems
Authentication failures can cause bounces before the message even reaches the inbox:
- Missing or incorrect SPF record
- DKIM signature mismatch
- DMARC policy set to
rejectwith a configuration error - Sending from an IP not listed in your SPF record
These are distinct from address-level bounces but contribute to the same deliverability problems.
How to measure your bounce rate
From your email service provider
All major email providers (Postmark, SendGrid, Mailgun, Amazon SES) report bounce rates in their dashboards and webhooks. The critical number is hard bounce rate per campaign, not the aggregate.
A single campaign with a 5% bounce rate is a bigger red flag than a 2% aggregate across 12 months.
Via Google Postmaster Tools
Postmaster Tools shows your reputation for mail sent to Gmail addresses: domain reputation, IP reputation, spam rate, delivery errors. It's free and shows you exactly what Google thinks of your sending domain.
Set it up before you have a problem. You can't debug retroactively with it.
Via SMTP bounce codes
If you're processing bounces yourself, parse the SMTP response codes:
// Example: processing bounce webhooks from Postmark
app.post("/webhooks/bounce", (req, res) => {
const { Type, Email, Description } = req.body;
if (Type === "HardBounce") {
// permanent removal — 5xx codes
db.markEmailInvalid(Email, { reason: Description });
} else if (Type === "SoftBounce") {
// increment soft bounce counter
db.incrementSoftBounce(Email);
}
res.sendStatus(200);
});
// Suppress after 3 soft bounces
async function shouldSuppress(email: string): Promise<boolean> {
const count = await db.getSoftBounceCount(email);
return count >= 3;
}How to reduce your bounce rate
1. Verify email addresses at collection
Real-time verification at the signup form is the most effective intervention. It stops invalid, disposable, and non-existent addresses before they enter your list.
// Express.js signup endpoint
import Mailbeam from "@mailbeam/sdk";
const mb = new Mailbeam({ apiKey: process.env.MAILBEAM_KEY });
app.post("/api/signup", async (req, res) => {
const { email } = req.body;
const result = await mb.verify(email);
if (!result.valid) {
return res.status(422).json({
field: "email",
error: result.suggestion
? `Did you mean ${result.suggestion}?`
: "This email address doesn't appear to be valid.",
});
}
if (result.disposable) {
return res.status(422).json({
field: "email",
error: "Temporary email addresses are not allowed.",
});
}
// safe to create account
await createUser({ email });
res.status(201).json({ ok: true });
});This alone typically reduces bounce rates on new addresses to under 0.1%.
2. Clean your existing list before a major send
Before sending to a list that's been dormant for 3+ months, run a batch verification job:
import Mailbeam from "@mailbeam/sdk";
const mb = new Mailbeam({ apiKey: process.env.MAILBEAM_KEY });
async function cleanList(emails: string[]) {
const results = await mb.verifyBatch(emails);
const segments = {
deliverable: results.filter(r => r.valid && r.score >= 70).map(r => r.email),
risky: results.filter(r => r.valid && r.score >= 40 && r.score < 70).map(r => r.email),
invalid: results.filter(r => !r.valid).map(r => r.email),
disposable: results.filter(r => r.disposable).map(r => r.email),
};
return segments;
}Send only to deliverable for cold outreach. For engaged subscribers, you can include risky addresses — they have an existing relationship with your brand.
3. Implement a suppression list
Once an address hard bounces, suppress it immediately and permanently. Never send to it again, even if it appears in a new import.
// Check suppression before sending
async function canSend(email: string): Promise<boolean> {
const suppressed = await db.isSuppressed(email);
return !suppressed;
}
// Add to suppression on hard bounce webhook
async function handleHardBounce(email: string) {
await db.addToSuppression(email, { suppressedAt: new Date() });
}Most email providers maintain suppression lists for you. The mistake is failing to propagate these across multiple sending channels.
4. Re-engagement campaigns before full sends
For lists with subscribers who haven't opened anything in 6+ months, run a re-engagement campaign first. Send to just that segment with a clear subject line ("Still want to hear from us?"). Remove anyone who doesn't engage.
This reduces the volume you're sending to questionable addresses without losing people who just haven't happened to open recently.
5. Fix your authentication
Run these checks:
# Check SPF record
dig TXT yourdomain.com | grep spf
# Check DKIM (replace selector with yours, e.g. 'google', 'mail', 's1')
dig TXT selector._domainkey.yourdomain.com
# Check DMARC
dig TXT _dmarc.yourdomain.comIf any of these return nothing, you have an authentication gap. Gmail and Yahoo now require both SPF and DKIM alignment for bulk senders, and DMARC policy is increasingly enforced.
Target bounce rates
| Context | Acceptable hard bounce rate |
|---|---|
| Transactional (receipts, alerts) | < 0.5% |
| Marketing to opted-in list | < 1% |
| Cold outreach | < 0.5% (providers will suspend you above this) |
| Re-engagement campaign | < 2% (but clean the list afterward) |
What to do if your bounce rate is already high
- Stop sending immediately — continuing to send compounds the damage
- Check Postmaster Tools — assess what Google already thinks of your domain
- Verify your current list — identify and remove all invalid addresses
- Warm up gradually — start with your most engaged segment, then expand
- Monitor daily — use webhook-based bounce processing to catch new hard bounces before they accumulate
Summary
Bounce rate is a lagging indicator: by the time you notice it's high, reputation damage is already in progress. The prevention is upstream:
- Verify addresses at the point of collection
- Clean lists before every major send
- Suppress hard bounces immediately
- Monitor authentication configuration
Each of these is a one-time setup that runs indefinitely. The alternative is periodic firefighting as your deliverability degrades.