Smartlead Webhook to HubSpot: Positive Replies Only (2026 Setup)
By Puzzle Inbox Team · May 22, 2026 · 8 min read read
Route only positive Smartlead replies into HubSpot with a webhook, AI category filter, and dedupe. Operator-grade setup that stops noise from polluting your CRM.
The Smartlead webhook to HubSpot positive replies only flow takes 20 minutes and saves your CRM from 80% of noise.
Sending every Smartlead reply to HubSpot is how CRMs die. Out-of-office, unsubscribes, "wrong person" bounces, and angry replies all create contacts, trigger workflows, and confuse reps. The fix is a webhook that fires only when Smartlead's AI reply categorisation labels a reply as Interested or Meeting Request. Everything else stays in Smartlead's master inbox where it belongs.
This guide walks the exact setup we use across 40+ outbound accounts: Smartlead webhook, a thin middleware filter (Make or n8n), HubSpot contact upsert, and a deal creation step. No Zapier tax, no duplicate contacts, no Slack spam.
Why filter Smartlead replies to HubSpot before sync
Smartlead's reply categorisation is good, but the default "reply received" webhook fires on every inbound. If you pipe that raw into HubSpot, you'll create contact records for auto-responders, mailer-daemon bounces, and competitors fishing for intel. Within a week your contact count balloons and your "MQL from outbound" report becomes meaningless.
The positive-replies-only pattern solves three problems at once: CRM hygiene stays clean, sales reps only see real intent, and your attribution dashboards actually reflect pipeline. For a deeper breakdown of reply triage logic, see our Smartlead master inbox triage guide.
What "positive" actually means in Smartlead
Smartlead's AI labels replies as Interested, Meeting Request, Information Request, Not Interested, Do Not Contact, Wrong Person, and Out of Office. For HubSpot sync, the safe set is Interested and Meeting Request. Information Request is a judgment call - we route it to a Slack channel for SDR review, not directly to HubSpot.
Step 1: Configure the Smartlead webhook for positive replies only
In Smartlead, go to Settings, then Webhooks, then Add Webhook. Pick the Reply Received event. Smartlead lets you filter by category on the webhook itself in the 2026 build - check both Interested and Meeting Request, leave the rest unchecked.
Point the webhook URL at your middleware (Make scenario URL or n8n webhook node). Smartlead sends the full payload: prospect email, campaign ID, reply body, AI category, sentiment score, and the original sequence step. Save and trigger a test reply to confirm delivery.
Payload fields you actually need
From the Smartlead payload, keep: lead_email, first_name, last_name, company_name, campaign_name, reply_message, reply_category, and sentiment_score. Drop the rest - HubSpot doesn't need the full sequence history on the contact record.
Step 2: Middleware filter and dedupe logic
Even with Smartlead's category filter on, add a second guard in your middleware. Reason: Smartlead occasionally mislabels short replies like "thanks" as Interested. A regex check on reply_message for unsubscribe phrases ("remove me", "stop emailing", "not interested") prevents the worst false positives from reaching HubSpot.
Next, run a HubSpot contact lookup by email. If the contact exists, branch to "update" - add a note with the reply, set lifecycle stage to MQL, and tag with the campaign name. If new, branch to "create" with the full payload mapped to HubSpot properties.
Why dedupe matters more than you think
Outbound lists overlap. The same prospect might exist in HubSpot from a webinar signup six months ago. Creating a duplicate breaks your attribution and confuses the AE who already owns the record. Always lookup-then-branch.
Step 3: HubSpot contact upsert and deal creation
For new contacts, set lifecyclestage to marketingqualifiedlead, hs_lead_status to OPEN, and a custom property outbound_source to the Smartlead campaign name. For existing contacts, only update lifecycle stage if it's currently Subscriber or Lead - never downgrade an SQL back to MQL.
If the reply is categorised Meeting Request, create an associated deal in the "Outbound - Reply Received" pipeline stage and assign to the campaign owner. This is where the workflow earns its keep: AEs get a real deal in their queue, not a contact buried in a list.
Logging back to Smartlead
Add a final webhook step that posts back to Smartlead's API to mark the lead as Converted. This stops follow-up sequences from sending to a prospect who's now in a sales conversation. Skipping this is the most common operator error we see.
Common failure modes
Three things break this flow in production. First, Smartlead webhook retries: if your middleware returns a non-200, Smartlead retries up to 5 times - always return 200 even on filter rejection. Second, HubSpot API rate limits during reply spikes - batch upserts or add exponential backoff. Third, missing company associations - Smartlead doesn't always populate company_name, so fall back to email domain parsing.
For teams running this at scale, Puzzle Inbox handles the entire Smartlead-to-CRM positive reply pipeline without middleware, including dedupe and deal creation. Worth a look if you're tired of debugging Make scenarios. See also our outbound reply attribution playbook for downstream reporting.