Workflow: N8N Financial Tracker Telegram Invoices to Notion with AI Summaries & Reports
Integrations: code, editImage, notion, quickChart, scheduleTrigger, splitOut, stickyNote, summarize, telegram, telegramTrigger

{"id": "3BkxvtCbF6hHGUgM", "meta": {"instanceId": "d847dccbed2cefba539a228a44c266869b59eafbd4f307c4928a1149fb542a9e", "templateCredsSetupCompleted": true}, "name": "N8N Financial Tracker Telegram Invoices to Notion with AI Summaries & Reports", "tags": [{"id": "OXcPKHaINFSvU1ux", "name": "Money", "createdAt": "2025-05-09T11:02:15.929Z", "updatedAt": "2025-05-09T11:02:15.929Z"}, {"id": "witgF3iHQ0sAlkjG", "name": "experimental", "createdAt": "2025-05-09T11:02:15.933Z", "updatedAt": "2025-05-09T11:02:15.933Z"}], "nodes": [{"id": "3792ae58-807f-4e83-a219-25c17c8b4048", "name": "Google Gemini Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini", "position": [680, 380], "parameters": {"options": {}, "modelName": "models/gemini-2.5-flash-preview-04-17"}, "credentials": {"googlePalmApi": {"id": "haEP6ehKtsSUjFmK", "name": "Google Gemini(PaLM) Api account"}}, "typeVersion": 1}, {"id": "943f87e2-a1ac-4f7e-999b-8ea261259e5a", "name": "Basic LLM Chain", "type": "@n8n/n8n-nodes-langchain.chainLlm", "position": [640, 220], "parameters": {"text": "=ini ada base64 invoice rangkumkan Pengeluaran dari invoice tersebut Nama Barang jumlah dan Pengeluaran masing masing barang dan total, outputnya jangan panjang panjang saya cukup berikan \n\ndate: DD-MM-YYYY ( Jika dari OCR tidak ada tanggal ambil tanggal hari ini )\nid:\nname:\n qty: \nprice:\n total:\ncategory:\ntax : (jika di total berbeda dengan item brati ada pajak nya hitungkan juga pajaknya masukan kesini)\n\nuntuk pilihan categorynya : Food & Beverage / Transportation / Utilities / Shopping / Healthcare / Entertaiment / Housing / Education\n\ndalam bentuk JSON array object, berikan juga key message summary untuk rangkuman, berikan rangkauman singkat total pengeluaran dan barang apa saja yang dibeli serta jumlah nya berikan juga pajaknya", "messages": {"messageValues": [{"type": "HumanMessagePromptTemplate", "messageType": "imageBinary"}]}, "promptType": "define", "hasOutputParser": true}, "typeVersion": 1.4}, {"id": "247b78cb-c3f6-4f31-8559-0fff70de9ba9", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [0, 0], "parameters": {"width": 1703, "height": 580, "content": "## Automated Financial Tracker: Telegram Invoices to Notion with AI Summaries & Reports\n"}, "typeVersion": 1}, {"id": "e20045c2-a8ef-43d6-b619-6825f605e183", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [0, 620], "parameters": {"color": 5, "width": 1706, "height": 527, "content": "## Schedule report to send on chanel or private message\n"}, "typeVersion": 1}, {"id": "ed8d6544-af9e-416a-b1f3-624ca108427f", "name": "Schedule Trigger | for send chart report", "type": "n8n-nodes-base.scheduleTrigger", "position": [80, 880], "parameters": {"rule": {"interval": [{}]}}, "typeVersion": 1.2}, {"id": "22ad7ea1-9404-48bd-9d0f-0c58b8b66e3d", "name": "Get Recent Data from Notions", "type": "n8n-nodes-base.notion", "position": [400, 940], "parameters": {"filters": {"conditions": [{"key": "Created time|created_time", "condition": "past_week"}]}, "options": {}, "resource": "databasePage", "operation": "getAll", "returnAll": true, "databaseId": {"__rl": true, "mode": "list", "value": "1d858554-d218-807c-936c-d06c8a8ec769", "cachedResultUrl": "https://www.notion.so/1d858554d218807c936cd06c8a8ec769", "cachedResultName": "Pengeluaran Rizqi Dini"}, "filterType": "manual"}, "credentials": {"notionApi": {"id": "AhjWhO7Jpc5x7xKG", "name": "Notion account"}}, "typeVersion": 2.2}, {"id": "34310645-52da-4f9c-96a2-0a01d0a640f9", "name": "Summarize Transaction Data", "type": "n8n-nodes-base.summarize", "position": [760, 920], "parameters": {"options": {}, "fieldsToSplitBy": "property_category", "fieldsToSummarize": {"values": [{"field": "property_total", "aggregation": "sum"}]}}, "typeVersion": 1}, {"id": "80a374cb-00cf-46b1-9505-709be1c550da", "name": "Generate Chart", "type": "n8n-nodes-base.quickChart", "position": [1200, 900], "parameters": {"data": "={{ $json.chart.data.datasets[0].data }}", "labelsMode": "array", "labelsArray": "={{ $json.chart.data.labels }}", "chartOptions": {}, "datasetOptions": {}}, "typeVersion": 1}, {"id": "6b7c67ee-b205-42f5-9441-eb2ecee4a503", "name": "Send Chart Image to Group or Private Chat", "type": "n8n-nodes-base.telegram", "position": [1460, 760], "webhookId": "66cce6e1-819c-487b-b8ad-3f02aebd40cb", "parameters": {"chatId": "-1001957001324", "operation": "sendPhoto", "binaryData": true, "additionalFields": {"fileName": "chart", "message_thread_id": 571}}, "credentials": {"telegramApi": {"id": "J8yRVYmsnH74HuaD", "name": "Telegram account"}}, "typeVersion": 1.2}, {"id": "06afd5ea-77b2-468d-b12b-1386d37a3ee6", "name": "Convert Data to JSON chart payload", "type": "n8n-nodes-base.code", "position": [1080, 900], "parameters": {"jsCode": "const labels = [];\nconst values = [];\n\nfor (const item of items) {\n  labels.push(item.json.property_category);\n  values.push(item.json.sum_property_total);\n}\n\nreturn [\n  {\n    json: {\n      chart: {\n        type: 'bar',\n        data: {\n          labels,\n          datasets: [\n            {\n              label: 'Spending by Category',\n              data: values,\n              backgroundColor: 'rgba(54, 162, 235, 0.6)',\n              borderColor: 'rgba(54, 162, 235, 1)',\n              borderWidth: 1\n            }\n          ]\n        },\n        options: {\n          plugins: {\n            title: {\n              display: true,\n              text: 'Spending Summary by Category'\n            }\n          },\n          scales: {\n            y: {\n              beginAtZero: true\n            }\n          }\n        }\n      }\n    }\n  }\n];"}, "typeVersion": 2}, {"id": "4ad8c9c9-fbec-46ce-943d-447ca687e031", "name": "Telegram Trigger | When recive photo", "type": "n8n-nodes-base.telegramTrigger", "position": [160, 160], "webhookId": "cac4ce91-ed1f-42ea-aebe-97ac3612aea6", "parameters": {"updates": ["message"], "additionalFields": {}}, "credentials": {"telegramApi": {"id": "J8yRVYmsnH74HuaD", "name": "Telegram account"}}, "typeVersion": 1.1}, {"id": "5231929f-2d7d-43ff-b9ae-141374926131", "name": "Get Image Info", "type": "n8n-nodes-base.editImage", "position": [460, 160], "parameters": {"operation": "information"}, "typeVersion": 1}, {"id": "c8dcc6a1-2367-4049-9a8b-d8a04299ee72", "name": "Parse To your object | Table", "type": "@n8n/n8n-nodes-langchain.outputParserStructured", "position": [1040, 460], "parameters": {"schemaType": "manual", "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"message\": {\n      \"type\": \"string\"\n    },\n    \"summary\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\"date\": { \"type\": \"date\" },\n          \"id\": { \"type\": \"integer\" },\n          \"name\": { \"type\": \"string\" },\n          \"qty\": { \"type\": \"integer\" },\n          \"price\": { \"type\": \"number\" },\n          \"tax\": { \"type\": \"number\" },\n          \"total\": { \"type\": \"number\" },\"category\": { \"type\": \"string\" }\n        },\n        \"required\": [\"id\", \"name\", \"qty\", \"price\", \"total\",\"category\"]\n      }\n    }\n  },\n  \"required\": [\"message\", \"summary\"]\n}\n"}, "typeVersion": 1.2}, {"id": "bc098a26-4e55-4908-880c-e5f27737a941", "name": "Split Out | data transaction", "type": "n8n-nodes-base.splitOut", "position": [1120, 40], "parameters": {"options": {}, "fieldToSplitOut": "output.summary"}, "typeVersion": 1}, {"id": "2a42bc4b-a5c7-433e-91e4-aa5531570f73", "name": "Sendback to chat and give summarize text", "type": "n8n-nodes-base.telegram", "position": [1480, 400], "webhookId": "f90475fa-69cd-4e19-bc93-bffdceae8324", "parameters": {"text": "={{ $json.output.message }}", "chatId": "={{ $('Telegram Trigger | When recive photo').item.json.message.chat.id }}", "additionalFields": {"appendAttribution": false}}, "credentials": {"telegramApi": {"id": "J8yRVYmsnH74HuaD", "name": "Telegram account"}}, "typeVersion": 1.2}, {"id": "bfc5c52e-313d-4257-bdfa-c542b687a853", "name": "Record To Notion Database", "type": "n8n-nodes-base.notion", "position": [1580, 120], "parameters": {"options": {}, "resource": "databasePage", "databaseId": {"__rl": true, "mode": "list", "value": "1d858554-d218-807c-936c-d06c8a8ec769", "cachedResultUrl": "https://www.notion.so/1d858554d218807c936cd06c8a8ec769", "cachedResultName": "Pengeluaran Rizqi Dini"}, "propertiesUi": {"propertyValues": [{"key": "Name|title", "title": "={{ $json.name }}"}, {"key": "Quantity|number", "numberValue": "={{ $json.qty }}"}, {"key": "Price|number", "numberValue": "={{ $json.price }}"}, {"key": "Total|number", "numberValue": "={{ $json.total }}"}, {"key": "Category|select", "selectValue": "={{ $json.category }}"}, {"key": "Date|rich_text", "textContent": "={{ $json.date }}"}, {"key": "Tax|number", "numberValue": "={{ $json.tax }}"}]}}, "credentials": {"notionApi": {"id": "AhjWhO7Jpc5x7xKG", "name": "Notion account"}}, "typeVersion": 2.2}, {"id": "f514554b-eb9e-47e2-ad6b-0b13036beaf4", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [40, 60], "parameters": {"color": 3, "width": 340, "height": 280, "content": "\ud83d\udcf8 INVOICE INPUT \ud83d\udcf8\nBot listens here for photos of your receipts/invoices.\nEnsure your Telegram Bot API token is set in credentials."}, "typeVersion": 1}, {"id": "53fc4c77-3f16-4cb8-82e8-f4810af1f569", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [600, 60], "parameters": {"color": 5, "width": 360, "height": 460, "content": "\ud83e\udd16 AI MAGIC HAPPENS HERE \ud83e\udde0\n- Image is sent to Google Gemini for data extraction.\n- Check 'Basic LLM Chain' to customize the AI prompt (e.g., categories, output format).\n- Requires Google Gemini API credentials."}, "typeVersion": 1}, {"id": "c6fb1193-7cc9-4f45-8a5f-20af41cdf3c8", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [980, 340], "parameters": {"color": 5, "width": 280, "height": 200, "content": "\u2728 STRUCTURING AI DATA \u2728\nConverts the AI's text output into a usable JSON object.\nCheck the schema if you modify the AI prompt significantly."}, "typeVersion": 1}, {"id": "79a4e9ba-d1ea-4cfc-870c-145bae80c9b4", "name": "Sticky Note5", "type": "n8n-nodes-base.stickyNote", "position": [1320, 0], "parameters": {"color": 2, "width": 380, "height": 240, "content": "\ud83d\udcdd SAVING TO NOTION \ud83d\udcdd\n- Extracted transaction data is saved here.\n- Configure with your Notion API key & Database ID.\n- Map fields correctly to your database columns!"}, "typeVersion": 1}, {"id": "9406306b-9f3d-4877-a888-1f5e16a431c1", "name": "Sticky Note6", "type": "n8n-nodes-base.stickyNote", "position": [20, 760], "parameters": {"height": 280, "content": "REPORTING SCHEDULE \ud83d\uddd3\ufe0f\nSet how often you want to receive your spending report (e.g., weekly, monthly)."}, "typeVersion": 1}, {"id": "1b6c8a28-b0f0-44fb-be02-21725d950716", "name": "Sticky Note7", "type": "n8n-nodes-base.stickyNote", "position": [320, 760], "parameters": {"color": 2, "width": 280, "height": 380, "content": "\ud83d\udcca FETCHING DATA FOR REPORT \ud83d\udcca\n- Retrieves transactions from Notion for the report period.\n- Default: \"Past Week\". Adjust filter as needed.\n- Requires Notion API credentials & Database ID."}, "typeVersion": 1}, {"id": "4612006e-04a9-4ad5-9f05-d49ec13f31cf", "name": "Sticky Note8", "type": "n8n-nodes-base.stickyNote", "position": [660, 740], "parameters": {"width": 320, "height": 360, "content": "\u2795 SUMMARIZING SPENDING \u2795\nAggregates your expenses, usually by category,\nto prepare for the chart."}, "typeVersion": 1}, {"id": "103132cf-37a6-455f-b19f-14d3e17af912", "name": "Sticky Note9", "type": "n8n-nodes-base.stickyNote", "position": [1040, 740], "parameters": {"width": 300, "height": 340, "content": "\ud83d\udcc8 GENERATING VISUAL REPORT \ud83d\udcc8\nCreates the actual chart image based on your spending data.\nYou can customize chart type (bar, pie, etc.) here."}, "typeVersion": 1}, {"id": "24324366-33e5-4097-ab36-aac31cef0006", "name": "Sticky Note10", "type": "n8n-nodes-base.stickyNote", "position": [1380, 640], "parameters": {"color": 6, "width": 300, "height": 300, "content": "\ud83d\udce4 SENDING REPORT TO TELEGRAM \ud83d\udce4\n- Delivers the generated chart to your chosen Telegram chat/group.\n- Set the correct Chat ID and Bot API token."}, "typeVersion": 1}, {"id": "e9fc1140-411b-411a-87a6-bbe9718ba3b3", "name": "Sticky Note11", "type": "n8n-nodes-base.stickyNote", "position": [1320, 280], "parameters": {"color": 6, "width": 300, "height": 280, "content": "\ud83d\udcac TRANSACTION SUMMARY \ud83d\udcac\nSends a confirmation message back to the user in Telegram\nwith a summary of the recorded expense."}, "typeVersion": 1}, {"id": "013fd587-3504-44b8-97e1-09cad47a0089", "name": "Sticky Note12", "type": "n8n-nodes-base.stickyNote", "position": [40, 360], "parameters": {"color": 7, "width": 460, "height": 240, "content": "  \ud83d\udd11 CREDENTIALS NEEDED \ud83d\udd11\n  Remember to set up API keys/tokens for:\n  - Telegram\n  - Google Gemini\n  - Notion\n\n  \ud83d\udca1 CUSTOMIZE ME! \ud83d\udca1\n  - Adjust AI prompts for better accuracy.\n  - Change Notion database structure.\n  - Modify report frequency and content.\n"}, "typeVersion": 1}, {"id": "8f6f0fdb-d3be-4464-a7db-ea4d642a4f55", "name": "Telegram", "type": "n8n-nodes-base.telegram", "position": [320, 160], "webhookId": "6e801e0b-72d1-42a9-ac47-61ac113a01d2", "parameters": {"fileId": "={{ $json.message.photo[3].file_id }}", "resource": "file"}, "credentials": {"telegramApi": {"id": "J8yRVYmsnH74HuaD", "name": "Telegram account"}}, "typeVersion": 1.2}], "active": true, "pinData": {}, "settings": {"executionOrder": "v1"}, "versionId": "a192c50c-4a77-44ee-b98a-f18d4ced2cb1", "connections": {"Telegram": {"main": [[{"node": "Get Image Info", "type": "main", "index": 0}]]}, "Generate Chart": {"main": [[{"node": "Send Chart Image to Group or Private Chat", "type": "main", "index": 0}]]}, "Get Image Info": {"main": [[{"node": "Basic LLM Chain", "type": "main", "index": 0}]]}, "Basic LLM Chain": {"main": [[{"node": "Split Out | data transaction", "type": "main", "index": 0}, {"node": "Sendback to chat and give summarize text", "type": "main", "index": 0}]]}, "Google Gemini Chat Model": {"ai_languageModel": [[{"node": "Basic LLM Chain", "type": "ai_languageModel", "index": 0}]]}, "Summarize Transaction Data": {"main": [[{"node": "Convert Data to JSON chart payload", "type": "main", "index": 0}]]}, "Get Recent Data from Notions": {"main": [[{"node": "Summarize Transaction Data", "type": "main", "index": 0}]]}, "Parse To your object | Table": {"ai_outputParser": [[{"node": "Basic LLM Chain", "type": "ai_outputParser", "index": 0}]]}, "Split Out | data transaction": {"main": [[{"node": "Record To Notion Database", "type": "main", "index": 0}]]}, "Convert Data to JSON chart payload": {"main": [[{"node": "Generate Chart", "type": "main", "index": 0}]]}, "Telegram Trigger | When recive photo": {"main": [[{"node": "Telegram", "type": "main", "index": 0}]]}, "Schedule Trigger | for send chart report": {"main": [[{"node": "Get Recent Data from Notions", "type": "main", "index": 0}]]}}}