You don't need an empty inbox. You need to know which 12 of your 200 unread emails actually need you today — and which ones can die quietly.
I got tired of scanning my inbox every morning, so I built a small n8n + GPT-4o-mini workflow that reads new mail, sorts every message into one of four buckets, and drafts a reply for the ones that need one. It runs on a schedule, costs pennies, and takes about 15 minutes to set up.
Here's the whole thing — plus the one design decision that made it actually usable.
The first version I built asked the model "is this email important?" It was useless. Every email came back "somewhat important."
The fix was to stop asking for a judgement and start asking for a single label from a fixed taxonomy. Four buckets, no hedge, no score:
One label per email. That's it.
You are an inbox triage assistant. Read the email below and return exactly one of these labels on the first line: REPLY_TODAY, TASK_LATER, READ_LATER, NOISE.
Rules:
- Only use
REPLY_TODAYif a specific person is blocked on your answer.- Marketing, cold sales, and automated notifications are alwaysNOISE.- If you chooseREPLY_TODAYorTASK_LATER, write a one-sentence draft reply (max 40 words) on the second line, in the sender's language, in a friendly professional tone.
Subject: {{ $json.subject }}
From: {{ $json.from }}
Body:
{{ $json.snippet }} Two things matter here: the label set is closed, and the draft is only generated for the two buckets that need one. That keeps token usage (and cost) low.
in:inbox is:unread newer_than:1d. REPLY_TODAY gets starred + draft attached; TASK_LATER gets appended to a Google Sheet; the rest get labeled and archived.
That's a real workflow, not a toy. The router is just a Switch node on the first line of the model's output.
Rebuilding this from scratch (Gmail OAuth, the filter, the parser, the router) is the boring part. I packaged the polished version as a ready-to-import n8n template:
Triage your inbox once, and you'll never go back to scanning.