Automating my inbox with n8n and Claude
I don't want an AI to run my inbox. I want it to do the reading, the sorting, and the first draft — then get out of the way so I make the calls. After a few iterations, that's exactly what this workflow does, and it gives me back close to an hour a day.
The shape of it
The whole thing runs in n8n on a schedule. Three stages, nothing exotic:
- Fetch — pull unread mail since the last run.
- Classify — ask the model to sort each message and, where useful, draft a reply.
- Route — label, archive, or drop a draft in front of me.
Classify with a strict contract
The trick that made this reliable was forcing structured output. Instead of hoping for tidy prose, I ask for JSON I can branch on:
{
"category": "reply | fyi | newsletter | spam",
"priority": "now | today | someday",
"draft": "…a reply in my voice, or null…"
}
With a fixed schema, the rest of the workflow is just plumbing. category
decides the label, priority decides whether it interrupts me, and
draft — when present — becomes a Gmail draft I can send with one edit.
Keeping it in my voice
Generic AI email reads like generic AI email. I gave the model a short style guide and a handful of real replies I've sent, and the drafts stopped sounding like a form letter. Small input, big difference.
The goal isn't zero email. It's zero email that didn't need me.
The human-in-the-loop rule
One hard rule: it never sends. It drafts, labels, and archives, but a human presses send on anything that leaves my account. That single constraint is what lets me trust it running every fifteen minutes without a second thought.
Was it worth it?
A weekend to build, roughly an hour a day back. More importantly, I open my inbox to a short list of things that actually need a decision instead of a wall of noise. That's the automation I was after.