n8n Email Automation with Gmail: The AI Built It, I Fixed It
I gave the n8n Assistant one prompt: when a client email lands in Gmail, log it in a Google Sheet and prepare the reply as a draft. On this page you get the prompt, the AI instructions and the finished workflow to copy, plus five test emails, what I had to fix and the catch with the schedule.
Disclosure: links marked * are affiliate links. n8n didn't pay for this video.
Chapters
Each timestamp jumps to the matching section on this page. “Load video” then starts right there.
- 00:00 What this n8n email automation does
- 00:31 n8n Cloud or self-hosted?
- 01:56 My prompt for the n8n AI Assistant
- 04:06 What the Assistant built
- 05:58 Mapping the Google Sheet columns
- 07:26 First test with a real email
- 09:15 Teaching the AI how to reply
- 10:18 Four more emails: what went wrong
- 11:13 Fixing it with the Assistant
- 13:20 Final run and publishing
- 14:56 Real client emails and the 5-minute catch
- 15:40 My verdict
What this email automation does
▶ In the video at 00:00A client inquiry arrives in Gmail. n8n logs it as a row in a Google Sheet, and a reply waits as a draft right under the email. The AI writes the draft, and nothing goes out until I press send.
The n8n Assistant, the AI chat inside n8n, built the workflow from a single prompt. I then checked every step and fixed what was off. I've used n8n many times before, so my times aren't beginner times: from the prompt to the last run it took about 40 minutes, going by the file timestamps.
The key points from the test
- Five made-up test emails, four draft replies, nothing sent.
- The Assistant builds most of it, fast. Mapping the sheet columns, tightening the drafts and checking every result stays with you.
- The test button only fetches the newest email from the Gmail trigger. It looks like a bug in the workflow, but it isn't one.
- A schedule every 5 minutes means 288 runs a day. The 2,500 runs of the Starter plan would be gone in about 9 days, so once an hour is enough.
n8n Cloud or self-hosted?
▶ In the video at 00:31I run my own n8n on a server. For this video I used a fresh n8n Cloud trial.
For a first workflow I'd start on Cloud: signing in with Google and the AI models work there without any setup. The trial lasts 14 days and needs no credit card. After that, Starter costs 20 dollars or euros a month, billed annually, with 2,500 runs a month (as of November 9, 2026).
If the trial ends and you don't upgrade, n8n deletes the instance. Download your workflow first; according to n8n you can still do that for 90 days after the trial ends. You can also take it to a self-hosted n8n.
Self-hosting: the software costs nothing, but you pay for the server and set up your own Google project for Gmail and Sheets. That can get fiddly. According to n8n, the Gateway credits that run AI models without your own key only exist on Cloud Starter, Pro and the trial. I explain the difference in my guide What is n8n?.
According to the pricing page, the trial needs no credit card. Try n8n Cloud*
* Affiliate link: I earn a commission, at no extra cost to you.
Starting the trial
▶ In the video at 01:22On n8n.io, “Get Started” takes you to your own instance, and the n8n Assistant is right there. At the top my instance showed 1,000 executions and 14 days left. According to n8n, the trial has the Pro features with the computing power of Starter.
My prompt for the n8n AI Assistant
▶ In the video at 01:56This is the prompt I pasted into the Assistant's chat. In the video I only read the start, here it is in full. The last two sentences make the Assistant stop when a step fails and ask before it publishes. It did exactly that: “I won't publish it without asking you.”
Prompt for the n8n Assistant
Build a workflow called Client Email Drafts.
Trigger: Gmail, when a new email arrives with the label "Inquiries". I need the full email text, not just the snippet.
Step 1: Use an AI model with Gateway credits to read the email and return three fields: category (Good fit, Question or Not relevant), summary (one sentence) and draft (a short reply).
Step 2: Add a row to my Google Sheet "Inquiries" with date, sender, subject, category and summary.
Step 3: If the category is not "Not relevant", create a Gmail draft to the sender in the same thread, with the subject "Re:" plus the original subject. Never send anything.
If a step fails, stop. Ask me before you publish.Connecting Gmail and Google Sheets
▶ In the video at 02:28The Assistant asks for access to Gmail and Google Sheets. On Cloud, signing in with Google is enough; self-hosted, it takes a lot more setup. I used a test account, not my real inbox, and I'd advise you to do the same. Read through what n8n gets access to when you allow it.
I had prepared the sheet “Inquiries” with a header row of five columns:
DateFromSubjectCategorySummary
What the Assistant built
▶ In the video at 04:06The Assistant reported a finished workflow, not published yet, and it won't publish anything without asking. The first version:
- Trigger: Gmail checks every minute for emails with the label Inquiries and pulls in the full text, not just the snippet.
- AI step: GPT-5.4 mini on Gateway credits, so no API key of your own. It returns category, summary and draft.
- Sheet: one row in Inquiries with date, sender, subject, category and summary.
- Draft: a Gmail reply in the same thread, to the sender, with the subject “Re:” plus the original subject. Nothing gets sent.
Plus two things I didn't ask for:
- Duplicate check: Gmail sometimes returns the same email more than once. So the Assistant created a small data table, “Processed Inquiry Emails”, stores the ID of every handled email in it and skips anything already in there.
- Read status: the workflow takes read and unread emails and doesn't mark anything as read. Out of the box, the Gmail trigger only fetches unread emails, according to the n8n docs. An inquiry you open on your phone first would slip through.
Up to that point the Assistant had only tested with made-up data. Nothing had run against the real inbox or the real sheet yet.
Mapping the Google Sheet columns
▶ In the video at 05:58In the sheet step I had to pick the document “Inquiries” myself. There are two ways to fill the columns. “Map Automatically” looks for incoming fields with exactly the same name. That doesn't work here, because the AI's answer arrives nested. So “Map Each Column Manually” and drag in every field by hand.
This is how the five columns look in the finished workflow (you can copy it further down):
| Column | Value in n8n | Comes from |
|---|---|---|
| Date | {{ $('Get Full Email').item.json.date }} | the email |
| From | {{ $('Get Full Email').item.json.from.value[0].address }} | the email |
| Subject | {{ $('Get Full Email').item.json.subject }} | the email |
| Category | {{ $json.output[0].content[0].text.category }} | the AI step |
| Summary | {{ $json.output[0].content[0].text.summary }} | the AI step |
“Execute Step” then showed all five fields filled, still with the Assistant's sample data.
First test with a real email
▶ In the video at 07:26The first live test ran without errors, but it didn't test anything: there was no email in the label yet. So I sent a made-up inquiry from my own account to the test inbox. A filter gave it the label Inquiries right away:
I run a small yoga studio in Austin and I spend about five hours a week answering the same questions about classes and memberships. Can you help me automate that?
Test email 1, made up: Maya, yoga studio in Austin
Every step ran on the real accounts. Sender and time were right, the category was Good fit, the summary fit. Under the email sat a draft that started with “Hi Maya, yes, we can likely help with that.” It was signed with a placeholder instead of my name.
The duplicate check
▶ In the video at 08:49A second run with the same email: the workflow finds it in the data table and stops. No second row, no second draft.
Teaching the AI how to reply
▶ In the video at 09:15The instructions for the AI step live in the node's options, under “Instructions”. In the video I miss them at first. The Assistant had only written short instructions, and I replaced them with more detailed ones: three categories with clear rules, drafts of 60 to 100 words, no invented prices or dates, exactly one question when a request is unclear, signed Lukas, and two examples of my tone.
Later, after my note, the Assistant widened the rule for Good fit, more on that below. This is how the instructions read in the finished workflow:
AI instructions (Instructions in the step “Classify and Draft”)
You read one client email and return JSON with the fields category, summary and draft.
category:
- Good fit: a real person describes a project or problem they want paid help with, or a potential client asks about my price, rates or when I can start. Asking about price or availability means they are considering hiring me, so it is Good fit, not Question.
- Question: a real person asks a general question about how I work or what I do, without showing intent to hire, or the request is too unclear to tell.
- Not relevant: newsletters, sales pitches, link offers, automated mail.
summary: one sentence, what they want.
draft: the reply, written as Lukas, a freelance AI consultant.
- 60 to 100 words, plain and friendly, no buzzwords, no exclamation marks.
- Use their first name and refer to one concrete detail from their email.
- Never invent prices, dates, availability or promises. If they ask for a price, say I'll confirm it after a short call.
- If the request is unclear, ask one question.
- End by suggesting a short call. Sign off with Lukas.
- For Not relevant, leave draft empty.
Two examples of how I write. Match the tone, don't copy them:
Hi Anna,
Thanks for reaching out. Sending the same invoice reminders every week sounds like a good first thing to automate, and ten clients is a manageable start.
Before I say more, I'd like to see how you work today. Could we do a short call this week? Then I can tell you honestly whether it's worth building or whether a simpler fix does the job.
Best,
Lukas
Hi Tom,
Thanks for your message, that sounds like a lot of manual work. I'm not sure yet which part of your bookings you'd like to automate: the confirmations, the reminders or both?
If you tell me that, I can say whether I can help and what it would take. A short call this week works too, whatever is easier for you.
Best,
LukasHow to get an AI to write in your own tone is in my video ChatGPT emails in your own writing style. After all the test runs, the AI step still showed $1.99 in Gateway credits. According to n8n, you can't top up during the trial. When the balance is empty, switch the step to your own API key.
Four more emails: what went wrong
▶ In the video at 10:18Then four more made-up emails went into the inbox: a price question, a sales pitch for backlinks, a vague question about a website and a bookkeeper who wants to automate her onboarding. After the next click on “Execute”, only one of them had a row and a draft. The others weren't even in the sheet as Not relevant.
The one that went through was Daniel's price question:
Hi, what do you charge per hour and can you start next Monday?
Test email 2, made up
The draft named no price and didn't promise Monday: “I can talk about hourly rates, but I'd prefer to confirm the right scope after a short call first.” That's exactly what the rule against invented prices is for. But the AI had filed the email as Question. If someone asks about price and start date, that's a Good fit for me.
Fixing it with the Assistant
▶ In the video at 11:13I asked the Assistant why the other emails got no draft and corrected the category: Rates should be Good fit. It then widened the rule in the AI instructions. On the missing drafts, its answer: not a bug. Those emails never ran through the workflow, because a click on “Execute” only fetches the newest email with the label.
After that, the Assistant rebuilt the workflow. Instead of the Gmail trigger, a schedule starts it every 5 minutes. A Gmail step searches with this query:
Gmail · Find Inquiry Emails
label:Inquiries newer_than:30d -in:sent -in:draftsThat's every email with the label from the last 30 days, without sent mail and drafts. The data table filters out the ones already handled, and only then does the workflow fetch the full text.
Correction: what the test button really does
▶ In the video at 12:54Earlier in the video I say that if two emails come in at the same time, one gets skipped. That only applies to the test button: in a manual run, the Gmail trigger fetches exactly one email, the newest, according to n8n's source code. A published Gmail trigger fetches the new emails on every poll, up to 10 according to the docs (adjustable up to 50), and the rest on the next poll.
So the problem came from the test, not from n8n. I didn't test the published trigger live in the video.
Final run and publishing
▶ In the video at 13:20Then the Assistant was done and announced what a real run would do: three rows in the sheet, two drafts for Rachel and Pierre. Important before you use it: without “Publish”, nothing runs, not even a schedule. n8n saves automatically, but according to n8n a workflow only goes live when you publish it. In the video I didn't publish.
In the final run, Pierre's website question landed in Question, the backlink pitch in Not relevant and Rachel's onboarding request in Good fit. The drafts were then waiting in Gmail to check, edit or delete.
THE CHECK
FIVE TEST EMAILS · 06 NOV 2026
- HELP WITH MY STUDIO'S EMAILSMaya · in the video at 8:05GOOD FIT
- RATESDaniel · in the video at 11:26
QUESTIONgood fit - SPECIAL SEO PACKAGEsales pitch · in the video at 13:54NOT RELEVANT
- WEBSITEPierre · in the video at 13:45QUESTION
- CLIENT ONBOARDINGRachel · in the video at 13:54GOOD FIT
- EMAILS5
- DRAFTS4
- SENT0
YOU PRESS SEND
The finished workflow in nine steps
This is the workflow after the fix. The step names are as they appear in n8n:
- Every HourSchedule that starts the workflow. In the video it ran every 5 minutes; in the JSON below it's set to once an hour.
- Find Inquiry EmailsGmail search for emails with the label from the last 30 days, read and unread.
- Skip Already ProcessedOnly lets through emails whose ID isn't in the data table yet.
- Get Full EmailFetches the full text of the email.
- Classify and DraftAI step with GPT-5.4 mini: category, summary and draft as JSON.
- Log to Inquiries SheetWrites Date, From, Subject, Category and Summary to the sheet.
- Needs a Reply?If the category isn't Not relevant, it moves on to the draft.
- Create Reply DraftCreates the draft in Gmail, in the same thread, subject “Re:” plus the original.
- Mark Email ProcessedAdds the ID and time to the data table, also for Not relevant.
Copy the workflow as JSON
Copy it, click on an empty canvas in n8n and paste with Ctrl+V (Mac: Cmd+V). I removed the credentials, the sheet and the data table, you pick your own. Then:
- In Gmail, create a label “Inquiries”, for example with a filter on the address your contact form sends to.
- In n8n, create a data table “Processed Inquiry Emails” with the columns message_id (text) and processed_at (date), and select it in the steps “Skip Already Processed” and “Mark Email Processed”.
- Choose credentials for Gmail and Google Sheets; in the AI step, Gateway credits or your own OpenAI key.
- In the step “Log to Inquiries Sheet”, choose your sheet and the tab.
- Rewrite the AI instructions for your name, your work and your tone.
- Test first, then publish. The schedule is already set to once an hour.
Use at your own risk: this workflow is an example from my test. I give no guarantee that it runs without errors for you and, to the extent permitted by law, accept no liability for the consequences of using it. Test it with your own test emails before you publish it.
Workflow “Client Email Drafts”, 9 steps
Show JSON
{
"name": "Client Email Drafts",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"id": "096a8e4a-c828-4fab-878b-ede6feba61ac",
"name": "Every Hour",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.4,
"position": [
-240,
-80
]
},
{
"parameters": {
"operation": "getAll",
"returnAll": true,
"filters": {
"q": "label:Inquiries newer_than:30d -in:sent -in:drafts",
"readStatus": "both"
}
},
"id": "3ab1d5bd-3223-4a11-b50f-d35e14944d01",
"name": "Find Inquiry Emails",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
32,
48
]
},
{
"parameters": {
"operation": "rowNotExists",
"dataTableId": {
"__rl": true,
"mode": "list",
"value": ""
},
"matchType": "allConditions",
"filters": {
"conditions": [
{
"keyName": "message_id",
"keyValue": "={{ $json.id }}"
}
]
}
},
"id": "73d86a3f-17de-4490-918f-81e8e48595ca",
"name": "Skip Already Processed",
"type": "n8n-nodes-base.dataTable",
"typeVersion": 1.1,
"position": [
224,
80
]
},
{
"parameters": {
"operation": "get",
"messageId": "={{ $json.id }}",
"simple": false,
"options": {}
},
"id": "339dc863-954c-45f1-845e-064829e478c8",
"name": "Get Full Email",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
448,
80
]
},
{
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-5.4-mini",
"cachedResultName": "GPT-5.4-MINI"
},
"responses": {
"values": [
{
"content": "=From: {{ $(\"Get Full Email\").item.json.from.text }}\nSubject: {{ $(\"Get Full Email\").item.json.subject }}\n\n{{ $(\"Get Full Email\").item.json.text }}"
}
]
},
"builtInTools": {},
"options": {
"instructions": "You read one client email and return JSON with the fields category, summary and draft.\n\ncategory:\n- Good fit: a real person describes a project or problem they want paid help with, or a potential client asks about my price, rates or when I can start. Asking about price or availability means they are considering hiring me, so it is Good fit, not Question.\n- Question: a real person asks a general question about how I work or what I do, without showing intent to hire, or the request is too unclear to tell.\n- Not relevant: newsletters, sales pitches, link offers, automated mail.\n\nsummary: one sentence, what they want.\n\ndraft: the reply, written as Lukas, a freelance AI consultant.\n- 60 to 100 words, plain and friendly, no buzzwords, no exclamation marks.\n- Use their first name and refer to one concrete detail from their email.\n- Never invent prices, dates, availability or promises. If they ask for a price, say I'll confirm it after a short call.\n- If the request is unclear, ask one question.\n- End by suggesting a short call. Sign off with Lukas.\n- For Not relevant, leave draft empty.\n\nTwo examples of how I write. Match the tone, don't copy them:\n\nHi Anna,\n\nThanks for reaching out. Sending the same invoice reminders every week sounds like a good first thing to automate, and ten clients is a manageable start.\n\nBefore I say more, I'd like to see how you work today. Could we do a short call this week? Then I can tell you honestly whether it's worth building or whether a simpler fix does the job.\n\nBest,\nLukas\n\nHi Tom,\n\nThanks for your message, that sounds like a lot of manual work. I'm not sure yet which part of your bookings you'd like to automate: the confirmations, the reminders or both?\n\nIf you tell me that, I can say whether I can help and what it would take. A short call this week works too, whatever is easier for you.\n\nBest,\nLukas",
"maxTokens": 2000,
"reasoning": {
"reasoningOptions": {
"effort": "low",
"summary": "none"
}
},
"textFormat": {
"textOptions": {
"type": "json_schema",
"name": "inquiry_analysis",
"schema": "{\"type\":\"object\",\"properties\":{\"category\":{\"type\":\"string\",\"enum\":[\"Good fit\",\"Question\",\"Not relevant\"]},\"summary\":{\"type\":\"string\"},\"draft\":{\"type\":\"string\"}},\"required\":[\"category\",\"summary\",\"draft\"],\"additionalProperties\":false}",
"strict": true
}
}
}
},
"id": "8279c58a-a046-4fee-b7d2-ed953d591554",
"name": "Classify and Draft",
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 2.3,
"position": [
528,
80
]
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Date": "={{ $('Get Full Email').item.json.date }}",
"From": "={{ $('Get Full Email').item.json.from.value[0].address }}",
"Subject": "={{ $('Get Full Email').item.json.subject }}",
"Category": "={{ $json.output[0].content[0].text.category }}",
"Summary": "={{ $json.output[0].content[0].text.summary }}"
},
"matchingColumns": [],
"schema": [
{
"id": "Date",
"displayName": "Date",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "From",
"displayName": "From",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Subject",
"displayName": "Subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Category",
"displayName": "Category",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Summary",
"displayName": "Summary",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "a9a9b5b5-4a5b-4462-a4b8-911a7993bd0f",
"name": "Log to Inquiries Sheet",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
880,
80
]
},
{
"parameters": {
"conditions": {
"combinator": "and",
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $(\"Classify and Draft\").item.json.output[0].content[0].text.category }}",
"rightValue": "Not relevant",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
]
},
"options": {}
},
"id": "69ecc83d-58a7-4eec-8a1b-8ea2894dd4e3",
"name": "Needs a Reply?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
80
]
},
{
"parameters": {
"resource": "draft",
"subject": "=Re: {{ $(\"Get Full Email\").item.json.subject }}",
"message": "={{ $(\"Classify and Draft\").item.json.output[0].content[0].text.draft }}",
"options": {
"threadId": "={{ $(\"Get Full Email\").item.json.threadId }}",
"sendTo": "={{ $(\"Get Full Email\").item.json.from.value[0].address }}"
}
},
"id": "71fac986-68d0-4e98-a0e1-9ae93df61b1a",
"name": "Create Reply Draft",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
1328,
0
]
},
{
"parameters": {
"dataTableId": {
"__rl": true,
"mode": "list",
"value": ""
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"message_id": "={{ $(\"Get Full Email\").item.json.id }}",
"processed_at": "={{ $now.toISO() }}"
},
"schema": [
{
"id": "message_id",
"displayName": "message_id",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "processed_at",
"displayName": "processed_at",
"required": false,
"defaultMatch": false,
"display": true,
"type": "dateTime",
"canBeUsedToMatch": true
}
]
},
"options": {}
},
"id": "6d72a2f5-02e3-4141-b939-c822b4123383",
"name": "Mark Email Processed",
"type": "n8n-nodes-base.dataTable",
"typeVersion": 1.1,
"position": [
1552,
80
]
}
],
"connections": {
"Every Hour": {
"main": [
[
{
"node": "Find Inquiry Emails",
"type": "main",
"index": 0
}
]
]
},
"Find Inquiry Emails": {
"main": [
[
{
"node": "Skip Already Processed",
"type": "main",
"index": 0
}
]
]
},
"Skip Already Processed": {
"main": [
[
{
"node": "Get Full Email",
"type": "main",
"index": 0
}
]
]
},
"Get Full Email": {
"main": [
[
{
"node": "Classify and Draft",
"type": "main",
"index": 0
}
]
]
},
"Classify and Draft": {
"main": [
[
{
"node": "Log to Inquiries Sheet",
"type": "main",
"index": 0
}
]
]
},
"Log to Inquiries Sheet": {
"main": [
[
{
"node": "Needs a Reply?",
"type": "main",
"index": 0
}
]
]
},
"Needs a Reply?": {
"main": [
[
{
"node": "Create Reply Draft",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Email Processed",
"type": "main",
"index": 0
}
]
]
},
"Create Reply Draft": {
"main": [
[
{
"node": "Mark Email Processed",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"binaryMode": "separate"
}
}Before you use this on real client emails
▶ In the video at 14:56Don't point the workflow at your whole inbox. Every email it processes is one AI call. One label is enough, and if your contact form already sends you an email, that's your trigger.
The text of your client emails goes through n8n to the AI provider. Check that this fits your work before you run the workflow on a real inbox.
The catch with the 5-minute schedule
▶ In the video at 15:17The schedule the Assistant suggested runs every 5 minutes, whether there's an email or not. Every run counts as one execution in n8n, no matter how many steps it has. Test runs from the editor didn't count on my instance; the counter was still at zero after all the tests.
THE BILL
SCHEDULE: EVERY 5 MINUTES
- RUNS PER DAY288
- STARTER PLAN2,500 / MONTH
- GONE AFTERABOUT 9 DAYS
- TEST RUNS COUNTED0
or back to the Gmail trigger
SET IT HOURLY
Set the schedule to once an hour before you publish. That's 24 runs a day, about 720 a month. Or go back to the Gmail trigger.
My verdict
▶ In the video at 15:40My last receipt from the video:
THE VERDICT
- BUILT BY THE ASSISTANTMOST OF IT, FAST
- STILL ON ME
- MAP THE SHEET COLUMNS
- CLEAN UP THE DRAFTS
- CHECK EVERY RESULT
- SAME INQUIRY EVERY WEEKWORTH BUILDING
- TWO EMAILS A MONTHIT ISN'T
The Assistant got me most of the way, and fast. Mapping the sheet columns, tightening the drafts and checking every result was still on me. If you answer the same kind of inquiry every week, this is worth building. If you get two emails a month, it isn't.
Want this built around your own inquiries, without doing it alone? That's what my AI Workflow Sprint is for.
Frequently asked questions
In my test, mostly yes. From one prompt it built the trigger, the AI step, the sheet row and the Gmail draft, and added a duplicate check on its own. I still had to map the sheet columns by hand, rewrite the AI instructions and check every result. It also asked before publishing, because the prompt told it to.
Not on n8n Cloud. Starter, Pro and the trial have Gateway credits, so AI models run through n8n without your own key, paid per request from a balance. After all the tests in the video, $1.99 was left. According to n8n, self-hosted n8n has no Gateway credits, so there you need your own key.
Because the Gmail trigger only fetches the newest email in a test run. That's how n8n's source code works, and it misled me for a moment in the video. A published Gmail trigger fetches the new emails on every poll, up to 10 according to the docs, and the rest next time.
Every start counts as one execution, no matter how many steps follow. Every 5 minutes is 288 a day, so the 2,500 of the Starter plan would be gone in about 9 days. Once an hour is about 720 a month. Test runs from the editor didn't count on my trial instance.
Cloud for your first workflow: Google sign-in with one click and AI models without your own key. Self-hosting costs no license, but you pay for the server, the upkeep and your own Google project. The trial lasts 14 days, then Starter from 20 dollars or euros a month, billed annually (as of November 9, 2026).
Copy the JSON on this page, click on the canvas in n8n and paste it. Then choose credentials for Gmail, Google Sheets and the AI step, create the data table “Processed Inquiry Emails”, pick your sheet and rewrite the instructions for your name. The schedule is already set to once an hour.
Full transcript
From my own corrected English subtitles, grouped by chapter. Timestamps open the video on YouTube. Where I say “less than half an hour”, the file timestamps show about 40 minutes.
00:00 What this n8n email automation does
This is n8n email automation doing one useful thing. A client email comes in, n8n adds a row to my sheet, and a reply waits as a draft right under that email. The AI writes it for me. Nothing goes out until I press send. I'm building this with the n8n Assistant. I describe the workflow, it builds it, and I check what it got right and what I have to fix. I've actually used n8n many times before, so don't measure yourself against my times if you try this out for the first time.
00:31 n8n Cloud or self-hosted?
Maybe a quick note before you pick. I run my own n8n on a server, and for this video I used a fresh n8n Cloud trial. The n8n Cloud link is in the description. It's an affiliate link. If you subscribe, I earn a commission and you pay the same. n8n didn't pay for this video. So, for a first workflow, I'd start on cloud because Google sign-in and AI models work without any setup. It's a 14-day trial with no card, then from 20 euros a month on the annual plan. When the trial ends and you don't upgrade, n8n deletes the instance, so download your workflow, because you can also take it to a local instance, for example.
If you self-host, the software costs nothing, but you pay for the server and set up your own Google project, which can be a bit fiddly. Alright, we are in n8n, and this is the official website, n8n.io. We're gonna click Get Started now. Your instance is ready. Start automating. Okay, and that already gives me the n8n Assistant. This is actually what we want to try out. We can see here that we have 1,000 executions right now and 14 days left in the trial period, so you got 14 days to try everything out. And this is the Assistant here.
01:56 My prompt for the n8n AI Assistant
And I actually prepared a little prompt here, and this reads: Build a workflow called Client Email Drafts. Trigger: Gmail, when a new email arrives with the label Inquiries. I need the full email text, not just a snippet. Step one: Use an AI model with Gateway credits to read the email and return three fields: category, good fit, step two and so on. But I would just start this as is and see what actually happens. Let's go.
So we need to connect Gmail and Google Sheets because, well, that just makes sense. So we're gonna do this. Disclaimer: this is not my actual mail account. This is just a mail account that I use for testing, so I would advise, if you test stuff out, definitely don't use your actual mailbox, but use a test one instead. Same here, you should always go through the different things that are allowed. Both of them are connected to the n8n Cloud, which is super smooth. If you run this on your local server, this is way more fiddly to set everything up. So that's definitely a plus for the cloud version.
We also have this here prepared already, the Inquiries: Date, From, Subject, Category, Summary. And Gmail is connected, and we can already see the whole thing, and it's already testing. So this is super nice, to be honest, to actually see this being built out, because I remember even months ago, I think, but definitely years ago, you would need to build everything yourself, but it's super convenient that you now have this AI Assistant here in n8n. If you want this for your own inquiries and don't want to build it alone or need help with that, that's what my AI Workflow Sprint is for. Feel free to contact me.
The info is down in the description.
04:06 What the Assistant built
Okay, I built Client Email Drafts. It wasn't published yet, and I won't publish it without asking you. Very nice of you. Thank you so much. How it works: Trigger: Gmail checks every minute for emails with the label Inquiries and pulls in the full email text, not just a snippet. AI step: GPT-5.4 mini runs on Gateway credits, so you don't need an API key. Very convenient, thank you. A row goes into your Inquiries sheet with date, sender, subject, category and summary. This is good, because those are the five that we set up in here. Draft: It creates a Gmail draft in the same thread, addressed to the sender, with the subject Re: plus the original subject.
It only creates drafts and never sends anything. I like that. Two additions you didn't ask for. Duplicate check: Gmail sometimes returns the same email more than once. Interesting. To make sure each email is handled only once, I created a small data table called Processed Inquiry Emails. It stores the ID of each email after it's handled, and emails already in it are skipped. Though what I ask myself is, if I get another reply with the same subject, does it still skip this or does it work? Probably, because it's the IDs. It should work, but something I would need to test. Read status: emails are processed whether they are read or unread, and the workflow doesn't mark anything as read.
Testing so far: I ran it twice with sample emails. The routing worked both ways. The good fit email went to the draft step and the not relevant email skipped it, but those runs used made-up results for the trigger, the AI step, the sheet, the draft and the duplicate check, so nothing has run against your real Gmail or sheet yet. In the setup panel, pick your Inquiries spreadsheet and the tab to write to. Okay.
05:58 Mapping the Google Sheet columns
Let's make this a little bit bigger. Nice. So we can actually see the different steps here. New Inquiry Email, Skip Already Processed, this is the Classify and Draft, Log into Inquiries Sheet. Okay, we now need to actually choose a document here, because there's only the Inquiries document. But this is how a node looks. You get the schema, the table and the JSON. Here now: Map Each Column Manually. Map Automatically: Look for incoming data that matches the columns in Google Sheet. Let's do it manually.
From the Inquiry mail, we want to have the date here. It already switches to expression, which is good. Who's it from?
Value. I want to see the address like this. We want to have the subject, and category and summary come from the AI node, so we're gonna put the category here and the summary here, and that should do the trick. Let's hit the Execute Step. From, date, subject, category, summary. Yes, nice. Okay, now that actually works.
07:26 First test with a real email
The live test ran without errors, but it didn't test anything. The trigger found no email. Yeah, that makes a lot of sense. Put a test email in the Inquiries label. Yes, I prepared that. Those are coming from my personal mail. Okay, hit send. Let's see if it appears. Refresh. Boom. Okay, it's in here. It already has the Inquiries label.
Yeah, let's always allow. Okay, now we can see this live here as it actually works. And let's read the mail first: I run a small yoga studio in Austin and I spend about five hours a week answering the same questions about classes and memberships. Can you help me automate that? So this is a real inquiry. The live test worked. All seven steps ran on your real accounts with no errors and nothing simulated. We got it in here. The From is right. The time is also right. This is a good fit, and the summary is also correct. What we do have now is also a new draft: Hi Maya, yes, we can likely help with that.
Automating common questions about classes and memberships is exactly the kind of workflow we work on. Bam! That did actually work. And what we can do now is execute this again to see if the double check actually works. Same email as the previous, duplicate check. It set everything up as intended. I don't want to go into too much detail. If you have any problem with any of your n8n workflows, feel free to comment the questions below. Okay.
09:15 Teaching the AI how to reply
After all of this, I got $1.99 left, and I can always change this, though, to my own credentials, to my own API keys. And what we're gonna do is we're gonna scroll down all the way here, since there's no instructions here anywhere. We're gonna add the option, search for instruction. It's not actually in here. Did I miss the instruction? Oh, instruction, it's here. I missed it. Okay, so those are the instructions so far, because this is what the Assistant did, and I went a little bit more into detail. You can also check the video on how to let AI write more like yourself. There's some instructions in here on how they should reply, because, for example, we saw here in the drafts Best, Your Name.
Now it's gonna reply with Lukas every time. And I put in four more mails in the inbox, and
10:18 Four more emails: what went wrong
we're gonna let it run once again. Execute. Let's see if we get better draft results now and if everything else works as expected. Let's go through them. Client onboarding takes forever. This is a real one. At low prices. So this actually would be a good one to answer. This is not really a question. It's also weird that the other ones weren't put in here, because at least they should have gotten the Not relevant category. Let's run it again, see what happens. Skip Already Processed, so it stopped there. Let's see the Processed Inquiry Emails. Okay, there's only the two in here. Super weird. Let's do some troubleshooting.
11:13 Fixing it with the Assistant
Talking about bad prompts, this is definitely a bad prompt.
What problems did you notice? Okay, some emails got no draft. Wrong category. Let's submit this and see if the AI Assistant from n8n themselves can actually fix this. Speaking about drafts, but let's check this one here, which actually got created. Oh, it actually created the one for Daniel, but not this one.
Missing drafts weren't a bug. Those emails were never run through the workflow. When you click Execute, the workflow only fetches your newest email with the Inquiries label.
Because it came before the newest one? How can we make sure that all inquiries get checked? Okay, so that was the actual problem, because only that one counted as the newest one. It never added those three here, which makes a lot of sense, because it checks every minute, but if two emails come at the same time within that minute, one gets skipped. Yes, okay, switch. Let's check every five minutes. Yeah, that makes a lot more sense. But now that we schedule this to every five minutes, the label gets checked with every mail, and all the ones that are here in the Processed Inquiry Emails are being skipped, and all the new ones are being checked.
Quick correction here. I said that if two emails come at the same time, one gets skipped. That's only the test button, because it picks up the newest email. Once the workflow is actually published, which it wasn't here in the test, the Gmail trigger picks up every new one. So the problem came from the test and not from n8n itself. It was just because it wasn't a live trigger here. Okay, so the Assistant is ready.
13:20 Final run and publishing
A live run, clicking Execute would really do the following: Add three rows to your sheet, create two drafts for Rachel and Pierre. And once you're done with this, always make sure you actually publish, because until you publish, nothing is live, and the five-minute routine here wouldn't run.
Okay, so Website is being tagged as a Question. This is fine. Pierre wants help with his website, but the request is too vague to know what he needs. Not relevant, this is a sales pitch, and this is definitely a good fit. We should see drafts now if we refresh in Gmail, and those are actual drafts that could be sent out. So all the automation does is scan your mails and write in this Google Sheet here whether it's a good fit, a question or not relevant for you, and also, if it is either a question or a good fit, creating a draft in your mailbox that you can then go through and hit send or edit the draft or delete it if you think otherwise.
So I would say that was pretty good. The AI Assistant really worked well, and we created a new workflow that checks your mailbox for inquiries in less than half an hour, I would say.
14:56 Real client emails and the 5-minute catch
Don't point this at your whole inbox. Every email it processes is one AI call. One label is enough, and if your website form already sends you an email, that's your trigger. Before you run this on real client emails: that text goes through n8n to the AI provider. Check if that really fits your work. Here's the catch with the schedule the Assistant suggested. It runs every five minutes, whether there is an email or not. That's 288 runs a day. The starter plan includes 2,500 a month. So that's gone in about nine days. Test runs didn't count. My counter still says zero. So before you publish, set it to once an hour or go back to the Gmail trigger.
15:40 My verdict
My verdict: the Assistant got me most of the way, and very fast, but I still had to map the sheet columns, clean up the drafts and check every result. If you answer the same kind of inquiry every week, this is worth building. If you get two emails a month, it definitely isn't. So let me know what you think. Do you think this is helpful? Did you already set up automations like this? Let me know in the comments. My n8n guide and the AI Workflow Sprint are both linked below. And if this was useful, make sure to watch the next one. Thank you so much for watching, and see you again in the next video.
Sources
n8n prices and features only from n8n's own pages, with retrieval dates. Everything else comes from my test in the video.
n8n
- Pricing page: Starter, Pro, trial, executions, Gateway credits, retrieved November 9, 2026
- Docs: trial and plans (“Try free then choose a plan”), retrieved November 9, 2026
- Docs: use Gateway credits, retrieved November 9, 2026
- Docs: save and publish workflows, retrieved November 9, 2026
- Docs: Gmail Trigger (read status, emails per poll), retrieved November 9, 2026
- Source code: Gmail Trigger, the manual run fetches one email, retrieved November 9, 2026
- Docs: export, import, copy and paste workflows, retrieved November 9, 2026
- Docs: data tables, retrieved November 9, 2026
- Gmail Help: search operators (label:, newer_than:, in:), retrieved November 9, 2026
Related
Want a workflow like this for your own inquiries?
I work 1:1 with freelancers, consultants, coaches and small teams on practical AI workflows, automation and custom tools. The intro call is free and takes 15 minutes.
Book a free strategy call