Do you dread budget day? The stack of receipts on the counter, the cryptic scribbles, the tedious process of entering every last detail into a spreadsheet? I recently took on a project to build a solution to this exact problem: a completely automated workflow that turns a pile of physical receipts into a clean, organized budget spreadsheet. No manual data entry, no messy transcription. Just a fully automated, no-code solution powered by n8n, OCR, and AI. The end result is a working automated budget tracker and a clear takeaway: automation is a powerful accelerator, but it’s a partnership that still requires your guidance. In this post, I’ll walk you through the entire process of building this solution, from scanning the receipts to a final, organized spreadsheet.
The Problem & The Solution

Keeping a budget is a best practice, but maintaining it with physical receipts is anything but efficient. The solution? Build a personal “digital assistant” that automates the entire process. The workflow starts with Receipt Ingestion, where we simply drop a batch of receipt images into a designated Nextcloud folder. From there, Data Extraction takes over, using Azure Computer Vision to perform OCR on each image and pull out the raw, unstructured text. This is followed by Data Interpretation, where a Chat model acts as a brain, analyzing the text to identify the paid amount, store name, and a specific budget category. The structured output is then sent to a spreadsheet for Data Storage & Analysis, where it’s logged and used to run real-time budget statistics. Finally, n8n serves as the Workflow Orchestrator, tying every single step together and ensuring the process runs seamlessly from start to finish.
The n8n workflow
Capturing the Files
The workflow kicks off with a Schedule Trigger node, which starts a new batch process at a set interval, like every hour. This node tells the Nextcloud node to pull a list of all items from our designated receipts folder. The items are then sent to a Filter node, which performs a crucial check to ensure that only valid files—and not folders or already-processed receipts—are passed on. This ensures our workflow is robust and efficient. From there, a Loop node handles the cleaned batch, processing each file individually and starting the action to download the image.
The OCR

The Azure Computer Vision node is the workhorse of this workflow, performing Optical Character Recognition (OCR) on our images. Its role is to take the digital image of a receipt and extract every piece of printed text it can find. You’ll connect this node directly to the output of the Nextcloud node. In the node’s configuration, you’ll pass the binary data of the receipt image using an expression like {{ $json.data }}
. The output is a rich JSON object containing the extracted text, organized into lines with bounding box coordinates. This structured data is the raw material for our next step, where a chat model will analyze it to find the specific values we need.
The AI Node
An AI model is needed because OCR output is unstructured. While Azure Computer Vision can extract every word from the receipt, it doesn’t understand the context. It can’t tell the difference between a total amount, a subtotal, a tax line, or a random number in the receipt’s text. An AI model, on the other hand, can be prompted to read the entire text and identify specific pieces of information, such as the store name and the final paid amount, and even categorize the expense.
The prompt you’ll use is:
You are a helpful assistant that identifies key information from receipt text.
Take this input, which is a text generation from Azure's Computer Vision of a receipt: ```{{ JSON.stringify($json) }}```. Extract the store name, total amount paid, and guess the category of this receipt. Most receipts will be of Food type (which includes Groceries & Food Receipts). The paid amount should include the tax. The output should be in a JSON format and here is an example:{ "store": "My Supermarket", "
paid_amount": "25.45", "
paid_tax": "1.00""category": "Food" }
The Spreadsheet Node

The Google Sheets node is where all our parsed data finds its final home. You’ll connect this node directly after the AI chat model. To get it set up, you authenticate your Google account and specify the spreadsheet and sheet name you want to work with. The node is configured to Append Row, which means it will add a new row of data to the bottom of the sheet for every receipt it processes. Once connected, you’ll map the data from the AI’s JSON output to the correct columns in your spreadsheet. For example, to populate your “Store” column, you’ll enter the expression {{ $json.store }}
; for “Paid Amount,” you’ll use {{ $json.paid_amount }}
; and so on for “Paid Tax” and “Category.” This also enables the asynchronous nature of your budget statistics—while n8n logs the raw data, the spreadsheet itself is doing the heavy lifting with formulas to calculate totals, visualize trends, or perform other statistical analysis. This is where a completion flag column comes into play, which is crucial for the next step, as it tells n8n when a specific row is fully processed and ready to be moved on from.
My Future Enhancements
To improve the chat model’s accuracy, you can refine your prompt with specific examples. If the AI struggles with a certain store or receipt type, provide it with an example of the OCR text from that receipt and show it the correct JSON output you expect. This is a form of in-context learning that helps the model perform better. For error handling, it’s wise to add a Conditional node after the AI step. This node can check if the AI’s output contains an “unidentified” value for the store or amount. If it does, you can set up a parallel path that sends the problematic receipt to a different spreadsheet or a manual review folder, so it doesn’t get lost. Finally, you can add notifications to stay informed about your workflow’s status. For example, you can set up a notification that says, “Receipt processed successfully for [Store Name],” or a more urgent message like, “Error: Receipt could not be processed.”
It Works
The end result of our automated workflow is a budget spreadsheet that is organized. Instead of a messy receipts, you have a clean Google Sheet where each new row is a reflected transaction. Columns for Date, Store, Paid Amount, and Category are all automatically populated.
Building a robust, automated budget tracker was a welcome challenge. I wanted to solve the tedious problem of manual data entry, so I used n8n to build a no-code workflow. The solution I came up with seamlessly connects several services to handle everything from receipt ingestion to final data analysis.
The workflow begins with Nextcloud, which acts as our receipt inbox. I simply drop a batch of receipts into a folder, and the workflow kicks off. I used Azure Computer Vision for the OCR, which extracts the raw, unstructured text from the receipt images. The real brain of the operation is an AI chat model that takes this text and converts it into a clean, structured JSON object with the store name, paid amount, and a budget category. Finally, a Google Sheets node appends this structured data to my budget spreadsheet.
The result is a solution that takes the manual work out of budgeting. The AI handles the tricky part of interpreting the data, and the automation ensures my budget is always up to date. It was a great project that proved to me that the right tools can simplify even the most frustrating tasks. If you have a repetitive chore, I’d highly recommend you give n8n a try.