Auto-reply detection

Tell an auto-reply from a real answer

Every message you receive carries a category: human, out_of_office, auto_reply and six more. Headers settle what they can, a model reads the rest, and a delivery report naming your own mail comes back as email.bounced on it, not as a reply.

Back from “Spring price list”What your webhook gets
  • Mail Delivery Subsystem

    Delivery Status Notification (Failure)

    message/delivery-status

    email.bouncedpermanent: true
  • Priya Nair

    Automatic reply: Spring price list

    Auto-Submitted: auto-repliedread: “I'm out of the office until 14 April with limited access to email.”

    out of office
  • Meridian Foods Support

    [Case #88213] We've received your email

    no automatic headerread: “A member of our team will respond within 48 hours.”

    auto-reply
  • Tomás Ortega

    Re: Spring price list

    no automatic headerread: “Out next week. Can you hold the old rate till I'm back?”

    human

Four messages back from one send. The bounce is settled by what it carries and the out-of-office's header rules out a person; the other two carry nothing automatic and are told apart by what they say.

How it is decided

Headers narrow it, a reading settles it

RFC 3834 headers, bulk precedence, delivery reports and the receiving side's spam verdict come first. When one category is left, that is the answer. Otherwise a model reads the sender, subject, telling headers, attachment names and what was written, and may only pick from what the headers left open.

How it is decided
The message carriesStill possibleThen
  • spam verdict: FAILspamSettled
  • message/delivery-statusmailer-daemon@postmaster@bounceSettled
  • Auto-Submitted: auto-repliedX-AutoreplyX-AutorespondPrecedence: auto_replyout of officeauto-replyRead
  • Auto-Submitted: anything but noPrecedence: bulk, list, junkEight: every category but humanRead
  • none of the aboveAll nineRead

Bounces

A bounce about your send is not a reply

A delivery report naming a message you sent through us is matched to it by Message-ID and becomes email.bounced on that email. A hard bounce suppresses the address. That holds in a connected Gmail or Outlook inbox too, where reports otherwise sit among the replies.

Bounces

Lands in the inbox you sent from.

mailer-daemon@googlemail.com
Content-Type: message/delivery-status Final-Recipient: rfc822; n.berg@brightline.coAction: failedStatus: 5.1.1

Lands on the email it is about.

Spring price list

to n.berg@brightline.co

  1. 09:02sent
  2. 09:02bounced · 5.1.1
  3. 09:02suppressed · bounce

Headers that mislead

Not every automatic-looking header is one

X-Auto-Response-Suppress asks the other side not to auto-reply; it does not say this message is one. So it, List-Id and a few others are shown to the model as context and decide nothing. An out-of-office that carries no header at all is left to the reading.

Headers that mislead

Rule out human on their own

  • Auto-Submitted
  • X-Autoreply
  • X-Autorespond
  • Precedence

Context for the reading

  • X-Auto-Response-Suppress
  • List-Unsubscribe
  • List-Id
  • Feedback-ID
  • Return-Path
  • Reply-To
  • X-Mailer
  • X-Priority

Categories

Nine answers to “who sent this?”

Only one of them is a reply. An out-of-office and an acknowledgement are not the same event, and a sequence, a helpdesk or a CRM should each treat them differently. For what a sequence does with them, see cold outreach; for how an answer finds its conversation, see threading.

human
A person wrote it, in their own words. Stop the follow-ups and hand it to whoever answers.
out_of_office
An away or vacation autoreply. The person exists and is away. Hold the next step; nobody has answered.
auto_reply
Any other automatic response: a ticket acknowledgement, an unmonitored inbox. The address is live and a machine said so. Never answer it with a machine.
bounce
A delivery failure that arrived as mail and matched no message you sent. Look before acting: a report about your own send arrives as email.bounced instead.
verification
A confirmation code, magic link or password reset. Route it to whatever signed up, or drop it.
transactional
Receipts, invoices, account notices. File it; it is not a reply to your campaign.
notification
Alerts and system mail. File it.
marketing
Bulk or promotional mail, cold pitches included. Keep it out of reply counts.
spam
Junk, scams or phishing, or failed the receiving side's spam check. Do not act on the content.

In your handler

Route on the category, not the subject line

1email.receivedone switch, before anything else runs
if (event.type === "email.received") {  switch (event.data.category) {    case "human":      return inbox.assign(event.data.thread_id)    case "out_of_office":      return sequences.hold(event.data.from)    case "auto_reply":      return // a machine acknowledged; nobody has answered yet    default:      return triage.queue(event.data.email_id)  }}
2email.bounceda report about mail you sent
if (event.type === "email.bounced" && event.data.permanent) {  await contacts.markUndeliverable(event.data.recipients, event.data.reason)}
3emails.retrieveevery header, for a rule of your own
const email = await aiinbx.emails.retrieve(event.data.email_id) const submitted = email.headers.find(  (header) => header.name.toLowerCase() === "auto-submitted")

Questions

How do I detect an auto-reply email?

Check the headers first: Auto-Submitted with any value but no (RFC 3834), X-Autoreply, X-Autorespond and Precedence: auto_reply all mark an automatic response. Some autoresponders set none of them, which is why subject keyword lists exist, and those misfire on people. AI Inbx applies the header rules, has a model read whatever they leave open, and hands you the result as category on every inbound message.

Does X-Auto-Response-Suppress mean an email is an auto-reply?

No. Microsoft Exchange uses it to ask the receiving side not to send automatic replies back; it says nothing about whether the message carrying it was automatic. Filtering on it files real answers as robots. AI Inbx shows it to the model as context and never decides on it alone.

What is the difference between a bounce and an auto-reply?

A bounce says your message was not delivered: the address does not exist, or the mailbox is full. An auto-reply says it was delivered and the other side answered automatically. A bounce about mail you sent through AI Inbx arrives as email.bounced, with permanent set for a hard bounce; an auto-reply arrives as email.received with the category out_of_office or auto_reply.

Should out-of-office replies count as replies?

Not towards reply rates or lead status: nobody has read your message yet. They do tell you the address is live and that the person is away, so hold the sequence rather than ending it. out_of_office is kept apart from auto_reply, so you can pause for one and ignore the other.

What if someone replies asking to be removed?

That is a real reply, so it arrives as human. When the reading also finds the sender asking not to be written to again, the address is suppressed on the list the answered send named, or on the * list when it named none or nothing was sent in that conversation, and email.unsubscribed arrives with the source reply.

Does it work for mail in a connected Gmail or Outlook inbox?

Yes. Mail synced from a connected mailbox goes through the same rules and the same reading as mail received on a domain, and arrives with the same category. The one step it skips is the spam verdict: mail Gmail or Outlook filed as spam or junk is not synced at all.

Can the category be wrong?

Yes. The header rules are exact, but whatever the model reads is a judgement, and category is null when a message could not be classified at all. Treat human as one input: pair it with sender checks, a reply limit per conversation and a person to hand off to, most of all before an agent answers on its own.

Give your product an inbox. The hard parts are already handled.

Get started