Your 0.4% reply rate probably isn't deliverability
I audited 14,504 cold emails and the campaign that returned nothing from 141 sends was a broken merge variable, not spam filtering. The checks to run, in order, before you blame the inbox.
The campaign that returned nothing from 141 sends was not filtered, blocked or sent to spam. Every one of those emails went out with an empty subject line and a blank opening, because a merge variable never populated, and a visible fraction went to the wrong person’s inbox on top of that.
I only know this because I read the send log rather than the dashboard. The dashboard said zero opens and zero replies, which looks exactly like a deliverability collapse, and if I had believed it I would have spent a fortnight rewarming mailboxes to fix a problem that lived in a column name.
What the numbers looked like from the outside
The account had sent 14,504 cold emails across about a dozen campaigns, with 60 replies in total, which is 0.41% overall. That is a bad number, and it is the kind of number that sends people off to buy more domains.
Look one layer down and it stops being one number.
| Campaign | Sent | Replies | Reply rate |
|---|---|---|---|
| Best performing (UK sales hiring signal) | 829 | 14 | 1.69% |
| Second best (regional LinkedIn plus email) | 354 | 8 | 2.26% |
| Worst performing (broad recruitment list) | 2,914 | 6 | 0.21% |
| The one I audited | 141 | 0 | 0% |
The spread between the best and worst campaigns is more than ten times, on the same domains, the same mailboxes and the same sending tool. Infrastructure cannot produce a spread like that. Targeting and copy can, and so can a broken send.
What the send log actually showed
The template was Quick question re: {{company}}, and the company variable was empty for every single lead, so 141 people received an email with the subject line “Quick question re: “ and nothing after it. The body opened with {{email_opener}} straight after the greeting, and since the company field never filled in, the personalised opener almost certainly did not either, which means the first thing the reader saw was a blank line followed by me introducing myself.
Then the mismatches. A first name in the greeting paired with somebody else’s email address at the same company, because the contact waterfall had resolved a different person at the domain than the one the signal was about. Two of the 141 that I could see at a glance, probably more.
Bounces were one out of 141, which is 0.7%, comfortably under the 2% ceiling where a list starts hurting you. The list was fine. The data going into the template was not.
The root cause was a field-mapping failure between Clay and Smartlead. The template expected custom variables called company and email_opener, the push from Clay supplied columns with different names, and nothing in the chain refused to send an email with a hole in it.
Why it looked like deliverability
Because every signal you would normally check pointed the wrong way, or pointed nowhere.
Both campaigns sent as plain text, which is the right call for cold email, but it means there is no tracking pixel, so the open count reads zero for every email whether it was opened or not. Zero opens on a plain-text send is missing data, and I watched it get read as “everything went to spam”.
The infrastructure itself was in reasonable shape. Forty three mailboxes across seventeen secondary domains, daily limits of ten to twenty five per box, SPF present everywhere, DMARC at reject or quarantine on all ten cold-sending domains. Warmup was mixed, with one fleet sitting at 98 to 100% reputation and another drifting to the sixties, but none of that explains a flat zero, because a partially warmed fleet still gets some replies.
So the picture was: good DNS, decent warmup, low bounces, zero replies. If you only look at the dashboard, the only explanation left is spam filtering. If you open the emails, the explanation is sitting in the subject line.
The checks, in the order that saves you time
Most people run these backwards, starting with the expensive infrastructure questions and never getting to the cheap data questions. Run them in this order.
- Open five sent emails from the log. Not the template, the rendered emails. Did the subject fill in, did the personalisation fill in, does the first name match the email address. This takes four minutes and it catches the most common failure there is.
- Bounce rate. Under 2% and the list is fine. Over it and you have a validation problem, which is a different article.
- Are you actually measuring opens? Plain text means no pixel, which means zero opens is not a signal. Decide what you are going to use as the placement signal before you send, because it will not be opens.
- DNS. SPF, DKIM, DMARC on every sending domain, with alignment. Boring, five minutes per domain, and if it passes you can stop thinking about it.
- Warmup reputation per mailbox. Anything under 90% should not be attached to a campaign you care about. Anything with warmup switched off has been quietly degrading since the day it stopped.
- A placement test on the first batch. A seed list across Gmail, Outlook and a couple of others, so you can see where the email lands rather than inferring it from a reply rate.
- Then, and only then, the copy and the targeting. Which is where the ten-times spread in the table above actually comes from.
What changed after the audit
Two things, and neither of them was a new domain.
The variable mapping got fixed, with the columns pushed from Clay renamed to match the template exactly, and a test lead sent through so the rendered subject and body could be checked in the preview before any batch. That is the fix everyone would have made once they saw the problem.
The one worth copying is the guard. Any row with an empty company, an empty opener, or an email address whose local part does not plausibly match the person’s name no longer gets pushed to the sending tool at all. It fails closed. A blank email is worse than no email, because it costs you the prospect and a little reputation at the same time, so the pipeline now refuses to send one.
The honest conclusion from the audit was that the signal-led approach had not failed, it had never been tested, because the copy never reached anyone in the form it was written. That is a very different situation from “cold email is dead”, and it is the situation most teams with a flat zero are actually in.
The bit that generalises
A reply rate is the last number in a long chain, and the chain runs: signal, enrichment, mapping, template, send, placement, reader. Deliverability is one link near the end. Every link before it can produce a zero that looks identical in the dashboard.
Before you spend money on the last link, read the emails.
If your pipeline runs through Clay, a sending tool and a CRM and the numbers do not add up, that is the kind of thing I read first in a CRM and data audit.