I built a small n8n workflow that reads emails with a Gmail label and writes one row per email to Google Sheets. Sample data only, no real customer emails.
How it works:
- Schedule Trigger, every hour
- Gmail Get Many on the label to-sheet (Simplify off so the body is available; read and unread; limit 10)
- Edit Fields: builds one text block (From, Subject, Date, body cut to 6,000 characters to cap cost)
- Information Extractor with the OpenAI chat model gpt-4o-mini; the schema defines the fields to extract
- If: continue only if the key field is filled; otherwise an error branch
- Google Sheets Append or Update Row, matching on message_id, so a re-run does not add duplicates
Why a label queue and not the Gmail Trigger:
The Gmail Trigger fires on new messages at poll time. A label works as a queue: you can label older mail and the workflow picks it up.
Measured cost:
About 1.5 US cents per 100 short emails with gpt-4o-mini on n8n Cloud (measured 11.10.2026). Your numbers will differ with email length and model.
Pitfalls I hit:
- Keep the sheet header in row 1. If it sits lower, the append reads the wrong row.
- Turn off Simplify on the Gmail node, or the body is missing.
- Use a fixed column mapping, so the AI output lands in the right column.
Disclosure: I run the project behind this and I am building a template kit of this workflow. The newsletter page linked below has a beehiiv partner link marked as an affiliate link; I may earn a commission if you buy, at no extra cost to you.
Walkthrough and newsletter: Project 10K Lab — AI tools tested. Real results shared.
Happy to answer questions about the node settings.