Context
A small B2B merchant got quote requests, order-status questions, and complaints in the same inbox. Two staff members spent mornings sorting before they could reply. Urgent messages sat behind newsletter noise.
They wanted AI to help triage and draft-not auto-send, not a customer-facing bot that could promise the wrong lead time.
What I built
Webhook ingests new messages from their contact form and shared inbox export. Each message gets a label, priority score, and a one-paragraph draft reply in the owner's tone.
Staff open a review queue: confirm label, edit draft, send from their normal mail client. Nothing leaves the building without a human click.
Technical approach
Classification schema fixed to their real categories-no open-ended "sentiment" labels nobody acts on. Draft prompts include product catalog summary and shipping policy snippets pulled from config, not hallucinated terms.
Spam and obvious auto-replies filtered to a low-priority bucket. Audit log: original message, model output, editor, final send timestamp.
Feature flag per channel. If the API fails, messages land in an unclassified inbox-Monday still works.
Outcomes
- Morning sort time cut roughly in half for the two-person team
- Fewer missed urgent threads in the first month after launch
- Owner trusted it because send stayed manual and drafts were editable
Stack
Node.js · TypeScript · LLM API · PostgreSQL · React review UI · Webhook ingress