← Back to blog

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.

← Back to blog