This workflow corresponds to n8n.io template #16172 — we link there as the canonical source.
This workflow follows the Googlegemini → Telegram 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": "8eNidFzew1YypgLl",
"name": "Extract Data from Purchase Orders to Excel using AI + OCR (PDF/Image)",
"tags": [],
"nodes": [
{
"id": "2ac4f2e8-011c-42d9-bd37-94517bbb1c75",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-784,
416
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "07bbed3c-626b-4658-a6e5-80042a44509e",
"name": "Detect File Type",
"type": "n8n-nodes-base.code",
"position": [
-560,
416
],
"parameters": {
"jsCode": "const msg = $input.first().json.message\n\nlet type = \"unknown\";\nlet fileId = null;\n\nif (msg.document) {\n const mime = msg.document.mime_type || \"\";\n const name = msg.document.file_name || \"\";\n\n if (mime.includes(\"pdf\") || name.endsWith(\".pdf\")) {\n type = \"pdf\";\n } else if (\n mime.includes(\"image\") ||\n name.match(/\\.(jpg|jpeg|png)$/i)\n ) {\n type = \"image\";\n }\n\n fileId = $input.first().json.message.document.file_id;\n} else if (msg.photo) {\n type = \"image\";\n \n fileId = $input.first().json.message.photo[$input.first().json.message.photo.length - 1].file_id \n}\n\nreturn [\n {\n json: {\n ...$json,\n file_type: type,\n file_id : fileId\n },\n },\n];"
},
"typeVersion": 2
},
{
"id": "f04ac355-7538-4b7b-be29-e594d1c4d752",
"name": "Notifikasi file invalid",
"type": "n8n-nodes-base.telegram",
"position": [
-160,
704
],
"parameters": {
"text": "\u274c File tidak valid\n\nSilakan kirim:\n- PDF invoice\n- atau gambar (JPG/PNG)\n\nContoh:\ninvoice.pdf\natau foto invoice",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "05c318e1-371b-438b-be16-91e7d543407d",
"name": "Mapping PDF",
"type": "n8n-nodes-base.set",
"position": [
64,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "ca890d40-2e42-4925-8c3b-4f41c565ad8e",
"name": "chat_id",
"type": "number",
"value": "={{ $json.message.chat.id }}"
},
{
"id": "bb342d4a-c6e0-4bce-ae74-e00ba7f3b513",
"name": "file_id",
"type": "string",
"value": "={{ $('Detect File Type').item.json.file_id }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "15fe697e-fda8-41bb-8712-5543c4dd6d29",
"name": "Mapping Image",
"type": "n8n-nodes-base.set",
"position": [
64,
528
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "82adaae7-eaaa-4bcd-9cf8-4515371a8a58",
"name": "chat_id",
"type": "string",
"value": "={{ $('Telegram Trigger').item.json.message.chat.id }}"
},
{
"id": "922d27a2-5d03-434f-a08f-5005f3639e96",
"name": "file_id",
"type": "string",
"value": "={{ $('Detect File Type').item.json.file_id }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "597492bf-9c66-4abc-b037-aa8b18bf1e9c",
"name": "Get Image",
"type": "n8n-nodes-base.telegram",
"position": [
272,
528
],
"parameters": {
"fileId": "={{ $('Detect File Type').item.json.file_id.replace(/\\n/g, '') }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "65c992a8-8103-42fc-8b21-e2b897abff5d",
"name": "Get PDF",
"type": "n8n-nodes-base.telegram",
"position": [
272,
320
],
"parameters": {
"fileId": "={{ $json.file_id }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "f26e7577-006e-43a3-bf9d-261237cc14c1",
"name": "Notifikasi file sedang diproses",
"type": "n8n-nodes-base.telegram",
"position": [
-176,
128
],
"parameters": {
"text": "Data sedang diproses, silahkan tunggu.",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "bc68367e-eb7b-4c4f-ad82-eb6530159cef",
"name": "Clean PDF Text",
"type": "n8n-nodes-base.code",
"position": [
720,
320
],
"parameters": {
"jsCode": "const raw = $input.first().json.text || \"\";\n\nconst cleaned = raw\n .replace(/\\n+/g, \"\\n\")\n .replace(/\\s+/g, \" \")\n .trim();\n\nreturn [{ json: { cleaned_text: cleaned } }];"
},
"typeVersion": 2
},
{
"id": "f27fe808-724a-4969-b10c-026c34c21fc5",
"name": "Clean OCR Text",
"type": "n8n-nodes-base.code",
"position": [
720,
528
],
"parameters": {
"jsCode": "const raw = $json.text || \"\";\n\nconst cleaned = raw\n .replace(/\\n+/g, \"\\n\")\n .replace(/\\s+/g, \" \")\n .trim();\n\nreturn [{ json: { cleaned_text: cleaned } }];"
},
"typeVersion": 2
},
{
"id": "1e7d6fe6-4d20-4389-8000-812aa5af02f4",
"name": "Route by File Type",
"type": "n8n-nodes-base.switch",
"position": [
-352,
400
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "pdf",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7de36474-d733-441e-ae2f-3c3ac8e0a4e5",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.file_type }}",
"rightValue": "pdf"
}
]
},
"renameOutput": true
},
{
"outputKey": "image",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "aa6410b5-0578-4fcf-81ed-ab440784b13c",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.file_type }}",
"rightValue": "image"
}
]
},
"renameOutput": true
},
{
"outputKey": "unknown",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b2065599-a8ce-422d-ab8a-ab1a66dad909",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.file_type }}",
"rightValue": "unknown"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.3
},
{
"id": "057afb6a-3373-4b5d-a3de-7d9d82abcf33",
"name": "Extract PDF Text",
"type": "n8n-nodes-base.extractFromFile",
"position": [
496,
320
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1.1
},
{
"id": "4b746f2e-b87a-447e-8bbc-a9e959f859c2",
"name": "Prepare PDF Data",
"type": "n8n-nodes-base.set",
"position": [
944,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "c9807596-f0db-40e3-a0c5-78b20bf37ceb",
"name": "data",
"type": "string",
"value": "={{ $json.cleaned_text }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "f491af5d-5b84-4e0a-97f2-3003f68ff8d0",
"name": "Extract Text from Image (OCR)",
"type": "n8n-nodes-tesseractjs.tesseractNode",
"position": [
480,
528
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "c2c677d9-8ada-4cdb-babe-690c9590fb06",
"name": "Prepare Image Data",
"type": "n8n-nodes-base.set",
"position": [
944,
528
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "c9807596-f0db-40e3-a0c5-78b20bf37ceb",
"name": "data",
"type": "string",
"value": "={{ $json.cleaned_text }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a72c5719-2136-44dd-8fbe-56a86536ff48",
"name": "Parse AI Response",
"type": "n8n-nodes-base.code",
"position": [
1536,
400
],
"parameters": {
"jsCode": "let raw = $input.first().json.content.parts[0].text;\n\nraw = raw\n .replace(/```json/g, '')\n .replace(/```/g, '')\n .trim();\n\nlet data;\n\ntry {\n data = JSON.parse(raw);\n} catch (e) {\n return [\n {\n json: {\n error: \"invalid_json\",\n raw_response: raw\n }\n }\n ];\n}\n\nreturn [{ json: data }];"
},
"typeVersion": 2
},
{
"id": "2a8e9f8a-7d17-4910-b99b-59473e6e5d92",
"name": "Validate Extracted Data",
"type": "n8n-nodes-base.code",
"position": [
1744,
400
],
"parameters": {
"jsCode": "const data = $json;\n\nlet valid = true;\nlet errors = [];\n\nif (!data.po_number) {\n valid = false;\n errors.push(\"Missing Purchase Order Number\");\n}\n\nif (!data.total_amount || isNaN(data.total_amount)) {\n valid = false;\n errors.push(\"Invalid total_amount\");\n}\n\nreturn [\n {\n json: {\n ...data,\n valid,\n errors\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "b9f055c7-b2b7-4897-a7ca-285f9ff99405",
"name": "Check Data Validity",
"type": "n8n-nodes-base.if",
"position": [
1952,
400
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "518533e3-8c48-4411-b049-bd63888a9356",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{$json.valid}}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "ce4e7740-830e-4dcd-9f74-3dc2d10ed4b9",
"name": "Format Data for Excel",
"type": "n8n-nodes-base.code",
"position": [
2160,
304
],
"parameters": {
"jsCode": "const items = $json.line_items || [];\n\nconst item_summary = items\n .map(i => `${i.item_name} Qty : ${i.quantity} x ${i.unit_price}) = ${i.total_price} `)\n .join(\",\\n \");\n\nreturn [\n {\n json: {\n po_number: $json.po_number,\n date: $json.order_date,\n vendor: $json.vendor_name,\n total: $json.total_amount,\n items: item_summary\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "8f95d8d1-93f7-43ee-9318-67c3a3965f5e",
"name": "Save Data to Excel",
"type": "n8n-nodes-base.microsoftExcel",
"position": [
2496,
304
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "{F41710B8-0FA7-6D4F-926C-A8620EFDEA55}",
"cachedResultUrl": "https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405&activeCell='Extract%20Data%20from%20Purchase%20Orde'!A1:E2",
"cachedResultName": "Table11"
},
"options": {},
"dataMode": "autoMap",
"resource": "table",
"workbook": {
"__rl": true,
"mode": "list",
"value": "F1CFEFF06C99E405!s1736a44f46ee4594ac0cca2529c411a8",
"cachedResultUrl": "https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405",
"cachedResultName": "Contoh Excel N8N"
},
"worksheet": {
"__rl": true,
"mode": "list",
"value": "{950C0832-DDC7-7849-AD21-9AA50773D166}",
"cachedResultUrl": "https://onedrive.live.com/personal/f1cfeff06c99e405/_layouts/15/doc.aspx?resid=1736a44f-46ee-4594-ac0c-ca2529c411a8&cid=f1cfeff06c99e405&activeCell=Extract%20Data%20from%20Purchase%20Orde!A1",
"cachedResultName": "Extract Data from Purchase Orde"
}
},
"credentials": {
"microsoftExcelOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "8092e9a1-ed87-425b-b17d-f4996a1c6766",
"name": "Send Success Notification",
"type": "n8n-nodes-base.telegram",
"position": [
2864,
304
],
"parameters": {
"text": "=\u2705 Invoice berhasil diproses Vendor: {{$json.vendor}} Total: {{$json.total}} Tanggal: {{$json.date}}",
"chatId": "={{ $('Telegram Trigger').first().json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "13615930-6c64-4aa4-b036-cbc4e3f45aa9",
"name": "Send Invalid Data Notification",
"type": "n8n-nodes-base.telegram",
"position": [
2160,
496
],
"parameters": {
"text": "=\u26a0\ufe0f Data tidak valid \n{{ $json.errors.join(\", \") }}",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "273f7c77-57ab-478a-9990-87600f5d9b2f",
"name": "Extract Structured Data (AI)",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1184,
400
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/gemini-3.5-flash",
"cachedResultName": "models/gemini-3.5-flash"
},
"options": {},
"messages": {
"values": [
{
"content": "=You are an AI that extracts structured data from Purchase Orders.\n\nExtract the following fields:\n- po_number\n- vendor_name\n- order_date\n- delivery_date\n- total_amount\n- currency\n\nLine items (array):\n- item_name\n- quantity\n- unit_price\n- total_price\n\nReturn ONLY valid JSON.\n\nText:\n{{ $json.data }}"
}
]
}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "3fab478a-8021-4bb9-9333-76068ddc777e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1744,
32
],
"parameters": {
"width": 864,
"height": 624,
"content": "# AI Purchase Order Data Extraction (PDF/Image \u2192 Excel)\n\n## Overview\n\nThis workflow automatically extracts structured data from Purchase Orders using OCR and AI.\n\nSupported formats:\n\u2022 PDF\n\u2022 Scanned PDF\n\u2022 JPG\n\u2022 PNG\n\nExtracted fields:\n\u2022 Purchase Order Number\n\u2022 Vendor Name\n\u2022 Order Date\n\u2022 Delivery Date\n\u2022 Currency\n\u2022 Total Amount\n\u2022 Line Items\n\nThe extracted data is exported into Excel for further processing, reporting, or ERP integration."
},
"typeVersion": 1
},
{
"id": "31ad1697-777b-432a-ac36-d1893b211cb0",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1744,
672
],
"parameters": {
"width": 864,
"height": 464,
"content": "# Setup\n\nBefore running this workflow:\n\n1. Configure your AI provider credentials\n - OpenAI\n - Azure OpenAI\n - Compatible LLM provider\n\n2. Configure your OCR provider\n - OCR.space\n - Google Vision\n - Azure OCR\n - Tesseract\n\n3. Configure Excel output destination\n\n4. Upload a sample Purchase Order document for testing."
},
"typeVersion": 1
},
{
"id": "760956cd-9721-4a59-9af4-2aea6afef06f",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
32,
80
],
"parameters": {
"color": 5,
"width": 1088,
"height": 624,
"content": "# OCR Processing\n\nThis section extracts text from PDF and image files.\n\nThe OCR service converts scanned or image-based Purchase Orders into machine-readable text that can be analyzed by AI.\n\nOutput:\n\u2022 Raw text content\n\u2022 OCR result for downstream processing"
},
"typeVersion": 1
},
{
"id": "18e28a0d-eee6-4e95-b132-6b55b94d1ecc",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
-48
],
"parameters": {
"color": 5,
"width": 544,
"height": 640,
"content": "# AI Data Extraction\n\nThe AI model analyzes OCR text and converts it into structured data.\n\nExtracted information:\n\u2022 PO Number\n\u2022 Vendor Details\n\u2022 Order Dates\n\u2022 Currency\n\u2022 Total Amount\n\nLine items:\n\u2022 Description\n\u2022 Quantity\n\u2022 Unit Price\n\u2022 Total Price\n\nOutput format:\nStructured JSON"
},
"typeVersion": 1
},
{
"id": "c2af0225-32db-46ac-9836-88919865ba76",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1712,
32
],
"parameters": {
"color": 5,
"width": 624,
"height": 672,
"content": "# Data Validation & Transformation\n\nThis section standardizes extracted values.\n\nTasks:\n\u2022 Date formatting\n\u2022 Currency normalization\n\u2022 Missing field handling\n\u2022 JSON restructuring\n\nThis ensures consistent output across different Purchase Order layouts."
},
"typeVersion": 1
},
{
"id": "2d9709fd-47dc-42b7-b197-41ae73819f8b",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2352,
-48
],
"parameters": {
"color": 5,
"width": 464,
"height": 528,
"content": "# Excel Export\n\nThe structured Purchase Order data is exported to Excel.\n\nTypical use cases:\n\u2022 ERP imports\n\u2022 Procurement tracking\n\u2022 Financial reporting\n\u2022 Data archiving\n\nBenefits:\n\u2022 Reduce manual entry\n\u2022 Improve accuracy\n\u2022 Save processing time"
},
"typeVersion": 1
},
{
"id": "79a18c1a-a78a-4f5d-af58-7f082bc796ad",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1744,
1152
],
"parameters": {
"color": 3,
"width": 464,
"height": 336,
"content": "# Customization\n\nYou can customize this workflow to:\n\n\u2022 Save data into Google Sheets\n\u2022 Store files in Google Drive\n\u2022 Send approval requests\n\u2022 Push data into ERP systems\n\u2022 Trigger notifications via Slack or Email\n\nThe AI prompt can also be adjusted to extract additional Purchase Order fields."
},
"typeVersion": 1
},
{
"id": "e9407dc9-1279-4e3d-aaad-b2396231dcf7",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1264,
1152
],
"parameters": {
"color": 2,
"width": 384,
"height": 336,
"content": "# Troubleshooting\n\nNo data extracted:\n\u2022 Verify OCR output contains readable text.\n\u2022 Check document quality.\n\nMissing fields:\n\u2022 Adjust AI prompt instructions.\n\u2022 Test with additional sample documents.\n\nExcel export failed:\n\u2022 Verify output file permissions.\n\u2022 Check destination configuration."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "ed836f0d-43b8-4188-bdc1-9af59a8ee150",
"connections": {
"Get PDF": {
"main": [
[
{
"node": "Extract PDF Text",
"type": "main",
"index": 0
}
]
]
},
"Get Image": {
"main": [
[
{
"node": "Extract Text from Image (OCR)",
"type": "main",
"index": 0
}
]
]
},
"Mapping PDF": {
"main": [
[
{
"node": "Get PDF",
"type": "main",
"index": 0
}
]
]
},
"Mapping Image": {
"main": [
[
{
"node": "Get Image",
"type": "main",
"index": 0
}
]
]
},
"Clean OCR Text": {
"main": [
[
{
"node": "Prepare Image Data",
"type": "main",
"index": 0
}
]
]
},
"Clean PDF Text": {
"main": [
[
{
"node": "Prepare PDF Data",
"type": "main",
"index": 0
}
]
]
},
"Detect File Type": {
"main": [
[
{
"node": "Route by File Type",
"type": "main",
"index": 0
}
]
]
},
"Extract PDF Text": {
"main": [
[
{
"node": "Clean PDF Text",
"type": "main",
"index": 0
}
]
]
},
"Prepare PDF Data": {
"main": [
[
{
"node": "Extract Structured Data (AI)",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Detect File Type",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Response": {
"main": [
[
{
"node": "Validate Extracted Data",
"type": "main",
"index": 0
}
]
]
},
"Prepare Image Data": {
"main": [
[
{
"node": "Extract Structured Data (AI)",
"type": "main",
"index": 0
}
]
]
},
"Route by File Type": {
"main": [
[
{
"node": "Mapping PDF",
"type": "main",
"index": 0
},
{
"node": "Notifikasi file sedang diproses",
"type": "main",
"index": 0
}
],
[
{
"node": "Mapping Image",
"type": "main",
"index": 0
},
{
"node": "Notifikasi file sedang diproses",
"type": "main",
"index": 0
}
],
[
{
"node": "Notifikasi file invalid",
"type": "main",
"index": 0
}
]
]
},
"Save Data to Excel": {
"main": [
[
{
"node": "Send Success Notification",
"type": "main",
"index": 0
}
]
]
},
"Check Data Validity": {
"main": [
[
{
"node": "Format Data for Excel",
"type": "main",
"index": 0
}
],
[
{
"node": "Send Invalid Data Notification",
"type": "main",
"index": 0
}
]
]
},
"Format Data for Excel": {
"main": [
[
{
"node": "Save Data to Excel",
"type": "main",
"index": 0
}
]
]
},
"Validate Extracted Data": {
"main": [
[
{
"node": "Check Data Validity",
"type": "main",
"index": 0
}
]
]
},
"Extract Structured Data (AI)": {
"main": [
[
{
"node": "Parse AI Response",
"type": "main",
"index": 0
}
]
]
},
"Extract Text from Image (OCR)": {
"main": [
[
{
"node": "Clean OCR Text",
"type": "main",
"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.
googlePalmApimicrosoftExcelOAuth2ApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow accepts purchase order PDFs or images via Telegram, extracts text using PDF parsing or Tesseract OCR, uses Google Gemini to convert the text into structured JSON, validates key fields, and appends the results to a Microsoft Excel table in OneDrive, then notifies…
Source: https://n8n.io/workflows/16172/ — 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.
This workflow automatically extracts structured data from invoices sent via Telegram (PDF or image) and saves it to Excel. A user sends an invoice (PDF or image) to a Telegram bot The workflow detects
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 35 nodes.
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 35 nodes.
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 35 nodes.
automation_financial_recording. Uses telegramTrigger, telegram, googleGemini, lmChatGoogleGemini. Event-driven trigger; 29 nodes.