One inbox for every channel
Every channel your AI answers on lands in one list — how to read it, reply to it, and what it does not show you.
One inbox for every channel
Every conversation your AI handles lands in the same inbox, in one list. You do not open a separate tool per platform, and replies go back out over whichever channel the message arrived on.
<!-- SCREENSHOT: Inbox with the conversation list on the left, an open web conversation in the middle, and the channel filter dropdown expanded -->
What lands here
The channel filter covers eight sources:
Each row carries its channel icon, so you can read the list without filtering. Web conversations also show a green dot while the visitor is still on your site.
The inbox is team-scoped: you see conversations owned by you and by your team members, not just your own.
Replying
Type in the reply box and send. The reply is stored on the conversation, pushed to your screen over websockets, and delivered back out on the origin channel — Discord via your bot, Telegram via the bot API, email via SMTP, Slack, WhatsApp, or a Meta DM.
Sending a reply also pauses the AI on that conversation. That is covered in Pausing the AI and handing off to a human below — it is the single most important behaviour to understand before you type.
Channel quirks that will bite you
- Facebook and Instagram have a 24-hour window. If the customer messaged within 24 hours, your reply goes out as a normal response. After 24 hours it is sent tagged as a human-agent message, which Meta allows for up to 7 days. Past 7 days Meta will usually reject it, and the error is surfaced to you on the message.
- Manual email replies drop attachments. Text is sent; any file you attach is not. Attachment sending is not implemented on the email reply path.
- Email replies thread properly. Wallu reuses the customer's message ID as the in-reply-to and references headers, so your reply lands in the existing email thread rather than starting a new one.
Organising a conversation
- Notes — internal, stamped with the author's name. The customer never sees them.
- Tags — create them in Manage Tags, then apply from the tag menu or in bulk across selected conversations.
- Convert to Ticket — turns the conversation into a tracked ticket. See tickets.
- Filters — status (All, Open, In Progress, Escalated, Resolved), channel, and tag, plus a search box.
<!-- SCREENSHOT: The conversation detail panel showing internal notes and the tag menu open -->
Limits worth knowing
- The inbox loads the 50 most recent conversations. The endpoint returns the 50 newest by timestamp and accepts no paging parameters — there is no load-more. The filters and the search box narrow those 50; they do not reach further back into history.
- The single Resolve button only updates your screen. The checkmark on an open conversation marks it resolved in the browser and closes the panel, but it sends no request. Reload and the conversation is back. To resolve for real, tick the conversations in the list and use the bulk resolve action — that one calls the API and persists.
- Bulk resolve does not stamp a resolution time. It sets the status only. Conversations resolved this way carry no
resolvedAt, so they are skipped by the average-resolution-time metric in analytics.
- Resolving is not neutral on web. A resolved web, Discord, Telegram, email or Slack conversation gets no further AI replies — permanently, until you reopen it. See the handoff article for how to get the AI back.
Pausing the AI and handing off to a human
What actually stops the AI from replying, how long it stays quiet, how it comes back — and the gaps between what the UI implies and what the code does.
Pausing the AI and handing off to a human
One function decides whether the AI is allowed to reply to a conversation. Every channel calls it before generating anything. It honors exactly three signals — nothing else.
The three things that stop the AI
- Manual takeover — the conversation is flagged as human-handled. No expiry: the AI stays silent until you hand it back.
- Timed pause — a pause timestamp in the future. The AI is silent until it lapses, then resumes on its own.
- **Escalated *and* assigned — the status is
escalated and an agent ID is set on the conversation. Both** are required. This is the one that trips people up; see the limits below.
That is the whole list. In particular, the gate itself does not check whether a conversation is resolved — resolved is handled separately, and inconsistently, per channel.
Replying auto-pauses the AI (15 minutes by default)
When you send a reply from the inbox, the AI is paused on that conversation for 15 minutes by default, so it does not interject on top of you when the customer answers.
That window is a default, not a fixed rule — it is read from the AGENT_REPLY_AUTO_PAUSE_MIN environment variable and falls back to 15 when unset. If you self-host or have it tuned for your account, check that value rather than assuming 15.
You do not have to wait it out: resume manually at any time.
Pausing on purpose
The Pause AI menu offers four options:
- 15 minutes
- 1 hour
- 4 hours
- Until I resume
The first three set a timed pause that auto-resumes. Until I resume is an indefinite takeover with no timer — the AI will not come back on its own.
Calling the pause endpoint directly, durationMinutes defaults to 60 (not 15) and is clamped between 1 minute and 24 hours. Passing indefinite: true sets the no-timer takeover instead.
While a pause is live, the button becomes an amber AI paused pill. On a timed pause it counts down the minutes remaining; on an indefinite one it just reads "AI paused".
<!-- SCREENSHOT: The Pause AI dropdown open showing 15 minutes / 1 hour / 4 hours / Until I resume, next to the amber "AI paused · 12m" pill -->
How the AI comes back
- A timed pause lapses on its own. Nothing to click.
- Click the amber "AI paused" pill. Resumes immediately.
- The "Re-enable AI" button. This one only appears when the conversation status is
escalated. It is not a general-purpose resume.
Resuming does four things at once: sets the status back to open, clears the manual takeover, clears any timed pause, and clears the assigned agent. That last part matters — it is what releases the escalated-and-assigned block.
What escalation actually does
When the AI hands off, it sets the conversation to escalated, writes a generated handoff summary and reason for you to read, emails your team, and — if it has an email address on file — opens a ticket. See tickets for what happens to that ticket.
Business hours suppress all of this. If business hours are enabled on your account and you are currently closed, escalation is intercepted on both the keyword path and the AI-driven path: the customer gets your offline message and the conversation status stays open (it is written, just not escalated). Nobody is paged to jump into the live chat — but a ticket is still created (reason after_hours, with an AI summary) as long as Wallu has an email for the visitor, and it sends the usual "[New Ticket]" notification email, so the request is both in the queue and in your inbox in the morning. This check runs on the shared pipeline — web widget, Discord, Telegram, email and Slack. Instagram, Facebook and WhatsApp do not run it.
The real limits
Escalation alone does not keep the AI quiet
The gate needs the status escalated and an assigned agent. Escalation only assigns an agent if round-robin routing is switched on — and routing mode defaults to manual, in which case no agent is assigned. Routing is configured in Settings → Conversation Routing (Assignment Mode: manual, round-robin or least-busy). It defaults to manual, which assigns nobody — so unless you switch it to round-robin or least-busy and have eligible team members, an escalated conversation has no assigned agent and the AI keeps replying.
The practical result: an escalated conversation usually has no assigned agent, so the gate does not fire and the AI keeps replying to a conversation it just escalated. In production right now, every escalated conversation has a null assigned agent. On Instagram, Facebook and WhatsApp it is worse — those paths explicitly null the assignment when escalating, then reset the status from escalated back to open on the customer's next message.
If you want the AI to stop, pause it explicitly — replying from the inbox does this for you, and it sets the agent assignment too. Do not rely on escalation.
"Resolved" behaves differently per channel
On web, Discord, Telegram, email and Slack, a resolved conversation gets no AI reply — the customer's message still lands in your inbox, but the AI stays silent, and the status is not reset. It stays that way until someone reopens it.
On Instagram, Facebook and WhatsApp, there is no resolved check at all. Those webhooks go straight to the gate, and the gate does not look at resolved — so the AI will happily reply to a conversation you marked resolved.
Reopening leaves the old resolution timestamp behind
Nothing clears resolvedAt when a conversation is reopened. A reopened conversation keeps the timestamp from when it was first resolved, so it still counts as resolved in the analytics resolution-time metric with a stale figure. In production there are conversations sitting at status open and in-progress that still carry a resolvedAt.
There is no "Take over" button
A takeover endpoint exists and works — it sets the status to in-progress, flags manual takeover, and assigns the conversation to you. But no button in the UI calls it. The inbox only ever calls pause and resume. To take over in practice, just reply, or use Pause AI › Until I resume.
Round-robin applies to conversations, not tickets
When auto-assignment is configured, it assigns inbox conversations — on creation and on AI escalation. It does not assign tickets. Tickets accept an assignee through the API, but nothing in the UI sets one and nothing reads it.
For how scored conversations flow into your pipeline, see lead pipeline.