Outbound

Your Outbound List Is Not the Problem. Your Suppression List Is.

Your outbound list is scraped and your suppression list is a Slack message. How to build the CRM-joined exclusion layer that blocks the sends you regret.

In shortAn outbound suppression list is a commercial exclusion layer, not a compliance checkbox. It blocks cold sends to active customers, open deals, people already in another sequence, peers and competitors, and stale records. Build it as a company-level join against the CRM, keyed on domain, and run it right after dedupe, before any paid enrichment.

Oriol SerraAug 24, 2026 · 8 min read

Every outbound program I audit has a documented ICP and an undocumented exclusion policy.

The list gets a Clay table, a scoring model, a waterfall, a review meeting. The anti-list gets a Slack message that says "hey, don't email these guys" and then nothing. Then a customer forwards your SDR's cold email to their account manager, an AE finds out their open deal got a "quick question about your CRM" sequence, and everyone agrees this is unacceptable and nobody changes the system.

Search "suppression list" and you get deliverability content: honor unsubscribes, scrub hard bounces, protect your sender reputation. All true, all the legal minimum, all handled by a checkbox inside Instantly or Smartlead. That is not a suppression list. That is compliance.

The suppression list I care about is a commercial object. It answers a different question: given the current state of our relationship with this company, are we allowed to cold-contact this person right now? Your sending tool cannot answer that. It has never seen your pipeline.

Two suppression layers, and only one of them exists in most stacks

Layer one, compliance suppression. Unsubscribes, hard bounces, spam complaints, do-not-contact requests, region rules. This lives in the sending tool, it is mostly automatic, and if you are failing here you have a bigger problem than this article.

Layer two, commercial suppression. Customers, open deals, active sequences elsewhere, peers and competitors, and records that are simply no longer true. This lives in the CRM. It requires a join. It is the layer nobody builds.

Layer one protects your domain. Layer two protects your revenue and your reputation with the people who already pay you. Guess which one gets the engineering time.

The five things that should never be on a cold list

1. Active customers. Obvious, universally violated. The reason is always the same: the list was built from a scrape and never joined back to the CRM. If you run CleanOps-style cleanup work you already have this rule written down as a do-not-touch exclusion for merges (active customers, open deals, anything revenue-linked). It is the same list. Reuse it.

2. Open deals. An AE has been working an account for five weeks. Your sequence lands in the champion's inbox with a different value prop, a different price anchor, and a subject line that reads like the company has no idea who they are talking to. You did not create a lead. You created a credibility problem inside a live deal.

3. Anyone already in another sequence. Yours, a teammate's, or another channel's. If email and LinkedIn are running from separate systems with separate lists (which is the default when you add Instantly next to HeyReach), the same person gets touched twice in the same week by two motions that do not know about each other. That is not multichannel. That is a collision.

4. Peers, competitors, and vendors. Our own Dream 100 has hard exclusions written into it: RevOps and GTM agencies, martech and salestech vendors, data and AI-GTM tooling, lead-gen shops, freelancers and fractional operators. They are partners, referral sources, or competitors, and none of them are buyers. The rule that matters is the second half of ours: tag, do not delete. A deleted record comes back next quarter through a different scrape. A tagged record stays suppressed forever.

5. Records that are no longer true. This is the one people forget, because it does not feel like suppression, it feels like data quality. It is both. We got a LinkedIn reply once that read, in full: thank you for your messages, I am currently unemployed, that is why I did not reply. The list said she ran a function at a company. She did not. Nothing in the sending tool knew, because nothing was watching the job-change signal. Every list decays, and a decayed record is not a bad lead, it is a send you should have blocked.

Suppression is a join, not a list

Here is the actual reason this layer does not get built: it is an identity problem wearing a hygiene problem's clothes.

A CSV of emails does not suppress anything useful. If your AE is talking to the VP Sales and you cold-email the Head of Growth at the same company, an email-level blocklist waves you straight through. Suppression has to happen at the company level, because the relationship is with the company, not the mailbox.

That means you need a join key hierarchy, the same one you would write for any CRM identity model:

  • Domain as the primary key for company-level suppression. Normalize it. Strip subdomains and www, handle the parent-and-subsidiary cases explicitly.
  • Email for contact-level suppression only (unsubscribes, bounces, explicit do-not-contact).
  • LinkedIn URL for the LinkedIn channel, because that is the only stable identifier HeyReach-style sending actually has. If your signal store is keyed on LinkedIn URL plus source channel, you already have the spine for this.
  • Never company name. Name matching is how you suppress "Acme" and cheerfully email "Acme Group SL". Flag name matches for human review, do not auto-resolve them.

Revenue does not fail to sync because the integration broke. It fails because two systems are keyed on two different identities. Suppression fails for exactly the same reason.

Where suppression goes in the pipeline

Order is the whole design. Suppression belongs near the top, above every column that costs money:

  1. Dedupe the source table.
  2. Suppress against the CRM export (domains, then emails, then LinkedIn URLs).
  3. Qualify with the AI gate, one ICP question, yes / no / unknown.
  4. Enrich only what survives.
  5. Verified-email gate: nothing writes to the CRM or the sender without a verified email.
  6. Send.

Most teams run suppression at step five, as a final scrub before upload. That is the expensive way to be careful. You have already paid to enrich, waterfall, and validate contacts you were never allowed to email. Suppression is the cheapest column in the table. Put it above the most expensive ones, for the same reason you put the qualification gate first.

Building it, concretely

Write the policy on one page. Every exclusion needs three things: the rule, the owner, and an expiry. "Closed-lost accounts" is not a rule. "Closed-lost within 180 days, owned by Sales, expires automatically" is a rule. Without an expiry your suppression list only grows, and in two years your addressable market is a rounding error.

Materialize it as a live CRM view, not a CSV. A static export is stale the day after you pull it. An active list or saved view with defined membership criteria is a system. If someone has to remember to re-export it, it will not get re-exported.

Push it into the sending tool as a blocklist, then verify with a test contact. This is not optional and it is the step people skip. Put a record that should be suppressed into the flow on purpose and confirm it does not send. Verify before you trust a single report, the same way you verify outbound attribution properties before believing an attribution dashboard.

Log what you excluded and why. A weekly count of blocked records by reason is a genuinely useful metric, and it is the only one in outbound that gets better as it goes up. Eight hundred domains suppressed as existing customers means eight hundred emails you did not have to apologize for. It is also a diagnostic: if "already in another sequence" is your biggest bucket, your channels are not coordinated. If "stale record" is climbing, your enrichment cadence is too slow.

Freeze the labels. Once a suppression reason is defined, never redefine it. Add new reasons under new labels. Redefine the old ones and you can no longer read the trend, which is the only thing the log was for.

What good looks like

Zero sends to customers and open deals, measured, not assumed. Bounce rate under 2 percent and complaint rate under 0.3 percent, which is the bulk-sender bar you are being graded against anyway. One owner for the exclusion policy. A suppression log reviewed weekly alongside reply rate and median time to first reply, not open rate.

And one thing more, because pipelines break silently: put the suppression sync inside your automated health checks. We lost a month of reply data once to a deleted webhook that nobody noticed, because nothing was watching the pipe, only the report. A blocklist sync that quietly stopped running looks exactly like a blocklist sync that is working. Weekly n8n check, flag the break, review it by hand.

The reframe

Outbound teams think their constraint is list volume. It almost never is. The constraint is that the list is built by a system that cannot see the CRM, so the CRM's most valuable information (who we already know, who we already owe something to, who is already mid-conversation) never reaches the send decision.

Fix that and the same list gets better, immediately, without a single new data provider. You are not sending less. You are sending only where you are actually allowed to.

If your outbound is running on a list that has never been joined back to your CRM, that is not a copy problem or a targeting problem. It is an architecture problem, and it is usually leak number two of the five we find in almost every GTM audit: data quality breaking everything downstream. Our GTM Maturity and Revenue Leak Assessment is a 30-minute diagnostic that names the leaks in dollars and tells you which module to fix first. If the answer is that your entry point is uncontrolled, that is what the CleanOps Protocol is for.

Build the anti-list. It is the cheapest thing in your stack and the only one that protects the revenue you already have.