What it is
The Inbox is the shared workqueue your operators run customer email out of. Inbound mail from connected mailboxes lands as a thread, gets categorised and AI-scored, and stays there until somebody replies, snoozes, or resolves it. Replies go back through the same provider connection (Gmail or Office 365) using the mailbox's identity.
It is not an IMAP client. There is no folder sync, no labels, no archive button. It is a triage + reply surface that lives next to the rest of your tenant.

The model
Three first-class objects:
| Object | What it is |
|---|---|
| Mailbox | A logical address (support@, billing@, alex@) bound to a Gmail or Office 365 connection. |
| Thread | One conversation with one customer on one mailbox. Carries status, assignee, category, AI signals. |
| Message | A single inbound or outbound email on a thread. |
A customer's fifth follow-up reopens the same thread — it does not create a new one.
Mailboxes
Each tenant has at least one mailbox. A system mailbox (display name "Inbox") catches anything that lands on an unknown recipient — see Settings → Inbox mailboxes to surface and adopt those addresses.
A real mailbox has:
- Kind — Shared (team), Personal (single owner), or System.
- Provider — Gmail, Office 365, or Internal (no send).
- Visibility — Private (owner only), Team (reserved; behaves as Tenant until teams ship), Tenant (anyone in the workspace).
- Send enabled — controls whether the reply composer can send AS this mailbox. Defaults off; the provider must already be connected in Channels.
- Ingest enabled — flip off to stop receiving mail without losing the row.
- Auto-assign mode — Off / Round robin / Sticky hint for the assignment helper.
- Default AI policy — optional reference into Inbox AI policies; pins which policy applies to this mailbox unless a more specific scope wins.

The mailbox card carries a compact health panel: inbound 24h / 7d, live thread count, unread count, snoozed count, replies sent 7d, and the age of the oldest live thread. If the oldest thread is days old, you have a triage problem, not a delivery problem.
Thread status
| Status | Meaning |
|---|---|
| New | Just landed; nobody has touched it yet. |
| Open | Being worked on. |
| Waiting on customer | Reply sent; ball is on their side. |
| Pending internal | Blocked on internal collaboration. |
| AI drafted | An AI policy prepared a draft; awaits operator review. |
| Resolved | Closed. Reopens automatically if the customer replies. |
| Ignored | Soft-dismissed (newsletter, channel join, etc.). |
Status is per thread. Sending a reply transitions to Waiting on customer; an internal note alone does not change status; a fresh customer message on a Resolved / Ignored thread reopens it.
Categories
Per-tenant labels (Billing, Shipping, Sales, Spam, …) with a color and an optional icon. One primary category per thread — there is no many-to-many tagging by design. Manage them under the inbox toolbar's Categories button.
Categories drive:
- Queue filtering and saved-view scopes.
- AI policy targeting (you can scope a policy to a single category).
- Routing via inbox rules.
Inbox rules
Declarative routing applied as mail arrives. Rules are evaluated by ascending priority (lower runs first); the first match wins. Matchers:
- Sender email — exact match on the From address.
- Sender domain — match the domain part (e.g.
customer-domain.com). - Subject contains — case-insensitive substring of the subject.
Each rule can apply a category, an assignee, or both. A rule can be scoped to a single mailbox; rules without a mailbox scope apply to every mailbox in the tenant.
Internal notes
A note attached to a thread that the customer never sees. Plain text only — no HTML, no rich text editor. Notes outlive any single message; they are the right place to write "@alex flagged this as VIP — please escalate next reply". A note never gets promoted to an outbound reply: if you want to send what you wrote, retype it into the composer. That is a deliberate guard against the wrong-channel mistake.
Signals on a thread
Derived live from the thread, not stored:
- Unassigned — no assignee.
- Unread (N) — unread customer messages.
- Customer waiting — Open / New and the last customer message is newer than your last reply.
- Stale — live thread with no movement in 24h. Waiting on customer doesn't count.
- AI low confidence — AI assessed below 0.5.
- High risk — AI risk is High. Critical-tone badge.
The toolbar exposes built-in views as one-click chips: Customer waiting, Stale, Unassigned, High risk, AI drafted. Save your own views (filter + sort + visible columns) and pin one as default; saved views are scoped to you.
Snooze
Per-thread "hide until". A snoozed thread drops out of the listing until the timer expires, at which point it reappears in its current status (snooze does not flip status). A new customer message also wakes it immediately — the customer always wins the timer.
Attachments
Inbound attachments show as chips on the message — filename, type, and size. Bytes stay with the provider and are fetched on demand when you click the chip. Re-receiving the same message does not duplicate the attachment.
Workflow
- Triage. Hit Customer waiting or Unassigned, work top-to-bottom.
j/kto move,Enterto open detail. - Assign or self-assign.
aopens the assignee picker. - Categorise.
copens the category picker. - Reply, note, or status-shift. Reply through the composer; add an internal note for collaboration; transition the thread with
Shift+R/W/P/O.
Replies
The composer sends through the bound mailbox's provider — Gmail or Office 365 — under the mailbox's identity. Send is locked while in flight, so a double-click never fires twice. After a successful send the timeline shows a Reply sent entry; failures stay as a draft you can retry.
For drafts and AI auto-reply behaviour see Auto-reply.
Keyboard shortcuts
| Key | Action |
|---|---|
j / k | Move row down / up |
Enter | Open detail pane |
x | Toggle row selection |
/ | Focus search |
i | Ignore (single or selection) |
r | Re-analyse (single or selection) |
Shift+R | Resolve thread |
Shift+W | Mark waiting on customer |
Shift+P | Mark pending internal |
Shift+O | Reopen thread |
Esc | Clear selection / blur |
Bulk actions (Assign, Categorise, Ignore, Re-analyse) live in the toolbar; "Select all matching" extends the page selection to the entire filter result.
CSV export
Export honours the active filters and search. There is no "export everything" shortcut by accident — to dump the tenant, set the filter to All first.
Troubleshooting
- Thread stuck on New for hours. AI classification runs in the background; it does not gate operator action. If the AI suggestion never arrives, click Re-analyse on the row.
- No reply sent, no error. Check that the mailbox has Send enabled and the underlying provider is connected (Settings → Channels). A send-disabled mailbox rejects the action with a UI error, and the skip is recorded with reason
email_replies_disabled. - Unknown recipient. Mail to an address you have not registered as a mailbox lands on the system mailbox. Settings → Inbox mailboxes shows discovered addresses with an occurrence counter; promote the high-volume ones into a real mailbox or dismiss them.
- Customer sees their own thread split into two. A subject change without
Re:prefix can force a new thread row. Both threads will land on the same row once the provider reasserts the conversation; until then, merge by replying from the older thread.
FAQ
Can a colleague see my drafts? Drafts are visible to anyone with access to the thread. You have one active draft per thread: saving a second draft on the same thread updates yours in place.
Can two operators reply at the same time? Send is locked while in flight, so the second send fails fast. The reply composer is not a real-time collaborative editor.
Where do AI suggestions come from? A per-tenant AI policy decides whether a suggestion is shown, drafted, or sent. See Auto-reply.