How to Classify Positive, Negative, Referral, and Out-of-Office Replies

The Sendvanta Team · October 17, 2026 · 8 min read

Most cold email tools give you one reply counter. A campaign shows 6% replies and you feel good about it. Then you open the inbox and find that half of those replies are out-of-office autoresponders, a quarter are some version of "not interested," a few are security gateways bouncing a challenge at you, and three are actual humans who want to talk.

If you don't split those apart, three things break at once: your metrics lie, your sequences keep emailing people who already said no, and the one referral buried in the pile — the highest-value reply type in cold email — gets answered on day four instead of day zero.

Here is the classification scheme that actually holds up at volume, how to detect each type without reading every message, and what each bucket should trigger.

{"h2":"Four buckets is the starting point, not the finish line"}

Positive, negative, referral, out-of-office is the right top-level split. But if you stop there, you'll make bad decisions inside each bucket. "Send me pricing" and "let's book 20 minutes Thursday" are both positive, and they need different responses. "Not right now, ask me in Q3" and "remove me from your list permanently" are both negative, and treating them the same either burns a future deal or earns you a spam complaint.

The working taxonomy I'd recommend has eight labels across four top-level groups.

{"table":{"headers":["Label","Typical signals","Sequence action","Next step"],"rows":[["Positive — meeting ready","\"happy to chat\", \"send a time\", calendar language","Stop","Reply within 1 hour, propose two slots"],["Positive — info request","\"send pricing\", \"how does it work\", \"do you support X\"","Stop","Answer the question, then ask for the call"],["Referral / forward","\"copying Sarah\", \"that's handled by\", \"wrong person\"","Stop for original contact","New thread to named person, cite the referrer"],["Soft no — timing","\"not right now\", \"revisit next quarter\", \"no budget until\"","Stop","Suppress 90 days, re-enroll with new angle"],["Hard no — not interested","\"we're all set\", \"not a fit\", \"we use [competitor]\"","Stop","Suppress contact, keep account open"],["Opt-out / hostile","\"remove me\", \"stop emailing\", \"unsubscribe\", legal threats","Stop","Suppress at domain level, never re-enroll"],["Out of office","Auto-Submitted header, return date, \"on annual leave\"","Pause, don't stop","Resume after return date"],["System / non-human","Ticket confirmations, gateway challenges, delivery notices","Continue","Exclude from all reply metrics"]]}}

{"h2":"Out of office: the bucket that poisons your numbers"}

On a cold list of business addresses, out-of-office replies routinely run 20-35% of all replies depending on the month. In August and late December it can be higher. If those sit in your reply counter, a campaign with a true 2.1% human reply rate reads as 3.2% and you'll draw the wrong conclusions from every A/B test you run.

Detect them from headers first, keywords second. Headers are far more reliable:

{"ul":["`Auto-Submitted: auto-replied` — the RFC 3834 standard, used by Microsoft 365 and most modern servers","`X-Autoreply: yes` or `X-Autorespond` — older but still common","`Precedence: bulk` or `auto_reply`","`X-MS-Exchange-Inbox-Rules-Loop` — Exchange-generated automatic replies","Empty `Return-Path: <>` — the message was sent as a non-delivery-style notification"]},

Keyword matching on the subject and first 200 characters catches the rest: "out of office", "automatic reply", "on leave", "abwesenheit", "je suis absent". Multi-language matters more than people expect if you send into Europe.

The important behavioral rule: an OOO should pause the sequence, not stop it. If someone is out until the 14th and your next step fires on the 9th, you've burned a touch on an empty inbox. Parse the return date from the body — most autoresponders state it plainly — and reschedule the next step for one business day after. If you can't parse a date, default to a 7-day pause.

Two bonus plays from OOO bodies that most teams ignore. First, they almost always name a colleague: "for urgent matters contact Jen at jen@company.com." That's a free, consented-ish referral path into the same account — treat it as a referral lead, not noise. Second, the signature block in an OOO often confirms job title changes your list didn't have.

{"h2":"Referrals are a separate bucket for a reason"}

Referrals get lumped into "positive" by most classifiers, and that's a real mistake. They need different handling and they're worth more. A forwarded intro converts at multiples of a cold first touch because the new contact arrives with an internal recommendation attached.

When you classify a reply as a referral, you want three fields extracted, not just a label: the named person, their email or department if given, and whether the referrer explicitly offered to forward. "I've copied Sarah" means Sarah is already on the thread — reply in thread, don't start a new one. "You want our ops lead" with no name means your next move is a one-line reply asking for the name, not a guess at ops@.

A compliance note: the referred person is a new contact who hasn't been through your verification or suppression check. Run them through the same process as any other lead before you send. Being referred internally doesn't exempt you from unsubscribe requirements — see our compliance guide if you send into the EU.

{"h2":"Splitting soft no from hard no from opt-out"}

This is where keyword rules earn their keep, and where getting it wrong costs you money in both directions.

A soft no is a timing objection: "we just signed with someone," "revisit in Q3," "no budget this year." These are your best re-engagement list six months out. Suppress them from the current campaign, tag with a re-contact date, and write the reason into the record. A soft no re-approached with a new angle at the right time converts better than net-new cold.

A hard no is a fit objection: "not a fit," "we're all set," "we build this in-house." Stop the sequence for that contact. You can usually keep contacting other people at the same account unless the reply came from someone senior enough to speak for the company — a CTO saying "we're not buying this" should suppress the account, an individual contributor shouldn't.

An opt-out is any request to stop, in any wording, plus anything hostile. "Remove me," "take me off your list," "stop," "how did you get my email," or a threat to report you. These go straight to a permanent domain-level suppression with no human approval step. The asymmetry is obvious: wrongly suppressing someone costs you one lead, wrongly re-emailing someone costs you a spam complaint, and complaints are what push you over Google and Yahoo's 0.3% threshold.

{"h2":"Rules, then a model, then a review queue"}

Pure keyword rules get you roughly 70-80% accuracy on a typical B2B reply stream. They're excellent at OOO detection and opt-out detection, because both use narrow, repetitive language. They fall apart on polite negatives — "this looks interesting but we're focused elsewhere this year" contains "interesting" and nothing else useful.

An LLM classifier pushes accuracy into the low 90s, with two conditions. Give it the full reply body and strip the quoted thread first, or it will classify your own pitch. And return a confidence score, because the value of the whole system is in what you do with low confidence.

A practical routing policy:

{"ul":["High-confidence opt-out or OOO: act automatically, no human review","High-confidence positive or referral: route to a human immediately with a draft reply, never auto-send","Anything below your confidence threshold: drop into a review queue the owner clears twice a day","Every label a human corrects feeds back as a rule or few-shot example"]},

We've written separately about which reply actions to automate and which to answer yourself — the short version is that classification and routing should be automatic, and the actual words you send to a positive reply should not be.

{"h2":"The traps that cause most misclassifications"}

{"ul":["Ticketing autoresponders. \"Your request #48213 has been received\" from a support@ alias is a system message, not a reply. If you're emailing shared inboxes at all, you'll see a lot of these.","Security gateway challenges. Barracuda, Mimecast and similar send verification requests that look like replies. They inflate your numbers and sometimes trick engagement tracking entirely.","\"I no longer work here.\" This is list hygiene, not a negative. Suppress the address, flag the account for a re-sourcing pass, and don't count it against your copy.","Partial quotes. A reply that's 90% your original email and 10% \"no thanks\" will confuse any classifier that doesn't strip quoted text.","Single-word replies. \"Sure\", \"ok\", \"?\" — low confidence by definition. Send them to humans."]},

Audit the system weekly: pull 50 random classified replies, re-label them by hand, and measure agreement. If you're below 90% on the labels that trigger automated actions, fix the rules before you scale sends.

{"h2":"What to measure once replies are clean"}

Once classification is reliable, retire raw reply rate as your headline metric and track these instead, all per 100 delivered emails rather than per reply:

{"ul":["Qualified reply rate — positive plus referral. This is the number that correlates with pipeline.","Opt-out rate — your early warning for targeting or copy problems. Above about 0.5% and something is off.","Soft-no rate — a healthy signal. It means you're reaching the right people at the wrong moment.","OOO share — useful for timing, not performance. A spike means you're sending into a holiday period."]},

Benchmarks for what "good" looks like are in our reply rate benchmarks post, but the comparison is only meaningful once you're measuring human replies rather than autoresponders.

{"h2":"How Sendvanta handles this"}

Sendvanta's unified inbox classifies replies as they arrive rather than leaving you to sort a pile. Autoresponders are detected from headers and excluded from engagement metrics, so your reply rate reflects humans; out-of-office replies pause the sequence and resume after the stated return date instead of burning follow-up steps; and opt-out language drops the contact into suppression automatically, alongside the one-click unsubscribe that's on by default. Positive replies and referrals are surfaced for a human to answer — we don't auto-send on your behalf.

The same bot-aware logic applies upstream: verified visits and real replies count, security-scanner clicks and scanner-triggered opens don't. You can connect your own Gmail, Microsoft 365, or SMTP mailboxes on the free plan ($0, 1,000 active leads, 3,000 emails a month, up to 10 mailboxes) and see what your reply stream looks like once the noise is filtered out. Paid plans start at $29/mo.

Ready to send outbound that lands?

Create your free Sendvanta workspace — no credit card required.

Start free