Six check categories, run as a hard gate before anything goes live. No checklist, no launch.
By Joel Wylie, Founder · Last updated 7 August 2026
Before any cold email campaign launches, run a hard gate across six areas: list quality, sequence structure, copy, sender health, tracking settings, and a final render test of real sends. Most of what gets blamed on "deliverability" is a launch mistake that a 20-minute checklist would have caught. Our rule is absolute: no checklist, no launch.
We run cold email campaigns for clients every day, and the same pattern repeats. A campaign underperforms, everyone reaches for mystical explanations about spam filters and domain reputation, and the actual cause turns out to be something checkable: a stale list, a variable that never resolved, a campaign with zero senders attached. This post is the public version of the pre-launch QA we run internally before anything goes live, launches, or resumes.
Because launch is where every earlier mistake becomes irreversible. A bad list is harmless sitting in a spreadsheet. The moment you send to it, the bounces hit your sending domains and the damage is done. A broken variable is invisible in your campaign tool. The moment it lands in an inbox reading "Hey {{FIRST_NAME}}", the prospect is gone.
We learned this the hard way. Early on, a campaign went out on a list where 582 leads carried a "valid" flag from an old export. Fresh verification would have passed roughly 140 of them. Nobody re-checked, the campaign hit a 45% bounce rate, and the sending infrastructure took weeks to recover. The verification data existed. It was just old, and old verification data is worthless.
The fix is not more sophistication. It is a boring, mandatory gate that runs the same checks every single time, on every launch, every resume, and every list upload, regardless of how confident anyone feels. Confidence is exactly what the checklist exists to override.
Here is the full gate, expressed as what each failure actually costs you. Every row on this table is a mistake we have either made ourselves or caught in the gate before it shipped.
| Check | What failing it costs you |
|---|---|
| List freshly verified (not stale flags) | Bounce rates that can reach 45%, burned sending domains, weeks of recovery |
| MX check on every domain, strict corporate gateways removed | A minority of the list generating the majority of your bounces via policy rejections |
| No previously bounced addresses in the send set | Guaranteed repeat bounces that compound reputation damage for zero upside |
| Correct email column mapped from the source file | An entire campaign sent to the wrong addresses |
| Sequence steps, waits, and threading match the plan | Follow-ups that land a day apart, or a new offer buried in an old thread |
| A/B variants set up as variants, not extra steps | Every prospect receives every "variant" as a barrage of near-identical emails |
| Copy is plain text with zero links | Spam filter flags from the first send onward |
| Spam-word scan on every subject and body, including late edits | One trigger word tanks inbox placement across thousands of sends |
| Spintax renders cleanly in every combination | Prospects receive emails with raw braces and pipes in the body |
| Every variable resolves on every lead, with a real fallback | "Hey {{FIRST_NAME}}" in a live inbox, instant delete, credibility gone |
| Exactly one opt-out line, at the bottom | No opt-out risks compliance; two opt-outs reads as broken automation |
| All senders attached, connected, and warmed | A campaign with zero senders silently sends nothing at all |
| Daily limits set correctly | A hidden cap quietly throttles volume for weeks before anyone notices |
| Open tracking off | A tracking pixel in every email, which is a spam signal you volunteered for |
| Final render test of actual sends | Every failure above ships to prospects instead of to your own inbox |
List quality is the highest-stakes category because list failures damage infrastructure, not just one campaign. Three checks, in order.
Run verification on the list at upload, no matter what the source claims. Flags from an old export, a previous tool, or a client's CRM do not count. Then, at launch, sample-check the attached leads: we verify a sample of 25 from the live send set, and more than 2 invalid results stops the launch. A dirty sample means a dirty list, and the full re-verify happens before anything sends. Our full process is in the email list verification guide.
Some large enterprises route mail through strict security gateways that reject cold mail from new senders at close to 100%, on policy, regardless of whether the address is valid. These leads verify as deliverable and then bounce anyway. On one launch, a single strict gateway made up 7% of the list and produced 77% of all bounces. Look up the MX records for every unique domain in the send set and strip the leads behind blocking gateways before activation.
Check every domain, not a sample. We once ran a 40-domain spot-check that came back completely clean; the full sweep of nearly 7,000 domains in the same list found leads behind blocking gateways still sitting in the send set. A full MX sweep is cheap and takes minutes even at that scale. A spot-check is a coin flip dressed up as diligence.
An address that bounced once will bounce again. Re-sending to it is pure downside: no possible reply, guaranteed reputation damage. Filter previously bounced addresses out of every new send set as a standing rule.
Confirm the steps, the waits, and the threading match the plan before launch, because sequence mistakes are invisible until a prospect experiences them. Our standard architecture: step 1, then a follow-up 3 days later in the same thread, then a third touch around 30 days later in a new thread carrying a different offer, with its own follow-up 3 days after that. We never place steps closer than 3 days apart. Whatever your architecture is, the check is the same: does the built campaign actually match it?
The most common structural mistake is uploading A/B variants as extra sequence steps. Variants belong inside a step, where each prospect receives one of them. Built as steps, every prospect receives all of them, one after another, which reads as exactly what it is: automation malfunctioning in public. The full follow-up logic is covered in our cold email follow-up strategy.
Five checks, and every one of them is blocking.
Plain text, no links. Cold email sends as plain text, and the copy contains no URLs, no email addresses, and no domain names. Links from an unknown sender are a classic spam pattern, and they kill replies even when the email lands. The full argument is in why we never put links in cold emails.
Spam-word scan on everything, including late edits. Scan every subject line and every body, in every variant, against a spam-word list before launch. Critically, this applies regardless of how the copy got there. We shipped the word "free" into live copy once because a client requested the edit directly and it went straight in without a re-scan. Clients do not know your spam list. Late edits, client-supplied wording, and "tiny tweaks" go through the same scan as everything else.
Spintax renders cleanly. If you use spintax, check that every brace is balanced, every block contains real alternatives, and no spintax wraps a merge variable. Then render at least one resolved version of every step and read it. A prospect who receives raw braces and pipe characters knows precisely what you are running.
Every variable resolves, with a real fallback. Extract every variable used across all steps and confirm it resolves on every attached lead. Not most leads. Every lead. The leads missing a value either get a genuine fallback that reads naturally in the sentence, or they leave the send set. "Hey {{FIRST_NAME}}" is the single fastest way to convert a prospect into a spam report.
Exactly one opt-out line, at the bottom. Every email carries a working opt-out as its last line, the same easy-unsubscribe standard Google's sender guidelines hold bulk senders to. Count them: the number must be exactly one. Zero is a compliance risk. Two, which happens when one is baked into copy and another is appended by a template, tells the prospect your automation is stapled together.
Confirm every sender account intended for the campaign is actually attached, showing as connected, and properly warmed. Do a full match against your sender list, not a glance. A campaign with zero senders attached does not error. It just sends nothing, silently, while everyone waits for results. Newly created campaigns are the usual culprits.
Then confirm the daily limits are set the way you intend. Sending caps hide in more than one place in most tools, and a forgotten limit on the campaign can quietly throttle volume to a fraction of what your senders could safely do. Finally, confirm open tracking is off. Tracking pixels hurt cold deliverability, and open rates are unreliable noise anyway. Replies are the metric. Our wider infrastructure stance is in the 2026 deliverability guide.
The last gate is real sends to your own inboxes: one fully resolved email per step, per variant, sent through the actual campaign with actual lead data. Read each one as a prospect would. Variables filled, spintax resolved, spacing correct, signature right, opt-out present once, no links, nothing weird. Paper checks catch most problems; the render test catches the ones that only exist in the sent email.
Then launch, and watch the first sends. Pull the bounces within the first hour and read the actual bounce messages, because the text tells you the cause: address-not-found means list, policy-block means gateway or reputation. Our standing rule: above 5% bounce with more than 25 sends, pause immediately and investigate. A campaign paused in hour one is a non-event. A campaign that runs dirty for a week is a rebuild.
Six things: list quality (freshly verified, MX-checked, strict corporate gateways removed), sequence structure (steps, waits, follow-up logic), copy (plain text, no links, spam-scanned, spintax and variables render cleanly), senders (warmed, connected, correct limits), tracking (opens off), and a final render test of real sends.
About 20 minutes for a standard campaign once the checklist is routine. That 20 minutes catches the mistakes that otherwise surface as weeks of bad deliverability, burned sending domains, and campaigns that quietly send nothing at all.
Yes, if the verification is not fresh. Stale validity flags from old exports are worthless. We watched a list where 582 leads carried a valid flag and only around 140 passed fresh verification. The campaign hit a 45% bounce rate before anyone caught it.
Open tracking inserts a hidden pixel into every email, and tracking pixels are a spam signal from senders with no reputation at the recipient's domain. Cold campaigns should send as plain text with open tracking switched off. Measure performance on replies, which are real, not opens, which are noise.
Above 5% bounce with more than 25 emails sent, pause and investigate. Pull the actual bounce messages and read them: address-not-found bounces mean a list problem, policy-block bounces mean a gateway or reputation problem. The bounce text tells you which fix to run.
Want outbound like this run for you, end to end?
Book A Call
Verification is not optional for scraped or built lists. Here is exactly when to verify, what verifiers can and cannot catch, and how not to overpay for it.

The exact follow-up architecture we run across every client campaign: a 4-step cold sequence, up to 8 touches after interest, and not a single "just bumping this" email anywhere.

No URLs, no email addresses, no domain names in cold copy. The two reasons, and what to do instead.