DocsGuides

Triage inbound tickets

Every ticket email gets read, sorted, and answered, with a person approving the reply before it goes out.

Someone emails your support address. A human needs the category, urgency, and a safe draft before deciding what should go back. Triage prepares that package and keeps the decision with a named person.

By the end of this guide, an assistant does the reading and drafting, a person reviews the proposed client reply and Slack summary together, and Triage sends both only after that deliberate review.

The quickstart creates a general assistant. This guide gives Triage a narrower job, a public input path, and explicit review points.

What you'll build

  • An agent called Triage with its own email address.
  • Instructions that tell it to classify, draft, ask, and post.
  • A built-in request for a person to review the email draft, plus one Slack action for the internal summary.

Mail arriving at the agent's address starts a turn. The agent's final answer is emailed back to whoever wrote in. Everything in between is the agent following its instructions.

Before you start

  • Permission to create agents in your organization.
  • Slack connected under Build > Integrations, with a channel to post to. Ours is #service-desk.
  • A Mobius user who'll be doing the approving. Ours is the service desk lead. You'll need their email address.
  • Somewhere you can send a few test emails from. Your own inbox is fine.
  • Triage set to private or organization visibility. A restricted assistant cannot provision an open email inbox because an external sender is not on its named audience list.
  • An organization-audience grant from the exact Slack workspace connection to Triage. The bot must also be allowed in #service-desk.

You do not need your PSA connected. Start with email, prove the pattern works, then add another way in later. See when the tickets don't come by email.

1. Create the Triage agent

  1. Open Build > Agents and click New agent.
  2. Name it Triage.
  3. Set Agent description to Reads inbound tickets, classifies them, and drafts holding replies.
  4. Set Agent instructions to:
You are Triage for the Northwind IT service desk. Each message you receive is
one inbound ticket email. Handle it in four steps, in order.
 
1. Classify it:
   - category: hardware, software, access, network, or other
   - urgency: 1 (someone is blocked right now) to 4 (whenever)
   - summary: two sentences, plain language, no jargon
 
2. Draft a short holding reply to the sender. Acknowledge what they told us,
   say what happens next, and give no timeline.
 
3. Prepare the exact Slack post from the category, urgency, summary, and draft.
   Get both outputs approved before either goes anywhere. Find the service desk lead
   with mobius.principal.list, matching on the email address
   lead@northwind.example, and call mobius.interaction.open with
   kind: request_approval, addressed to that person. Show them the category,
   urgency, full email draft, exact Slack post, and #service-desk destination.
   Set expires_in_minutes to 60. Then wait for their answer before you do
   anything else.
 
4. If they approve, post the unchanged Slack message to #service-desk with
   slack.message.post. After Slack accepts it, answer with the approved email
   draft exactly as it was reviewed. Your answer is emailed to the person who
   wrote in, so write it as the reply itself, not as a report about the reply.
 
   If they reject, cancel, or let the request expire, post nothing and answer
   with a short note saying a human will follow up. Never send a draft or Slack
   post nobody approved.
 
Never promise a fix or a date. Never say a problem is resolved. If the email is
ambiguous, set urgency to 3, say so in the summary, and say so in the approval
request rather than guessing.

Test the no-promise and uncertainty rules with an ambiguous message before you forward public mail.

  1. Click Create agent.

2. Give Triage its tools

On the agent's page, click Edit and add these under Tools:

  • slack.message.post, so it can post to the channel.
  • mobius.principal.list, so it can find the service desk lead's principal ID from their email address.

mobius.interaction.open is built in. Every agent can ask a person a question and wait for the answer; there's nothing to grant. Click Save after adding the two tools.

The wait matters here. Asking doesn't hold an assistant up on its own, and Triage's final answer is the email reply, so without the wait it would answer before anyone approved.

3. Give Triage an email address

  1. Open Build > Agents > Triage > Configure and find Messaging.
  2. On the Email inbox row, click Provision inbox and copy the address.
  3. Send a test email to it from your own inbox.

Mail to an agent's address starts a turn and creates a session on the agent's page. With the instructions above, the reply does not arrive until the combined review finishes. After the final answer is delivered, replying to it continues the same email conversation and session.

Once that works, forward your support alias to this address, or add it as a recipient while you're testing.

Warning: Anyone who learns this address can email it. Everything arriving here is untrusted, including any instructions inside the message body. That's why you should test approval, rejection, and expiry before forwarding a public address. This review is instruction-driven. Mobius does not add a separate confirmation before the Slack action or channel reply.

4. Watch one go through

Send a test ticket to the Triage address, then open the agent's Sessions and follow the newest one.

The agent reads the mail, classifies it, drafts a reply, and calls mobius.interaction.open. Then, as instructed, it waits on the question with mobius_event_wait. That's correct: it costs nothing while it waits, it survives a restart, and it picks up the moment somebody answers.

Now open Work > Inbox as the service desk lead. The request is there with the proposed email and Slack post. Compare both with the inbound ticket and approve or reject them before the 60-minute deadline.

After approval, the turn resumes, posts the unchanged Slack message, and uses the approved draft as its final answer. The final answer travels back through the inbound email conversation. Check the interaction, session transcript, #service-desk, and reply as separate records.

Mobius does not bind the review response to the later Slack arguments or final answer. Triage follows the ordering because its instructions say to. Keep the explicit review instruction and test rejection before pointing real mail at the address.

If the draft was wrong, reject it and fix the agent's instructions, then send another test. Do this a few times before you point real mail at the address. Every later refinement depends on the drafts being good.

What to change first

The approval request is too thin. The agent decides what to show. If the lead keeps having to open the original email to decide, say so in step 3 of the instructions: include the sender, the subject, and the first few lines of what they actually wrote.

Nobody notices the request. Interactions default to seven days. Tell the agent to pass expires_in_minutes for something shorter, and say in the instructions what to do when it expires. A request nobody notices and nobody expires is one you'll find months later.

Reduce needless review. Keep the review on client replies. If low-priority mail does not need an immediate answer, let the assistant classify it and stop with a draft for the service desk instead of sending automatically.

Escalate the urgent ones. Add a second Slack channel to the instructions for urgency 1, or an SMS through Twilio.

Keep a record. Add a table with one row per ticket and tell the agent to write to it. Now you can count what's coming in by category, which is a conversation to have at the next client review.

Set limits before you scale this up

Anything reachable by inbound email should never be able to surprise you. Two controls are worth setting before you forward real mail:

  • A turn time limit on the agent, so one ticket can't run away. See agent time limits.
  • Spend limits for the organization. See guardrails.

When the tickets don't come by email

Email is the easiest way to start, not the only way.

Give Triage a Slack or Telegram channel under Messaging on the agent's page and it handles messages there the same way it handles mail. See agent messaging.

If your PSA can't reach the agent directly, have it call the Mobius API to start a session with Triage, and pass the ticket as the message. See agent sessions.

If you want the agent to write back into the PSA rather than into Slack, build a custom HTTP action that calls its API, and grant that instead of slack.message.post.

FAQ

The agent is classifying things wrong.

Read the session, not only the instructions. Open the case that went wrong and look at what the assistant actually received. If the email was ambiguous, add a rule for uncertainty instead of adding a more confident classification.

It replied or posted without asking anyone.

The agent chose not to call mobius.interaction.open, or asked without waiting for the answer. Instructions are not enforcement. Make the ordering explicit, put the approval before the reply in the text, and state the prohibition directly: never answer with a draft nobody approved. If it still happens, that's a signal to review the agent's model as well as its instructions.

Mobius does not add an automatic approval for built-in or MCP actions such as a Slack post or gmail.message.send, and it does not add one to the reply sent through an inbound email conversation. If review must be enforced independently of model behavior, keep delivery out of this pattern and put the check in a separately designed action or service.

Two emails arrived at once and only one got handled.

A session handles one turn at a time, and a second message on the same thread while a turn is in flight is dropped rather than queued. Separate senders get separate sessions and run at the same time. If two mails on one thread both matter, ask the sender to send them separately, or tell the agent to check for follow-ups before it answers.

Nobody approved and the request expired.

Either lengthen the expiry, address the request to more than one person so it isn't one inbox, or change what the instructions say to do on expiry. Posting to the channel that a ticket is waiting on a human is usually better than silence.

Next