How we built our own email-triage AI — and why we didn't use a vendor
The short version: in mid-2024 we had 28 retainer clients and my personal inbox was breaking. 200+ client emails a day across the team, about half of which were invisible to me until someone complained. We looked at three vendor products and built our own, and the decision has paid off in ways we didn't anticipate.
The short reason we didn't use a vendor: none of them understood agency context. An email that says "not seeing the creative" from a client who just signed an addendum to their retainer is a different triage call than the same words from a client who's missed the last two calls. Vendors triage against keyword lists; we wanted to triage against client relationship state.
The architecture is boring and that's the point. Gmail → Vercel cron → Gemini 2.0 Flash with a long system prompt that injects our client roster, project state, and triage rules → structured JSON back → a simple React dashboard. No vector DB. No agents. No MCP. Just a single LLM call with very carefully-designed context.
What it actually does: flags priority, categorises, matches the sender to a client record, drafts a reply in my voice, and emits action tags the AM team can execute. What it does not do: send anything automatically. Every reply is approved by a human before it goes. The value isn't in the send; it's in the triage — and the Monday 7am weekly digest that reads the whole inbox for me.