We audited a UK SaaS sales team's Monday morning routine in March. Forty-five minutes, every week: two reps reading 340 emails in sequence, manually tagging each as interested, not now, unsubscribe, or referral, then updating HubSpot by hand. The same process had run for 14 months. When we counted the cost — 390 hours of AE time per year at a £65k blended salary — the decision to automate it took under ten minutes.
The solution was an LLM classifier between the sending tool and the CRM, reading each reply the moment it landed and writing intent back to HubSpot as a structured contact property. Three weeks from kickoff to live. The system now handles 94% of replies without human input.
Reply classification categories: the six intent types every UK outbound team needs to handle differently
Most teams work with four labels: interested, not now, unsubscribe, bounce. That is not enough. A reply saying "you should speak to our head of ops, Sarah" is none of those four — but it is the highest-value reply in the batch.
The six categories that cover more than 98% of UK outbound reply volume:
| Category | Example signal | Required action |
|---|---|---|
| Interested | "Yes, I'd love to chat" | Create meeting task, move deal stage |
| Not now (deferral) | "Try us in Q1" | Pause sequence, enrol in 60-day drip |
| Hard no | "Not interested, please stop" | Suppress, close deal as Lost |
| Unsubscribe | "Remove me from your list" | Suppress immediately, log timestamp |
| Referral | "Speak to Sarah in ops" | Create AE task, attempt contact lookup |
| Out of office | Auto-reply from mail server | Re-queue for return date |
Each category needs a different CRM action, a different cadence, and for unsubscribe, different legal treatment. Keyword lists handle the obvious cases but break at the edges: "We are actually expanding next year" is a not-now, not a hard no — no keyword rule catches that reliably.
LLM classifier prompt design for reply intent: why zero-shot outperforms keyword rules at 300 replies a week
Keyword matching fails at scale because reply intent lives in context, not individual words. "Not for us right now" is a deferral. "Not for us, and please remove me" is an unsubscribe. "It is not the right time but have you considered speaking to James?" is a referral with a soft deferral embedded. A keyword rule firing on "not for us" misclassifies all three.
Zero-shot classification via GPT-4o-mini or Claude Haiku outperforms keyword rules because the model reads the full reply and assigns the most specific applicable label. Our classifier prompt:
system: |
You are a reply classifier for a UK B2B outbound sales sequence.
Classify into exactly one of:
INTERESTED | NOT_NOW | HARD_NO | UNSUBSCRIBE | REFERRAL | OUT_OF_OFFICE
Rules:
- UNSUBSCRIBE: any explicit removal request, regardless of tone
- NOT_NOW: clear deferral with forward-looking language; no removal request
- HARD_NO: clear refusal, no forward-looking language, no removal request
- REFERRAL: directs sender to a named third party inside the prospect's org
- OUT_OF_OFFICE: automated absence message from a mail server
- INTERESTED: positive engagement, meeting request, or question about the offer
Return JSON only:
{"intent": "<CATEGORY>", "confidence": 0.0-1.0, "referral_name": "<name or null>"}
user: |
Original email subject: {{subject}}
Reply body: {{reply_body}}
In testing on 1,200 historical replies, this structure returned confidence ≥0.85 on 94% of messages. The remaining 6% — mostly multi-intent replies and context-free one-word responses — routed to human review. Token cost at GPT-4o-mini pricing: roughly £0.0003 per reply, under £1 per week at 340 replies.
One counterpoint worth holding: a 2023 evaluation of LLM text classifiers found that general-purpose models underperform fine-tuned classifiers on domain-specific categories with subtle distinctions. We tested six prompt variants before settling on the version above. Do not copy-paste any prompt without validating it against your own historical reply corpus.
Handling not-now replies: the automated follow-up cadence that converts 19% of deferrals within 90 days
A not-now reply is not a dead lead. In our client dataset, 19% of prospects who replied with a clear deferral — "speak to us in Q2", "we are heads-down until the summer" — booked a meeting within 90 days when re-engaged with a sequenced follow-up. The critical difference from a cold follow-up: the re-engagement email references the original conversation by name.
The cadence that produced that 19% conversion rate:
- Day 0: Classifier fires → contact tagged
not_now, active sequence paused, 60-day drip enrolled - Day 60: Email 1 — short reconnect ("You mentioned Q3 — wondering if the timing has shifted")
- Day 75: Email 2 — new relevant angle (case study, product update, or sector news)
- Day 90: Email 3 — soft close ("Happy to keep this on the list if timing changes — just say the word")
At day 90, the contact moves to long-term nurture rather than being suppressed or re-enrolled in an active sequence. Never re-enrol until the contact explicitly responds positively to a drip message. For sequencing architecture, see our post on multi-channel outbound sequence design.
Unsubscribe and PECR compliance: the suppression workflow that fires the moment a removal request lands
PECR requires you to stop sending marketing communications once someone asks to be removed. The ICO's direct marketing guidance describes this as "as soon as reasonably practicable." Automated suppression firing within 60 seconds satisfies that standard.
The suppression workflow:
- Reply arrives → classifier returns
UNSUBSCRIBE - n8n webhook fires immediately
- n8n calls HubSpot API: set
email_opt_out = true,suppression_reason = "unsubscribe_reply",suppression_timestamp = ISO8601_NOW - HubSpot unenrolment trigger removes the contact from all active sequences
- Suppression event logged to Postgres with the message ID and reply text for audit purposes
The gap that bites teams: CRM suppression and sending-tool suppression often are not synchronised. If your sending tool pulls contact lists on a schedule rather than checking the HubSpot opt-out flag in real time, a suppressed contact can still receive a message in the next send window. The fix is a real-time webhook from HubSpot's contact property change event to the sending tool's suppression API — or run sequences inside HubSpot so the opt-out flag is the single source of truth.
For broader PECR obligations in UK outbound, see our PECR and TPS compliance guide.
Referral replies: detecting and routing you-should-talk-to-my-colleague without a human reading every thread
A referral reply — "you should speak to James in procurement" — is the highest-intent signal in an outbound sequence. The prospect liked the message enough to forward the lead internally. Missing it because the classifier filed it as a hard no costs pipeline.
The classifier returns a referral_name field alongside the intent label. The n8n flow for a REFERRAL reply:
- Extracts
referral_nameand context from the classifier JSON - Searches HubSpot contacts for that name in the same company domain
- If found: associates the existing contact with the deal and creates an AE outreach task
- If not found: creates a new contact stub with
lead_source = "referral",status = "to enrich" - Sends AE a Slack notification with the referral name, source contact, and reply text
Names extracted by the LLM are sometimes informal ("speak to Sarah from ops" where the full name is Sarah Whitfield). We pass the referral name and company domain to a LinkedIn Sales Navigator lookup to resolve to a full profile before creating the contact. That lookup adds roughly two seconds to the flow but prevents tasks being created against the wrong person. For tracking referral leads through the pipeline after this initial routing step, see our guide on referral lead tracking automation for UK professional services.
Out-of-office detection and re-queue logic: how to pause, hold, and re-send when the decision-maker is away
Out-of-office replies are distinct because the correct action is time-dependent: do nothing until the contact returns, then re-engage with the original context intact. A re-queue that fires while the decision-maker is still away wastes a send.
The re-queue logic in our n8n workflow:
// Extract return date from OOO text using a date-extraction LLM call
const returnDate = await extractReturnDate(replyBody);
// Default to 7 days if no explicit date found
const reQueueDate = returnDate
? new Date(returnDate)
: addDays(new Date(), 7);
reQueueDate.setHours(9, 0, 0, 0); // 9 AM UK local time
await hubspot.crm.tasks.basicApi.create({
properties: {
hs_task_subject: `Re-queue after OOO: ${contactName}`,
hs_task_body: `Original reply: "${replyBody.slice(0, 200)}..."`,
hs_timestamp: reQueueDate.toISOString(),
hs_task_type: "EMAIL",
hubspot_owner_id: assignedAeId
}
});
Seven days outperforms 14 days as a default: the prospect is back, the inbox is processed, and the original email is recent enough to retain context. When the return date is explicit in the OOO message, use it — parsing "back on Monday 22 September" is a one-line LLM call.
One edge case: contacts whose OOO replies arrive from a shared inbox or PA address. If the reply sender domain matches the prospect's company domain but the address differs from the original send address, route to human review rather than schedule the automated re-queue.
HubSpot integration: writing reply intent to deal properties and triggering sequence actions automatically
Every classified reply writes three properties to HubSpot: reply_intent (the category label), reply_confidence (0–1 float), and reply_classified_at (ISO timestamp). These become the trigger conditions for HubSpot workflows, so the CRM handles routing rather than n8n branching logic.
HubSpot Workflow: "Reply intent router"
Trigger: "reply_intent" is known AND "reply_classified_at" < 5 minutes ago
Branch — INTERESTED
→ Create meeting booking task (deal owner)
→ Move deal to "Meeting Requested"
→ Notify AE via Slack
Branch — NOT_NOW
→ Unenroll from active sequences
→ Enrol in "60-day nurture" sequence
Branch — UNSUBSCRIBE or HARD_NO
→ Set email_opt_out = true
→ Unenroll from all sequences
→ Close deal: Lost
Branch — REFERRAL
→ Create AE task with referral name
→ Pause sequence
Branch — OUT_OF_OFFICE
→ Pause sequence
→ Trigger n8n webhook for re-queue scheduling
The HubSpot Sequences API does not expose a native "pause and re-enrol at a future date" action — that gap is why OOO handling still needs n8n as middleware. Everything else runs inside HubSpot. For a live example of the classification-to-CRM-action pattern, see our case study on the LinkedIn AI SDR build.
What changed in 2025–2026: HubSpot Breeze reply detection and native AI intent tagging in Salesloft
Two platform developments shifted the build decision for this system in the past 18 months.
HubSpot Breeze — rolled out across HubSpot in Q4 2024 — includes Breeze reply detection within Sequences. It classifies replies into three categories: positive, negative, and out of office. For teams with under 100 replies per week and no referral routing requirement, Breeze removes the need for a custom classifier entirely. The limitation: it does not write structured intent properties to the contact record, so you cannot build conditional HubSpot workflow branches without additional glue. The output surfaces in the Sequences UI but does not propagate to deal stages.
Salesloft added native AI intent tagging in early 2025, surfacing signals in the cadence view rather than writing them to a CRM field — useful for human-review workflows, less useful for fully automated routing.
The practical implication for new builds: start with Breeze if you are HubSpot-native and your taxonomy is simple. Build the custom n8n classifier when you need referral routing, confidence-gated human review, or structured contact properties that downstream workflows act on.
Good / Bad / Ugly: three reply-handling approaches and their impact on reply-to-meeting conversion rates
| Approach | Reply-to-meeting rate | Manual time/week | PECR exposure |
|---|---|---|---|
| Good — LLM classifier + HubSpot workflow routing | 18–22% | <5 min (review queue only) | Low — real-time suppression |
| Bad — keyword rules + manual exceptions | 11–14% | 40–60 min | Medium — edge cases missed |
| Ugly — no classification, AE reads every reply | 8–12% | 90+ min | High — human error on timing |
Good (LLM classifier): Handles 94% of volume automatically, routes 6% to human review, and writes intent to HubSpot in under two seconds. Not-now replies hit the drip within minutes. Unsubscribes are suppressed before the AE opens their laptop. The reply-to-meeting improvement — 18–22% versus the 8–12% baseline — comes from speed: interested replies trigger a booking link within the same hour, not the next working day.
Bad (keyword rules): Works for obvious cases. Breaks on polite hard nos containing forward-looking language ("we are happy with our setup but check back after our Series A") — keyword rules classify these as not-now and enrol prospects in a drip they did not want. The PECR risk is real: a one-word reply like "stop" passes through a rule requiring "unsubscribe" as the literal trigger.
Ugly (manual-only): Forty-five minutes per week becomes 390 hours at 14 months. Different reps classify identical replies differently, making intent distribution unanalysable and sequence optimisation guesswork. Manual suppression happens at batch-update time rather than reply receipt — exactly the PECR exposure the ICO's enforcement programme increasingly targets.
For teams looking to recover stalled pipeline alongside reply handling, the CRM pipeline hygiene automation post covers deals that go quiet before any reply ever arrives.