I automated my inbox triage with n8n + GPT-4o-mini (copy the exact workflow) A developer built an n8n workflow that uses GPT-4o-mini to triage unread Gmail messages into four fixed labels — REPLY_TODAY, TASK_LATER, READ_LATER, and NOISE — and drafts a one-sentence reply only for the two buckets that need one. The key design decision was replacing an open-ended "is this important?" prompt, which returned "somewhat important" for every message, with a closed taxonomy requiring exactly one label per email. The workflow runs on a schedule, routes messages via an n8n Switch node on the model's first output line, and is packaged as a ready-to-import template. 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 TODAY if a specific person is blocked on your answer.- Marketing, cold sales, and automated notifications are always NOISE .- If you choose REPLY TODAY or TASK 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.