An AI Agent for Customer Support: Triage a Shared Inbox Into Tickets
Set up an AI agent in Damon that reads a shared support inbox, classifies each email, drafts replies for the routine ones, files bugs to Linear, and escalates the rest to a human.
By Marlon Wiprud
"AI for customer service" usually means a chatbot on the website. This is the other kind: an agent working the support inbox behind the scenes, so a human deals with the ten emails that need a human and not the forty that don't. It runs on a shared Gmail inbox, classifies each new email, drafts replies for the routine categories, files bug reports as Linear issues, and escalates anything sensitive. Every send is approved by a person until you decide otherwise.
What it does, every 30 minutes
- Reads new, unlabeled email in the support inbox.
- Classifies each into:
how-to(answerable from your docs),bug,billing,feature-request, orescalate(angry, legal, security, or unclear). how-to: drafts a reply in your voice and labels the thread "Triage/Draft ready".bug: creates a Linear issue with the customer's description, environment details and a link to the thread; labels the email "Triage/Filed".billingandescalate: labels them and lists them for a human, with a one-line summary each.- Messages the on-duty person a summary: counts per category, the escalations, the drafts waiting.
Step 1: Connect the inbox and the tracker
In Integrations, connect the shared Gmail account (a Google Group inbox or a delegated mailbox works) and Linear (or ClickUp/Monday if that's where bugs live). Damon classifies the discovered actions: reading and searching mail is email.read (auto-approved by default); sending, drafting, labeling and archiving are email.send (require approval by default); creating issues is task.write (require approval by default).
Step 2: Create the support agent
- Name: Support,
@support - Personality: "Warm and brief. Acknowledge the problem in the first sentence. Never promise a timeline. If unsure whether something is a bug, say 'we're looking into it' rather than guessing."
- Goals: "Every customer gets an accurate first response within an hour. Bugs reach engineering with enough detail to reproduce. Anything sensitive reaches a human immediately."
- Integrations: Gmail (support inbox), Linear.
Step 3: Give it your knowledge
Put your help articles, canned responses and refund policy in the Damon drive as files (Support/FAQ.md, Support/Refund policy.md, Support/Voice.md). The agent reads the drive natively, so drafts for how-to emails will be grounded in your actual answers rather than the model's general knowledge. Ask it to save your reply conventions as a skill so it applies them everywhere.
Step 4: Run the triage once, by hand
In chat with @support:
Triage unlabeled email in the support inbox from the last 2 hours. Classify each as how-to, bug, billing, feature-request or escalate. For how-to, draft a reply using Support/FAQ.md and label "Triage/Draft ready". For bug, create a Linear issue in the Support Intake project with title, customer, steps, environment and a link to the thread, then label "Triage/Filed". Label billing and escalate accordingly. Give me counts and the list of escalations.
You'll get approval cards for the first draft, the first label and the first Linear issue. Approve them and check the results: is the classification right, do the drafts sound like you, do the Linear issues have what engineering needs? Adjust the instructions or the files, not the agent.
Step 5: Schedule it and set the policy
Ask: "Run this every 30 minutes and message the on-duty channel a summary." The workflow uses a structured-output step to classify (so the category is a real field, not prose), a conditional to branch per category, agent steps per branch, and a message step at the end. Damon builds it; you can see the graph in Workflows.
Then a policy for this workflow only:
| Scope | Mode | Why |
|---|---|---|
| email.read | auto_approve | default |
| email.send (drafts, labels, sends) | require_approval | one scope covers all of them, so it stays gated: each run asks once for its batch of drafts and labels |
| task.write (Linear issues) | auto_approve | issues can be closed; the alternative is a human retyping them |
Because drafts and sends share a scope, the agent's instructions say "create a draft", never "reply", and a person clicks send on every customer email. That's how we run our own inbox.
Variants
- Helpdesk instead of Gmail. The same pattern applies to any connected helpdesk; ask us about yours or bring it via an MCP server.
- Slack support channel. Damon connects to Slack as an app; the agent can triage a shared channel the same way and reply in-thread once you allow
message.send. - Customer-communication for e-commerce. Add order lookups from your store's API via MCP so
where is my orderemails get a draft with the actual tracking status.
Common questions
Will it answer customers on its own?
No. It drafts and a human sends. We don't recommend changing that.
How accurate is the classification?
It's a model call constrained to five categories with your definitions. Tune the definitions with examples from your inbox and it improves; anything it's unsure about goes to escalate, which is the safe default.
Can engineering see where a bug came from?
Every Linear issue it files includes a link to the email thread and the customer's own words.
What does it cost?
A triage pass reads a handful of emails and writes short drafts, so each run is a small number of credits. Runs with no new email cost almost nothing.