This workflow corresponds to n8n.io template #6062 — we link there as the canonical source.
This workflow follows the Gmail → Gmail Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "zZWPMtZ0TNebe1fI",
"name": "Automate Invoice Processing from Gmail with Azure GPT-4.1 and Human Verification",
"tags": [],
"nodes": [
{
"id": "a6fd1034-16ac-48ce-a20e-5d00f9709d76",
"name": "Gmail Trigger",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
40,
220
],
"parameters": {
"simple": false,
"filters": {
"sender": "user@example.com"
},
"options": {
"downloadAttachments": true
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "b4829627-2c3e-477c-8ff0-9754f0010826",
"name": "IF: AI Says Yes",
"type": "n8n-nodes-base.if",
"position": [
1020,
260
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.output[0].insights[0].body }}",
"value2": "Yes",
"operation": "contains"
}
]
}
},
"typeVersion": 1
},
{
"id": "14933a59-1cd2-4572-aa92-8968ffa03b8a",
"name": "Save PDF Locally",
"type": "n8n-nodes-base.writeBinaryFile",
"position": [
1640,
220
],
"parameters": {
"options": {},
"fileName": "=C:/Test/Invoices/invoice_{{ $now.toFormat('yyyyLLdd_HHmmss') }}.pdf",
"dataPropertyName": "attachment_0"
},
"typeVersion": 1
},
{
"id": "0a17eed9-be81-4576-b218-ad12b3ffac28",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1480,
220
],
"parameters": {
"mode": "chooseBranch"
},
"retryOnFail": false,
"typeVersion": 3.2
},
{
"id": "e577ce73-0505-45f0-80cb-aa6d241f1add",
"name": "Information Extractor",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"onError": "continueErrorOutput",
"position": [
660,
280
],
"parameters": {
"text": "={{ $json.text }}",
"options": {
"systemPromptTemplate": "You are an expert reviewing invoices. Analyze the texts and say if it is an invoice. Just answer 'Yes' or 'No'"
},
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"topic\": { \"type\": \"string\" },\n \"insights\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": { \"type\": \"string\" },\n \"body\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n}"
},
"typeVersion": 1.2,
"alwaysOutputData": true
},
{
"id": "861f5008-bd46-4091-b040-b7b2fe1e6f45",
"name": "Is this PDF?",
"type": "n8n-nodes-base.if",
"position": [
260,
220
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.subject }}",
"value2": "Invoice",
"operation": "contains"
},
{
"value1": "={{ $binary.attachment_0 }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1,
"alwaysOutputData": true
},
{
"id": "e23bf999-1718-4489-a308-e244b22e14ad",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
1020,
480
],
"parameters": {
"sendTo": "user@example.com",
"message": "I had trouble parsing the recent invoice. Can you please confirm that it is an invoice?",
"options": {
"appendAttribution": false
},
"subject": "Approval Required!",
"operation": "sendAndWait",
"approvalOptions": {
"values": {
"approvalType": "double"
}
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "bc2a8732-2e5f-421b-8df1-37a6ec2f7a2e",
"name": "Invoice Saved Message",
"type": "n8n-nodes-base.gmail",
"position": [
1800,
220
],
"parameters": {
"sendTo": "user@example.com",
"message": "=Hi there,\nInvoice '{{ $json.subject }}' from \"{{ $json.from.value[0].name }}\" has been saved successfully in your Local Folder!\n\n",
"options": {
"appendAttribution": false
},
"subject": "=Invoice Downloaded"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "c9155103-6c04-438a-8e90-edb63b9ffd1a",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
120
],
"parameters": {
"color": 7,
"width": 200,
"height": 300,
"content": "Triggers Gmail when new email from specific email account is received.\n"
},
"typeVersion": 1
},
{
"id": "a7a4385d-f00e-493c-9757-fbd660a64354",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
220,
120
],
"parameters": {
"color": 7,
"width": 180,
"height": 300,
"content": "Checks if there is any pdf attachments in email, and Invoice is included in subject\n"
},
"typeVersion": 1
},
{
"id": "da0c4d5e-9c24-4f3d-a17a-ca92d3299729",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
420,
0
],
"parameters": {
"color": 7,
"width": 180,
"height": 600,
"content": "If both are true, it extracts the information from the pdf.\n\nIf not, it gives an error saying that there is no invoice file included."
},
"typeVersion": 1
},
{
"id": "2196f52f-9e5b-4acd-b173-86ff7e986b71",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
620,
0
],
"parameters": {
"color": 7,
"width": 780,
"height": 660,
"content": "This checks the extracted information from the pdf and analyze if it is invoice.\n\nBased on the information, if it is invoice, it gives output of \"Yes\", otherwise \"No\".\n\nIf \"Yes\", it merges response to another node.\nIf \"No\", it sends an email to person and says that the file does not seem like an invoice and double check the file for review. When human responds that it is an invoice, it corrects its answer as \"Yes\".\n\nIf there is an error parsing the extracted texts, it sends an email to user to check the file and asks for approval."
},
"typeVersion": 1
},
{
"id": "ba5b7574-a2e1-401e-aab0-c7ca6b7856d8",
"name": "Azure OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
660,
440
],
"parameters": {
"model": "gpt-4.1",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "42973f72-4ce9-4fff-90e5-9a09cc68f39b",
"name": "Manual Verification",
"type": "n8n-nodes-base.gmail",
"position": [
1200,
340
],
"parameters": {
"sendTo": "user@example.com",
"message": "The latest invoice does not seem to be legit. Please verify it manually.",
"options": {
"appendAttribution": false
},
"subject": "Manual Verification Required"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "f1d15106-d677-4484-8602-7091c87be5c7",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1420,
120
],
"parameters": {
"color": 7,
"width": 560,
"height": 300,
"content": "After verifying that the file is an invoice, it saves the file in the local directory. When the workflow is completed, it sends a success email to user."
},
"typeVersion": 1
},
{
"id": "f589f451-3faf-4930-ab12-4796f219d066",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"width": 400,
"height": 100,
"content": "## Use this to automatically save invoice received in an email"
},
"typeVersion": 1
},
{
"id": "3b021445-e52e-4191-a454-654ba26e1bba",
"name": "Error Handler",
"type": "n8n-nodes-base.stopAndError",
"position": [
460,
440
],
"parameters": {
"errorMessage": "There is no pdf file!"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "a74dc17a-a9fe-448e-a457-4b267ce63830",
"connections": {
"Merge": {
"main": [
[
{
"node": "Save PDF Locally",
"type": "main",
"index": 0
}
]
]
},
"Is this PDF?": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
},
{
"node": "Information Extractor",
"type": "main",
"index": 0
}
],
[
{
"node": "Error Handler",
"type": "main",
"index": 0
}
]
]
},
"Gmail Trigger": {
"main": [
[
{
"node": "Is this PDF?",
"type": "main",
"index": 0
}
]
]
},
"IF: AI Says Yes": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
],
[
{
"node": "Manual Verification",
"type": "main",
"index": 0
}
]
]
},
"Save PDF Locally": {
"main": [
[
{
"node": "Invoice Saved Message",
"type": "main",
"index": 0
}
]
]
},
"Information Extractor": {
"main": [
[
{
"node": "IF: AI Says Yes",
"type": "main",
"index": 0
}
],
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Azure OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Information Extractor",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
azureOpenAiApigmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Source: https://n8n.io/workflows/6062/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Customer Feedback Loop Analyzer. Uses formTrigger, lmChatGoogleGemini, gmail, slack. Event-driven trigger; 11 nodes.
This workflow delivers a complete, enterprise-grade Gmail automation system designed for high-volume teams. It classifies incoming emails, applies labels, generates AI-powered responses, and routes me
This workflow automatically converts incoming Gmail messages into structured support tickets using AI classification. It assigns categories, generates a unique ticket ID, stores data in PostgreSQL, as
Note: This template only works for self-hosted n8n.
Manually adding important term dates to your calendar by hand? Stop! Automate it with this simple AI/LLM-powered document understanding and extraction template. This cool use-case can be applied to ma