Team Inbox
Triage inbound email as a team: read AI-classified threads, approve, edit or reject agent drafts, work the review queue, and manage quarantine.
The Team Inbox is the shared mailbox where inbound email lands. Every reply, support request, or sales enquiry sent to one of your receiving addresses is stored, threaded by conversation, classified by the AI agent, and — depending on your AI Agent settings — given a suggested draft reply. Owners and admins triage from a single dashboard: read the thread, approve or rewrite the agent's draft, work a focused review queue, and quarantine anything the security filter flags.
What the Team Inbox is
The inbox is a shared surface, not a per-user mailbox. There is one inbox for the workspace, and threads stay visible to every owner and admin so anyone on the team can pick up a conversation.
The inbox is gated behind the Email inbox feature flag (inbox), which is off by default. Until an operator enables it, the inbox routes are hidden and the backend queries refuse to return data. See Feature flags for how to turn it on, and note that receiving mail also requires the inbound MTA to be configured.
Inbound email reaches the inbox through your configured receiving channel — typically the bundled MTA forwarding to Owlat. SMS and WhatsApp threads can also surface here, and those channels are bidirectional — replies (both agent completions and manual admin sends) go back out the same channel; see Communication Channels.
The inbox dashboard
The inbox landing page (Inbox in the dashboard) gives you a stats overview, status filters, and the thread list.
Stats
A row of counters summarises the current state of the pipeline:
| Counter | Meaning |
|---|---|
| Total | All inbound messages ever received. |
| Open Threads | Conversations currently in the open status — your live backlog. |
| Drafts Ready | Messages with an agent draft waiting for human review. |
| Processing | Messages the agent is still working through. |
| Approved | Drafts approved and queued for sending. |
| Sent | Replies that have gone out. |
| Quarantined | Messages held by the security filter. |
| Failed | Messages whose processing failed after the automatic retries were exhausted. |
The Quarantined and Failed counters are clickable, linking to the Quarantine and Failed messages pages respectively.
The Drafts Ready count also appears as a badge on the Review Queue button so you can see your review backlog at a glance.
Filtering the thread list
The thread list shows one row per conversation, newest activity first, with the sender, subject, message count, status badge, and time of the last message. Two filters narrow it down:
- Status — All Statuses, Open, Waiting, Resolved, or Closed.
- Assigned to me — only threads assigned to you.
Use Clear filters to reset both. The list pages in batches; click Load More to fetch older threads.
Reading a thread
Click any thread to open it. The thread detail view has a message timeline on the left and a sidebar on the right.
The timeline shows each inbound message oldest-first, with the sender, timestamp, subject, and full text body. Each message also carries a processing status badge — Received, Processing, Classified, Draft Ready, Approved, Sent, Quarantined, or Failed — so you can see where the agent got to.
AI classification
When the agent has classified a message, a panel shows what it inferred:
| Field | What it tells you |
|---|---|
| Category | The kind of message (e.g. support, sales, billing, feature request, complaint, spam, internal, other). |
| Priority | How urgent the agent judged it. |
| Sentiment | The tone it detected. |
| Confidence | How sure the agent is, as a percentage. |
The displayed classification panel doesn't auto-send a reply, but the category does drive pipeline routing: messages classified as spam are archived, and complaints or urgent messages are escalated straight to human review (skipping the auto-drafter). Auto-reply decisions are governed separately by the agent's confidence threshold and auto-reply settings, covered in AI Agent & Autonomy.
The sidebar
The right-hand sidebar shows the linked Contact (with a link to their full contact profile) when Owlat could match the sender, plus thread Details: status, message count, assignee, and the time of the last message.
The agent draft
When the agent has produced a reply and the message is in Draft Ready, the draft appears below the original message with these actions:
- Approve & Send — accept the draft as-is. It's queued for sending and the message moves to Approved. Approving opens a short undo window (15 seconds by default — see Undo after approving) before the reply actually leaves.
- Edit — open the draft inline. You can rewrite the body and optionally set a subject, then either Save your work for later or Save & Approve to send your edited version.
- Reject — discard the draft. A dialog lets you add an optional reason, which is recorded to the audit log for your team's reference.
Save keeps your revision without sending anything — the message stays in Draft Ready and shows a Saved · edited by you chip in the review queue (saved drafts also sort first, so half-finished work resurfaces). Edits are stored as revisions: the agent's original is always preserved untouched, and the diff view compares your current text against it, no matter how many times you save. Only when you eventually approve does anything go out — and only once the approved reply actually sends (an approval undone inside its window trains nothing), if the sent text differs from the agent's original, is a single "edited" signal recorded for the agent's learning loop. Saving alone never trains the model.
Review queue
The Review Queue (reachable from the inbox header) is a focused list of only the messages in Draft Ready across all threads — the work that actually needs a human decision right now. Each card shows the sender, a two-line excerpt of the original message, the classification category and confidence, and the full agent draft.
From the queue you can Approve & Send or Reject in place, or jump to the full thread via Edit / View thread if you want to rewrite the draft before sending. When the queue is empty you'll see an "All caught up!" state.
Bulk approve and reject
For a queue full of routine drafts you don't have to go one at a time. The browse list supports multi-select:
- Space or x selects the focused card (each card also has a checkbox); Shift+J / Shift+K extend the selection while moving; * selects everything visible. A batch is capped at 50 messages.
- With a selection active, a sticky action bar offers Approve n and Reject n.
A bulk approve is honest about partial results: each message gets its own outcome, so if someone on the team is already replying to one of the threads, the toast says so ("2 approved, 1 held — Dana is replying, 1 no longer in the queue") instead of failing the whole batch. All approved items share one undo window — a single Undo pulls back every send still inside it. Every item records its own audit-log row, and its learning-loop feedback once its send actually leaves, exactly as if approved individually.
Undo after approving
A human Approve & Send doesn't fire instantly: the reply is held for a short window (default 15 seconds) with a countdown toast — "Approved — sending in 14s · Undo". Undo returns the message to Draft Ready with the draft intact. In the focused review flow, Cmd+Z does the same while the window is open. After the window closes the reply is on its way and cannot be recalled.
The window length is a per-instance agent setting (humanApproveUndoDelayMs, clamped to 0–120 seconds; 0 restores immediate sending — see AI Agent & Autonomy). Autonomous auto-replies keep their own separate delay.
Quarantine
Inbound mail passes through a security filter before the agent ever drafts a reply. Anything that trips the filter — prompt-injection attempts, suspected phishing, or other abuse — is held in Quarantine instead of being processed, so a poisoned message can never drive the agent.
Each quarantined message shows a Security Alert panel with:
- Type — what the scanner matched. The security scanner combines pattern matching with an LLM guard and emits three type values:
prompt_injection(deterministic instruction-override patterns — a direct instruction-override attempt, a delimiter attack, or role impersonation in the message text),llm_prompt_injection(the guard-tier LLM classifier flagged it), andsmuggling:…(hidden instructions inside the HTML body — e.g.smuggling:html_comment,smuggling:invisible_text, orsmuggling:zero_width_chars). - Confidence — how sure the scanner is, as a percentage. Messages are only quarantined above a high-confidence threshold.
- Flagged content — the specific snippet that tripped the filter.
You have two actions:
- Release (False Positive) — return the message to the pipeline. It re-enters at the start and is re-scanned and processed normally.
- Block Sender — add the sender's address to the suppression/blocklist and archive the message. Future inbound mail from that address is auto-archived on receipt and skips AI processing: it is still stored (never dropped — there is no SMTP-level rejection), but it lands directly in the archive instead of the classify/draft pipeline. The blocklist also suppresses future outbound mail to that address.
Releasing a quarantined message hands its content to the agent. Only release messages you've confirmed are genuine — the quarantine exists precisely to keep untrusted content away from the model. For background on the scanning engine, see Email Security.
Failed messages
Processing can fail — a transient model error, a downstream timeout, or a bad payload. The pipeline retries automatically (up to three times), but a message that still can't make progress lands in a terminal Failed state and drops out of the workflow. The Failed messages page (reachable from the Failed stat card) surfaces every such message with its failure reason so an operator can read what went wrong.
Once the cause is resolved, Retry processing re-enqueues the message: it routes back to Received and the pipeline re-runs from the security scan. Retries are recorded in the audit log.
Assigning and resolving threads
Each thread carries a status that you change from the status dropdown in the thread header:
| Status | Use it for |
|---|---|
| Open | An active conversation that needs attention. |
| Waiting | You've replied and are waiting on the customer. |
| Resolved | The issue is handled. |
| Closed | Archived / done. |
Threads can also be assigned to a specific team member, which pairs with the Assigned to me filter on the inbox list so each person can see their own queue. Status changes and assignments are recorded in the audit log.
Discussing a thread in chat
If Team Chat is enabled, you can pull a conversation into a channel for internal discussion without exposing it to the customer. From the thread header:
- If a channel already references this thread, it appears as a #channel link — click to jump straight there.
- Otherwise, Discuss in channel lets you spin up a new channel and link it to the thread.
A linked channel shows a pinned, read-only panel of the email thread so teammates can talk it over internally; customer-facing replies still go out through the inbox approval flow described above. The discuss controls only appear when the chat feature flag is on.
Access control
The Team Inbox is restricted to owners and admins. The inbox queries use soft authentication: if you're signed in without one of those roles, the views load but stay empty rather than erroring. Members and other roles don't see inbox data at all. See Team & Permissions for the full role model.