This workflow corresponds to n8n.io template #2320 — we link there as the canonical source.
This workflow follows the Chainllm → Gmail 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 →
{
"createdAt": "2025-07-14T19:07:33.486Z",
"updatedAt": "2025-07-14T19:07:33.486Z",
"id": "dkILwdJwtinnWZ97",
"name": "Invoice_data_extraction_with_LlamaParse_and_OpenAI",
"active": false,
"isArchived": false,
"nodes": [
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-3.5-turbo-1106",
"cachedResultName": "gpt-3.5-turbo-1106"
},
"options": {
"temperature": 0
}
},
"id": "86bf39fa-e502-4168-8663-f8426d3ba087",
"name": "OpenAI Model",
"type": "@n8n/n8n-nodes-langchain.lmOpenAi",
"position": [
1280,
-20
],
"typeVersion": 1
},
{
"parameters": {
"jsonSchema": "{\n \"Invoice date\": { \"type\": \"date\" },\n \"invoice number\": { \"type\": \"string\" },\n \"Purchase order number\": { \"type\": \"string\" },\n \"Supplier name\": { \"type\": \"string\" },\n \"Supplier address\": {\n \"type\": \"object\",\n \"properties\": {\n \"address 1\": { \"type\": \"string\" },\n \"address 2\": { \"type\": \"string\" },\n \"city\": { \"type\": \"string\" },\n \"postcode\": { \"type\": \"string\" }\n }\n },\n \"Supplier VAT identification number\": { \"type\": \"string\" },\n \"Customer name\": { \"type\": \"string\" },\n \"Customer address\": {\n \"type\": \"object\",\n \"properties\": {\n \"address 1\": { \"type\": \"string\" },\n \"address 2\": { \"type\": \"string\" },\n \"city\": { \"type\": \"string\" },\n \"postcode\": { \"type\": \"string\" }\n }\n },\n \"Customer VAT identification number\": { \"type\": \"string\" }, \n \"Shipping addresses\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"address 1\": { \"type\": \"string\" },\n \"address 2\": { \"type\": \"string\" },\n \"city\": { \"type\": \"string\" },\n \"postcode\": { \"type\": \"string\" }\n }\n }\n },\n \"Line items\": {\n \"type\": \"array\",\n \"items\": {\n \"name\": \"string\",\n \"description\": \"string\",\n \"price\": \"number\",\n \"discount\": \"number\"\n }\n },\n \"Subtotal without VAT\": { \"type\": \"number\" },\n \"Subtotal with VAT\": { \"type\": \"number\" },\n \"Total price\": { \"type\": \"number\" }\n}"
},
"id": "8322ab82-8727-41a1-bc6b-e573583a5d16",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1460,
-20
],
"typeVersion": 1.1
},
{
"parameters": {
"method": "POST",
"url": "https://api.cloud.llamaindex.ai/api/parsing/upload",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "file",
"inputDataFieldName": "=attachment_0"
}
]
},
"options": {}
},
"id": "3601e171-fc91-4d12-8569-87502862eb29",
"name": "Upload to LlamaParse",
"type": "n8n-nodes-base.httpRequest",
"position": [
480,
-80
],
"typeVersion": 4.2
},
{
"parameters": {
"content": "## 2. Advanced PDF Processing with LlamaParse\n[Read more about using HTTP Requests](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)\n\nLlamaIndex's LlamaCloud is a cloud-based service that allows you to upload,\nparse, and index document. LlamaParse is a tool offered by LlamaCloud\nto parse for complex PDFs with embedded objects ie PDF Tables and figures.\n\nAt time of writing, you can parse 1000 pdfs/day with LlamaCloud's free plan\nby signing up at [https://cloud.llamaindex.ai/](https://cloud.llamaindex.ai/?ref=n8n.io).",
"height": 623.4951418211454,
"width": 785.9525375246163,
"color": 7
},
"id": "97e1e1b9-6078-4384-9285-23e69506c56f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-20,
-420
],
"typeVersion": 1
},
{
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"simple": false,
"filters": {
"q": "has:attachment",
"sender": "invoices@paypal.com"
},
"options": {
"downloadAttachments": true
}
},
"id": "9559b45f-8074-48d5-a83e-cfabe0007c14",
"name": "Receiving Invoices",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-360,
-100
],
"typeVersion": 1
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"mode": "list",
"value": "1omHDl1jpjHyrtga2ZHBddUkbkdatEr1ga9vHc4fQ1pI",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1omHDl1jpjHyrtga2ZHBddUkbkdatEr1ga9vHc4fQ1pI/edit?usp=drivesdk",
"cachedResultName": "Invoice Reconciliation"
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "gid=0"
},
"columns": {
"value": {},
"schema": [
{
"id": "Invoice date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Invoice date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "invoice number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "invoice number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Purchase order number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Purchase order number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Supplier name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier address",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Supplier address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier VAT identification number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Supplier VAT identification number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Customer name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Customer name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Customer address",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Customer address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Customer VAT identification number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Customer VAT identification number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping addresses",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Shipping addresses",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Line items",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Line items",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subtotal without VAT",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Subtotal without VAT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subtotal with VAT",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Subtotal with VAT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total price",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Total price",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"output"
]
},
"options": {}
},
"id": "b7130033-29b9-40d1-9be2-c820d5567917",
"name": "Append to Reconciliation Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1820,
-180
],
"typeVersion": 4.3
},
{
"parameters": {
"url": "=https://api.cloud.llamaindex.ai/api/parsing/job/{{ $json.id }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
},
"options": {}
},
"id": "6a38a03d-c78a-4b6d-83f4-6fcc1a9d1cc0",
"name": "Get Processing Status",
"type": "n8n-nodes-base.httpRequest",
"position": [
660,
-80
],
"typeVersion": 4.2
},
{
"parameters": {
"amount": 1
},
"id": "213ffd03-2a80-4a6e-8067-43c3291506eb",
"name": "Wait to stay within service limits",
"type": "n8n-nodes-base.wait",
"position": [
980,
80
],
"typeVersion": 1.1
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "300fce8c-b19a-4d0c-86e8-f62853c70ce2",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "SUCCESS"
}
]
},
"renameOutput": true,
"outputKey": "SUCCESS"
},
{
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e6058aa0-a3e2-4ce3-9bed-6ff41a5be052",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "ERROR"
}
]
},
"renameOutput": true,
"outputKey": "ERROR"
},
{
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ceb6338f-4261-40ac-be11-91f61c7302ba",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "CANCELED"
}
]
},
"renameOutput": true,
"outputKey": "CANCELED"
},
{
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0fa97d86-432a-409a-917e-5f1a002b1ab9",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "PENDING"
}
]
},
"renameOutput": true,
"outputKey": "PENDING"
}
]
},
"options": {
"allMatchingOutputs": true
}
},
"id": "dc12e1a2-6851-47f7-bfe2-6775fa8dd905",
"name": "Is Job Ready?",
"type": "n8n-nodes-base.switch",
"position": [
820,
-80
],
"typeVersion": 3
},
{
"parameters": {
"content": "## 1. Watch for Invoice Emails\n[Read more about Gmail Triggers](https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.gmailtrigger)\n\nThe Gmail node can watch for all incoming messages and filter based on a condition. We'll set our Gmail node to wait for:\n* a message from particular email address.\n* having an attachment which should be the invoice PDF\n* not having a label \"invoice synced\", which is what we use to avoid duplicate processing.",
"height": 709.5781339256318,
"width": 808.8727491350096,
"color": 7
},
"id": "ea544107-567b-4953-b89c-2d781689e7cf",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-440,
-360
],
"typeVersion": 1
},
{
"parameters": {
"content": "## 3. Use LLMs to Extract Values from Data\n[Read more about Basic LLM Chain](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm/)\n\nLarge language models are perfect for data extraction tasks as they can work across a range of document layouts without human intervention. The extracted data can then be sent to a variety of datastores such as spreadsheets, accounting systems and/or CRMs.\n\n**Tip:** The \"Structured Output Parser\" ensures the AI output can be\ninserted to our spreadsheet without additional clean up and/or formatting. ",
"height": 656.5014186128178,
"width": 805.0578351924228,
"color": 7
},
"id": "3ee4f175-a288-40b3-9087-86d1c7d9e1c9",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1220,
-420
],
"typeVersion": 1
},
{
"parameters": {
"content": "### \ud83d\ude4b\u200d\u2642\ufe0f Why not just use the built-in PDF convertor?\nA common issue with PDF-to-text convertors are that they ignore important data structures like tables. These structures can be important for data extraction. For example, being able to distinguish between seperate line items in an invoice.",
"height": 154.49585536070904,
"width": 394.15089838126653,
"color": 5
},
"id": "3dd702ba-1678-46ae-bdc6-9ebe74da438a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
800,
300
],
"typeVersion": 1
},
{
"parameters": {
"content": "## 4. Add Label to Avoid Duplication\n[Read more about working with Gmail](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/)\n\nTo finish off the workflow, we'll add the \"invoice synced\" label to the original invoice email to flag that the extraction was successful. This can be useful if working with a shared inbox and for quality control purposes later.",
"height": 440.3435768155051,
"width": 362.3535748101346,
"color": 7
},
"id": "916d8b76-e626-4d02-ad5a-b65eadac489d",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2060,
-340
],
"typeVersion": 1
},
{
"parameters": {
"content": "## Try Me Out!\n\n**This workflow does the following:**\n* Waits for email invoices with PDF attachments.\n* Uses the LlamaParse service to convert the invoice PDF into a markdown file.\n* Uses a LLM to extract invoice data from the Markdown file.\n* Exports the extracted data to a Google Sheet.\n\n\n### Good to know\n* You'll need to create the label \"invoice synced\" in gmail before using this workflow.\n\n",
"height": 453,
"width": 360
},
"id": "9b738930-3958-4c81-b1d2-906a194d230b",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-840,
-360
],
"typeVersion": 1
},
{
"parameters": {
"operation": "addLabels",
"messageId": "={{ $('Receiving Invoices').item.json.id }}",
"labelIds": [
"Label_5511644430826409825"
]
},
"id": "74cd72fc-2a86-4e00-887b-d2ee444035e8",
"name": "Add \"invoice synced\" Label",
"type": "n8n-nodes-base.gmail",
"position": [
2180,
-100
],
"typeVersion": 2.1
},
{
"parameters": {
"url": "=https://api.cloud.llamaindex.ai/api/parsing/job/{{ $json.id }}/result/markdown",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {
"redirect": {
"redirect": {}
}
}
},
"id": "06f2483d-a914-40b5-8413-5c853d38c058",
"name": "Get Parsed Invoice Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
1020,
-220
],
"typeVersion": 4.2
},
{
"parameters": {
"mode": "raw",
"jsonOutput": "={{ $json.output }}",
"options": {}
},
"id": "a5f36e51-448e-49ee-ae93-a88df7334eac",
"name": "Map Output",
"type": "n8n-nodes-base.set",
"position": [
280,
-220
],
"typeVersion": 3.3
},
{
"parameters": {
"promptType": "define",
"text": "=Given the following invoice in the <invoice> xml tags, extract the following information as listed below.\nIf you cannot the information for a specific item, then leave blank and skip to the next. \n\n* Invoice date\n* invoice number\n* Purchase order number\n* Supplier name\n* Supplier address\n* Supplier VAT identification number\n* Customer name\n* Customer address\n* Customer VAT identification number\n* Shipping addresses\n* Line items, including a description of the goods or services rendered\n* Price with and without VAT\n* Total price\n\n<invoice>{{ $json.markdown }}</invoice>",
"hasOutputParser": true
},
"id": "d6a53b9b-d801-482e-b59c-eab8ee954edc",
"name": "Apply Data Extraction Rules",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1280,
-180
],
"typeVersion": 1.4
},
{
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e5649a2b-6e12-4cc4-8001-4639cc9cc2c2",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $input.item.binary.attachment_0.mimeType }}",
"rightValue": "application/pdf"
},
{
"id": "4c57ab9b-b11c-455a-a63d-daf48418b06e",
"operator": {
"type": "array",
"operation": "notContains",
"rightType": "any"
},
"leftValue": "={{ $json.labels }}",
"rightValue": "invoice synced"
}
]
},
"options": {}
},
"id": "384a6008-4c70-46e3-a267-513a51d95776",
"name": "Should Process Email?",
"type": "n8n-nodes-base.if",
"position": [
200,
-100
],
"typeVersion": 2
},
{
"parameters": {
"fieldToSplitOut": "labelIds",
"options": {}
},
"id": "66a7183d-d153-42bf-843c-aff586f8b8f1",
"name": "Split Out Labels",
"type": "n8n-nodes-base.splitOut",
"position": [
-160,
-100
],
"typeVersion": 1
},
{
"parameters": {
"resource": "label",
"operation": "get",
"labelId": "={{ $json.labelIds }}"
},
"id": "c7f8e3cc-a62b-41a1-a22c-7aee01f76c9f",
"name": "Get Labels Names",
"type": "n8n-nodes-base.gmail",
"position": [
-160,
60
],
"typeVersion": 2.1
},
{
"parameters": {
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "name",
"renameField": true,
"outputFieldName": "labels"
}
]
},
"options": {}
},
"id": "e5b44ef5-4f9b-410a-80d4-a83fd690a527",
"name": "Combine Label Names",
"type": "n8n-nodes-base.aggregate",
"position": [
-160,
200
],
"typeVersion": 1
},
{
"parameters": {
"mode": "combine",
"combinationMode": "multiplex",
"options": {}
},
"id": "8d0200ae-736e-49dc-b5c9-f8f5fe080316",
"name": "Email with Label Names",
"type": "n8n-nodes-base.merge",
"position": [
20,
-100
],
"typeVersion": 2.1
},
{
"parameters": {
"content": "\n\n\n\n\n\n\n\n\n\n\n\n**Need more attributes?**\nChange it here!",
"height": 213.73043662572252,
"width": 192.26896179623753
},
"id": "1142751a-9e8b-40f7-ad51-89fafb268d43",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1400,
-40
],
"typeVersion": 1
},
{
"parameters": {
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ud83d\udea8**Required**\n* Set Your Google Sheet URL here\n* Set the Name of your Sheet\n\n\n**Don't use GSheets?**\nSwap this for Excel, Airtable or a Database!",
"height": 397.0641952938746,
"width": 258.29345180972877
},
"id": "c2238cc1-3c22-4dc7-a989-709de6ce6f05",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1740,
-200
],
"typeVersion": 1
},
{
"parameters": {
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ud83d\udea8**Required**\n* Change the email filters here!",
"height": 274.6295678979021,
"width": 174.50671517518518
},
"id": "ceb26ce6-cc05-4856-94ef-b2595933137d",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
-120
],
"typeVersion": 1
}
],
"connections": {
"Map Output": {
"main": [
[
{
"node": "Append to Reconciliation Sheet",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Model": {
"ai_languageModel": [
[
{
"node": "Apply Data Extraction Rules",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Is Job Ready?": {
"main": [
[
{
"node": "Get Parsed Invoice Data",
"type": "main",
"index": 0
}
],
[],
[],
[
{
"node": "Wait to stay within service limits",
"type": "main",
"index": 0
}
]
]
},
"Get Labels Names": {
"main": [
[
{
"node": "Combine Label Names",
"type": "main",
"index": 0
}
]
]
},
"Split Out Labels": {
"main": [
[
{
"node": "Get Labels Names",
"type": "main",
"index": 0
}
]
]
},
"Receiving Invoices": {
"main": [
[
{
"node": "Split Out Labels",
"type": "main",
"index": 0
},
{
"node": "Email with Label Names",
"type": "main",
"index": 0
}
]
]
},
"Combine Label Names": {
"main": [
[
{
"node": "Email with Label Names",
"type": "main",
"index": 1
}
]
]
},
"Upload to LlamaParse": {
"main": [
[
{
"node": "Get Processing Status",
"type": "main",
"index": 0
}
]
]
},
"Get Processing Status": {
"main": [
[
{
"node": "Is Job Ready?",
"type": "main",
"index": 0
}
]
]
},
"Should Process Email?": {
"main": [
[
{
"node": "Upload to LlamaParse",
"type": "main",
"index": 0
}
]
]
},
"Email with Label Names": {
"main": [
[
{
"node": "Should Process Email?",
"type": "main",
"index": 0
}
]
]
},
"Get Parsed Invoice Data": {
"main": [
[
{
"node": "Apply Data Extraction Rules",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Apply Data Extraction Rules",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Apply Data Extraction Rules": {
"main": [
[
{
"node": "Map Output",
"type": "main",
"index": 0
}
]
]
},
"Append to Reconciliation Sheet": {
"main": [
[
{
"node": "Add \"invoice synced\" Label",
"type": "main",
"index": 0
}
]
]
},
"Wait to stay within service limits": {
"main": [
[
{
"node": "Get Processing Status",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"meta": {
"templateCredsSetupCompleted": true
},
"versionId": "47f917b4-f72c-4e97-bf90-59ec2b60d0ff",
"triggerCount": 0,
"tags": [
{
"createdAt": "2025-07-09T21:41:38.773Z",
"updatedAt": "2025-07-09T21:41:38.773Z",
"id": "G5Lcoe2jTgqCJuSy",
"name": "OpenAI"
},
{
"createdAt": "2025-07-09T21:41:38.763Z",
"updatedAt": "2025-07-09T21:41:38.763Z",
"id": "pz5LfYMpyppJnoPT",
"name": "WooCommerce"
}
],
"shared": [
{
"createdAt": "2025-10-25T12:28:46.049Z",
"updatedAt": "2025-10-25T12:28:46.049Z",
"role": "workflow:owner",
"workflowId": "dkILwdJwtinnWZ97",
"projectId": "gRDCuWZgtIsQJhnE",
"project": {
"createdAt": "2025-10-25T12:28:30.681Z",
"updatedAt": "2025-10-25T12:30:12.034Z",
"id": "gRDCuWZgtIsQJhnE",
"name": "Leonardo Sep\u00falveda <lsepulvedatabares@gmail.com>",
"type": "personal",
"icon": null,
"description": null
}
}
]
}
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.
gmailOAuth2googleSheetsOAuth2ApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n workflow automates the process of parsing and extracting data from PDF invoices. With this workflow, accounts and finance people can realise huge time and cost savings in their busy schedules.
Source: https://n8n.io/workflows/2320/ — 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.
[](https://www.youtube.com/watch?v=rfu4MSvtpAw)
Invoice_data_extraction_with_LlamaParse_and_OpenAI. Uses lmOpenAi, outputParserStructured, httpRequest, gmailTrigger. Event-driven trigger; 26 nodes.
Perfect for use cases such as: 💼 Finance teams managing vendor invoices 📊 Bookkeeping workflows 🔄 Automating monthly reconciliation
Automatically process invoice emails by saving attachments to Google Drive and extracting key invoice data to Google Sheets using AI. This workflow monitors your Gmail for unread emails with attachmen
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.