# 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.

[Get started](/signup)
[Documentation](https://docs.aiinbx.com/guides/receiving#categories)

Example: four messages come back to one send. A delivery report from Mail Delivery Subsystem carries a message/delivery-status part and arrives as email.bounced on the message that was sent, permanent: true, not as a reply. Priya Nair's 'Automatic reply' carries Auto-Submitted: auto-replied, which rules out a person; it is read to tell an away message from other automatic mail, and is out\_of\_office. Meridian Foods Support's '\[Case #88213\] We've received your email' has no automatic header, is read, and is auto\_reply. Tomás Ortega writes 'Out next week. Can you hold the old rate till I'm back?' with no automatic header, is read, and is human — a person mentioning an absence is still a person.

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](https://docs.aiinbx.com/guides/receiving#categories)

How the category is decided, in order. The receiving side's spam verdict is FAIL: spam, settled without a model. A message/delivery-status part, or a sender at mailer-daemon@ or postmaster@: bounce, settled. Auto-Submitted: auto-replied, X-Autoreply, X-Autorespond or Precedence: auto\_reply: out\_of\_office or auto\_reply, and a model reads the message to pick one. Any other Auto-Submitted value except no, or Precedence bulk, list or junk: every category but human, and the model picks. No automatic signal at all: any of the nine, and the model reads the message.

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](/features/suppressions)

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](https://docs.aiinbx.com/guides/receiving#categories)

Headers that rule out human on their own: Auto-Submitted, X-Autoreply, X-Autorespond and Precedence. Headers only shown to the model as context: X-Auto-Response-Suppress, List-Unsubscribe, List-Id, Feedback-ID, Return-Path, Reply-To, X-Mailer and 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](/use-cases/cold-outreach); for how an answer finds its conversation, see [threading](/features/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

Step 1, email.received: one 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)
  }
}
```

Step 2, email.bounced: a report about mail you sent.

```
if (event.type === "email.bounced" && event.data.permanent) {
  await contacts.markUndeliverable(event.data.recipients, event.data.reason)
}
```

Step 3, emails.retrieve: every 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.

Keep reading

## More on building with email

-   [Email reply parserParse every email reply down to what the sender wrote: quoted text and repeated signatures removed, answers typed inside the quote kept where they were.ThreadingMailboxes](/solutions/email-reply-parser)
-   [Inbound email APIReceive email in your app over an API. Point an MX record at AI Inbx or connect Gmail and Outlook, and every message arrives as a signed, parsed JSON webhook.ThreadingAttachmentsMailboxesWildcard domains](/solutions/inbound-email-api)
-   [Email open trackingTrack email opens and clicks per domain or per send. Apple privacy prefetches and security scanner clicks arrive flagged as bots, each with its reason.Threading](/solutions/email-open-tracking)

-   [MailboxesGmail and Outlook, same everything.](/features/mailboxes)
-   [SuppressionsUnsubscribes honoured on every send.](/features/suppressions)

[All solutions](/solutions)

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

[Get started](/signup)
