Last updated: August 31, 2026

Ben Argeband, Founder & CEO of Heartbeat.ai — Operationally precise; reduces risk and wasted time.
What’s on this page:
Who this is for
If you run recruiting ops and you’re responsible for keeping email, SMS, and call outreach clean across an ATS, CRM, sourcing tools, and spreadsheets, this applies to you. More specifically: teams who need a repeatable way to capture an opt-out, sync it everywhere it matters, and stop it from getting re-imported next week.
Suppression prevents repeat contact with candidates who’ve already said no, and it saves recruiter time that would otherwise go toward chasing people who won’t respond. Treat it as an ops system, not a one-time cleanup project.
Quick answer
- Core answer
- Build a single suppression system that captures channel-specific opt-outs with source and date, syncs to your ATS/CRM and outreach tools, and blocks re-imports before outreach happens.
- Key insight
- Suppression only works when it’s enforced at import, enrollment, and send or dial time — not just stored in one tool somewhere.
- Best for
- Recruiting ops teams managing opt-outs across email, SMS, and call channels.
Compliance and safety
This method is for legitimate recruiting outreach only. Always respect candidate privacy, opt-out requests, and applicable data laws. Heartbeat does not provide medical advice or legal counsel.
Framework: capture, sync, enforce
Suppression programs that hold up under real recruiting volume tend to do three things consistently:
- Capture: record the stop request once, with enough detail to act on — channel, scope, timestamp, source.
- Sync: propagate that record to every system that can send a message or trigger a task, including ATS, CRM, email sequencer, dialer, and enrichment tools.
- Enforce: prevent outreach and prevent re-entry through import guardrails, enrollment blocks, and audit logs.
The trade-off is real: you’ll spend more time on data hygiene up front. In exchange, you stop paying the hidden cost of repeat contact, escalations, and recruiter hours wasted on people you should never reach out to again.
Channel-specific vs. global suppression, in practice:
- A candidate replies “STOP” to a text — suppress SMS, but email or calls may still be allowed unless they say otherwise.
- A candidate unsubscribes from email — suppress email only, unless your policy or their language extends further.
- A candidate says “don’t contact me again” — treat this as global suppression across email, SMS, and call unless your internal policy requires clarification first.
Step-by-step method
Step 1: Define what you’re suppressing
Before touching any tools, align on three definitions and write them into your SOP so the team logs things the same way.
- Opt-out: a candidate’s request to stop receiving messages on a specific channel or within a defined scope, such as “no texts.”
- Suppression: the operational state where your systems block outreach for that channel or scope, including future imports and sequences.
- Stop request: the triggering event — a reply, an unsubscribe, a verbal request on a call, a recruiter note, or a complaint. It needs a source and timestamp attached.
You’re not just storing a “do not contact” flag. You’re storing a decision about what to block, evidence for why and when, and routing information for where it needs to be enforced.
Step 2: Choose one system of record
Pick a single authoritative place for suppression. For most recruiting teams that’s the ATS or CRM, since that’s where identities converge and where recruiters actually work.
- If the ATS is source of truth, suppression fields live on the candidate record and every other tool reads from it.
- If the CRM is source of truth, the same logic applies, but make sure the ATS updates before outreach tasks get created.
Use this to avoid split-brain suppression:
- If outreach tasks originate in the ATS, make the ATS authoritative and push suppression outward.
- If outreach tasks originate in the CRM, make the CRM authoritative and sync into the ATS before tasks generate.
- If your email, SMS, or dialer tool can enroll candidates without touching ATS/CRM, you still need ATS/CRM as system of record — enforce suppression at enrollment in the sending tools too.
- If you can’t name one owner, you don’t have a system yet. You have several partial lists.
Avoid making a spreadsheet your system of record unless there’s no alternative. Spreadsheets document; they don’t enforce anything.
Step 3: Build a suppression fields schema
You need enough structure to block the right channel, prove what happened, and avoid re-importing suppressed contacts later.
Recommended candidate-level fields:
- suppression_status (enum): none, partial, full
- suppressed_channels (multi-select): email, sms, call, other
- suppression_scope (text/enum): all outreach, no SMS, no calls, no marketing
- suppression_reason (enum): stop request, unsubscribe, complaint, internal policy, unknown
- stop_request_source (text): email reply, SMS keyword, phone call, recruiter note, web form
- stop_request_timestamp (datetime)
- stop_request_actor (text): candidate, recruiter, system
- stop_request_evidence (text/url): message ID, call note link, ticket ID — store pointers, not sensitive content
- suppression_last_synced_at (datetime)
- suppression_notes (text): short, factual
Recommended identity-level fields, if your stack supports them:
- suppressed_emails (array): normalized emails, lowercase and trimmed
- suppressed_phones (array): normalized E.164 numbers
Identity-level fields matter because candidates change jobs, emails, and sometimes phone numbers. Suppression should follow the person, not just the one record where the opt-out happened.
Step 4: Normalize identities before comparing
Suppression breaks down when the same person shows up with a slightly different email or phone format. Normalize before matching:
- Email: lowercase, trim spaces, store both raw and normalized versions.
- Phone: store in E.164, strip punctuation, keep the country code.
- Name: don’t use name as a suppression key — too many collisions.
Set matching priority so a phone match or an email match is enough to block the relevant channel.
Step 5: Capture stop requests from every channel
Build capture paths for the three places stop requests happen most often:
- Email: unsubscribe links, “remove me,” “stop emailing,” auto-unsubscribe events.
- SMS: STOP keywords, “don’t text,” carrier filtering events.
- Call: verbal “don’t call me,” gatekeeper requests, voicemail requests.
Operational rule: whoever sees the stop request first logs it immediately in the system of record, then triggers sync. Don’t wait for ops to clean it up later — that gap is where re-contact happens.
Step 6: Add a simple RACI
- Recruiter (Responsible): logs the stop request immediately, selects channel and scope, adds a short note.
- Recruiting ops (Accountable): owns the schema, sync jobs, import guardrails, and weekly audit.
- Systems admin (Responsible): implements field protections, workflow blocks, and integration monitoring.
- Compliance/privacy stakeholder (Consulted): reviews policy language and escalation handling without being a daily bottleneck.
Step 7: Sync suppression across tools
List every system that can initiate outreach or create an outreach task, then decide how suppression flows into each one.
- ATS ↔ CRM: bi-directional or one-way, but never ambiguous — one has to be authoritative.
- Email sequencer: suppression list upload or API sync, plus automatic unsubscribe ingestion back to the system of record.
- Dialer: blocked numbers list plus call task suppression rules.
- SMS platform: blocked numbers list plus STOP ingestion back to the system of record.
- Enrichment/workflow tools: suppression check before enrichment and before pushing back into ATS/CRM.
Monitoring, so sync failures don’t turn into repeat-contact incidents:
- Alert on failed sync jobs across email, SMS, and dialer, and route to ops with the affected identity keys.
- Run daily reconciliation: sample recent stop requests and confirm they landed in each downstream tool.
- Define retry behavior — automatic retry first, then a ticket with the stop_request_timestamp and source attached.
If you’re running ATS enrichment workflows, the suppression check needs to happen before enrichment writes back into your ATS or CRM. Skip that order and you’ll keep resurrecting contacts you already suppressed.
Step 8: Enforce suppression at three choke points
Most teams enforce in only one place, usually the email tool. You need all three:
- Before import: block suppressed identities from being created or reactivated without review.
- Before enrollment: prevent sequence enrollment and call or SMS task creation when that channel is suppressed.
- Before send/dial: last-mile suppression in the sending tool itself, as a safety net.
When a record gets blocked at import due to a partial match — a shared clinic phone line, for example — ops should review it and either confirm suppression or correct the identity mapping rather than force it through.
Step 9: Escalation path for complaints
- Pause outreach to the identity keys involved (email and phone) while you investigate.
- Verify the stop request event in the system of record — source, timestamp, scope — and fill in anything missing.
- Confirm propagation to downstream tools and backfill suppression wherever sync failed.
- Document resolution in the candidate record and your ops log: what failed, what changed, how you’ll prevent it next time.
Step 10: Add import guardrails
Re-import is where most “we already suppressed them” failures actually happen. Put guardrails in writing and in tooling:
- Import rule: any inbound list or enrichment feed gets checked against suppression keys — normalized email/phone — before creating or updating records.
- Quarantine queue: matches route to an ops review queue instead of importing directly.
- Field protection: imports can’t overwrite suppression fields unless the import source is the system of record itself.
- Reactivation policy: define who can remove suppression and what evidence is required, such as explicit candidate consent with a timestamp.
Step 11: Train recruiters on a one-sentence logging standard
Recruiters won’t log stop requests if it’s complicated. Give them one sentence they can paste into notes:
- “Candidate requested no [channel] outreach on [date/time] via [source]. Updated suppression scope to [scope].”
Ops can standardize the structured fields later. The event just needs to be captured right away.
Diagnostic table
| Symptom | Likely root cause | Fastest fix (ops) | Where to enforce |
|---|---|---|---|
| Suppressed candidate gets emailed again | Suppression stored in ATS/CRM but not synced to email tool (or overwritten on import) | Make ATS/CRM the system of record; lock suppression fields from imports; sync to email suppression list | Before enrollment + before send |
| Suppressed number still gets dialed | Dialer blocklist not updated; call tasks created without suppression check | Push blocked numbers to dialer; add ATS/CRM rule: no call tasks when call channel suppressed | Before task creation + before dial |
| Same person reappears after enrichment | Enrichment writes new email/phone and creates a “new” identity | Normalize identities; suppression match on phone OR email; quarantine matches | Before import + before enrichment writeback |
| Ops can’t prove when/why suppression happened | No logging fields for source/date/evidence | Add stop_request_source + timestamp + evidence pointer; require on any suppression change | System of record |
| Recruiters avoid logging because it’s slow | Too many required fields; unclear definitions | Use the one-sentence logging standard; ops backfills structured fields weekly | ATS/CRM |
Entity check: This table assumes your ATS/CRM is where logging happens and where suppression state is stored before being synced outward.
Weighted checklist
Use this to score whether your suppression program will hold up under real recruiting volume. Score out of 100.
- (20) System of record is defined (ATS or CRM) and documented; only one tool is authoritative.
- (15) Channel-specific suppression exists for email, SMS, and call — not one generic flag.
- (15) Stop request logging includes source, timestamp, and actor; recruiters can log quickly with a single action and short note.
- (15) Import guardrails run suppression checks before record creation/update, and suppression fields are protected from overwrite.
- (10) Enrollment is blocked when the relevant channel is suppressed, for both sequences and call/SMS tasks.
- (10) Sync to email, SMS, and dialer suppression endpoints is automated with a defined cadence and failure alerts.
- (10) An audit trail exists showing who changed suppression, when, and why, with an evidence pointer.
- (5) A reactivation policy exists and requires explicit candidate consent captured with a timestamp.
Pass/fail guidance: Under 70 points, you’re relying on memory and good intentions. Over 85, you’re running a real ops system.
Outreach templates
Template 1: Recruiter note (call stop request)
Subject/Note: Stop request logged
Body: Candidate requested no call outreach on [YYYY-MM-DD HH:MM TZ] via phone conversation. Updated suppression: channel=call, scope=[all outreach/no calls]. Source logged. (ATS/CRM record updated.)
Template 2: Candidate confirmation (email)
Subject: Confirming your outreach preference
Body: Thanks for letting me know. I’ve updated your preferences and will stop contacting you via [email/SMS/calls] going forward. If you ever want to reconnect, reply here and I’ll update it.
Template 3: Internal ops message (propagation failure)
Subject: Suppression sync failure — action needed
Body: A stop request was logged in the system of record but did not propagate to [tool]. Please block [email/phone] in [tool] and investigate the sync job. Include stop_request_timestamp and source in the ticket.
Template 4: Vendor/tool import instruction
Message: Before importing any contacts into our ATS/CRM, run a suppression match on normalized email and E.164 phone. If matched, quarantine and do not create/update records unless ops approves.
Common pitfalls
- A “suppression list” that only lives in the email tool. That doesn’t stop call tasks, SMS, or re-imports. Enforce at import, enrollment, and send/dial.
- One generic flag for everything. Candidates often mean “don’t text me” but are fine with email. Store channel-specific suppression so you don’t burn good leads or ignore stated preferences.
- No source or date. If you can’t answer when someone asked, you can’t troubleshoot disputes or train the team properly.
- Imports overwriting suppression. Protect suppression fields from being overwritten by enrichment feeds or list uploads.
- Shared clinic numbers and group emails. These create false matches. Quarantine and verify identity mapping before applying global suppression.
- Identity mismatch. Without normalized phone/email, you’ll miss matches and re-contact people who already opted out.
- Reactivation without evidence. Removing suppression because “the candidate seems interested” invites repeat contact issues. Require explicit consent and log it.
How to improve results
Improvement here means fewer accidental contacts, fewer escalations, and less recruiter time wasted chasing dead ends. It also keeps your outreach channels healthier over time.
Measurement instructions
Track suppression as an operational workflow with a few simple counters you can pull weekly from your ATS/CRM and sending tools:
- Repeat-contact incidents: messages or calls sent to identities marked suppressed at the time of send, counted weekly. Goal: trend to zero.
- Suppression propagation lag: time from stop_request_timestamp to suppression appearing in each downstream tool, measured as median and 95th percentile. Monitor it and reduce it over time.
- Import block rate: records blocked or quarantined due to suppression match, per 100 attempted imports. If this is zero, you’re probably not checking correctly.
- Enrollment block rate: sequence or dial enrollments blocked due to suppression, per 100 attempts. This should exist as proof enforcement is actually working.
If you also monitor outreach performance, keep the definitions consistent:
- Deliverability rate = delivered emails / sent emails, per 100 sent.
- Bounce rate = bounced emails / sent emails, per 100 sent.
- Reply rate = replies / delivered emails, per 100 delivered.
- Connect rate = connected calls / total dials, per 100 dials.
- Answer rate = human answers / connected calls, per 100 connected.
OPS_TEMPLATE worksheet: schema, propagation, and import guardrails
This worksheet targets the most common failure: suppressed contacts re-entering through enrichment or list imports.
A) Minimum viable suppression schema
- Candidate fields (ATS/CRM): suppressed_channels, suppression_scope, stop_request_source, stop_request_timestamp, stop_request_actor, stop_request_evidence, suppression_reason.
- Identity fields: normalized_email, normalized_phone (E.164).
- Logging rule: every suppression change requires source and timestamp, system-enforced where possible.
B) Propagation checklist
- Email tool: sync suppressed emails and ingest unsubscribes back to the system of record.
- SMS tool: sync blocked numbers and ingest STOP events back to the system of record.
- Dialer: sync blocked numbers and block call task creation when the call channel is suppressed.
- Workflow/enrichment: run a suppression check before writeback and quarantine matches.
C) Import guardrails
- Pre-import step: normalize incoming email/phone and match against suppressed identities.
- On match: route to a quarantine queue rather than auto-creating or updating the record.
- Field protection: suppression fields stay read-only for imports unless the source is the system of record.
- Audit: log import job ID and counts — attempted, blocked, quarantined, approved.
D) Example suppression event record
| Field | Example value |
|---|---|
| suppressed_channels | sms |
| suppression_scope | no SMS |
| stop_request_source | SMS reply |
| stop_request_timestamp | [YYYY-MM-DD HH:MM TZ] |
| stop_request_actor | candidate |
| stop_request_evidence | message_id:[your-sms-platform-id] |
| normalized_phone | +1XXXXXXXXXX |
| normalized_email | candidate@example.com |
Weekly audit loop
- Review repeat-contact incidents and identify which choke point failed — import, enrollment, or send/dial.
- Check propagation lag for the last week’s stop requests and fix whichever tool is drifting.
- Work the quarantine queue: approve true matches, correct false matches, and update matching rules as needed.
Workflow fit tips
- Put a suppression status badge on the candidate header in your ATS/CRM so recruiters see it before they click call, text, or email.
- Make suppression a required step in disposition reasons — for example, “Not interested — opted out of SMS.”
- When sourcing in Heartbeat.ai, keep suppression synced so recruiters don’t waste cycles; Heartbeat.ai can support workflows that prioritize connectability, including ranked mobile numbers by answer probability when you’re dialing.
Legal and ethical use
This is operational guidance, not legal counsel. The obligation in practice is simple: when someone asks you to stop, you stop on the channels and scope they requested, and you make sure your systems don’t quietly forget.
Data minimization matters operationally: store what you need to enforce suppression — channel, scope, timestamp, source, and an evidence pointer. Avoid storing message bodies or sensitive content unless internal policy requires it.
Align your process with the rules and guidance that apply to your outreach channels and geography. Start with these official resources:
Operationally: document consent where needed, honor opt-outs quickly, and keep suppression synchronized across every system that can contact a candidate.
Evidence and trust notes
Heartbeat content is written for recruiting operators who need workflows that hold up under volume. For how we evaluate data quality, identity resolution, and operational claims, see our trust methodology.
Primary references used for the compliance concepts in this playbook:
- FTC: CAN-SPAM Act Compliance Guide for Business
- FCC: Telephone Consumer Protection Act (TCPA) overview
- For broader recruiting compliance operations, see Recruiting compliance resources.
FAQs
What fields should we store for suppression?
Store channel-specific suppression (email/SMS/call), scope, stop request source, timestamp, actor, and an evidence pointer. Also store normalized email and E.164 phone for matching on import.
Should suppression live in the ATS or the CRM?
Pick one system of record. If recruiters create outreach tasks in the ATS, put suppression there and sync outward. If tasks originate in the CRM, make the CRM authoritative and sync into the ATS before tasks are generated.
How do we stop suppressed contacts from getting re-imported?
Add pre-import suppression matching on normalized email/phone, quarantine matches, and protect suppression fields from being overwritten by enrichment feeds or list uploads.
What’s the difference between opt-out and suppression?
An opt-out is the candidate’s request (event) to stop contact on a channel/scope. Suppression is the enforced system state that blocks outreach and prevents re-entry across tools.
How does this affect deliverability and recruiter throughput?
When suppression is enforced, you reduce complaints and accidental contacts, which helps keep email deliverability healthier and prevents recruiters from burning time on people who already said stop. Track deliverability rate (delivered/sent per 100 sent) and repeat-contact incidents weekly.
Next steps
- Implement the OPS_TEMPLATE worksheet: schema, propagation checklist, and import guardrails.
- Audit your stack for enforcement at the three choke points: import, enrollment, and send/dial.
- If you’re also managing candidate re-engagement, pair this with reactivating physician candidates without burning trust.
- When you’re ready to operationalize sourcing and suppression together, start free search & preview data.
About the Author
Ben Argeband is the Founder and CEO of Swordfish.ai and Heartbeat.ai. With deep expertise in data and SaaS, he has built two successful platforms trusted by over 50,000 sales and recruitment professionals. Ben’s mission is to help teams find direct contact information for hard-to-reach professionals and decision-makers, providing the shortest route to their next win. Connect with Ben on LinkedIn.