Hi everyone! ![]()
I’m a 20-year-old student from Indonesia who recently dove headfirst into workflow automation. Over the past two months, I’ve been building iNVOIZY—an end-to-end Accounts Payable (AP) and invoice processing workflow built on top of n8n.
Coming from a background with zero corporate finance experience, I started this project to solve a very real pain point I noticed in local SMBs and agencies: manual invoice re-typing, lost attachments, and hidden math typos.
I want to share how the architecture evolved from the initial v0.9 BETA to the recent v0.9.1 BETA Math Validation update.
The Origin: iNVOIZY v0.9 BETA (The Baseline)
In the initial release (v0.9), my goal was to automate the complete lifecycle of a vendor invoice, from arrival to approval:
1. Ingestion & Archive: Detects incoming PDF/JPG vendor invoices via Gmail triggers and backs them up automatically to Google Drive.
2. AI Data Extraction: Sends the documents to Gemini 3.6 Flash (Vision) via a structured sub-workflow to extract 10 critical invoice fields without manual data entry.
3. Threshold Routing: Automatically routes invoices based on amount thresholds—sending low-value items directly to Finance Admins and high-value items to Managers.
4. Interactive Telegram Approval: Approvers receive real-time alerts via a dedicated Telegram bot, where they can approve or reject with 1-tap buttons. Built with strict Chat ID security checks and double-click prevention locks.
5. Autonomous 24h Escalation: An automated cron schedule scans pending invoices daily (>24h idle), triggering reminders and escalating unaddressed items directly to the Business Owner after two attempts.
The Blindspot I Discovered
While testing v0.9, I realized a major flaw with OCR and AI extraction alone: AI is smart, but it doesn’t do strict arithmetic.
If a vendor sends a blurry scan where a digit is misread, or if the vendor made a calculation error on their own invoice, the system would extract the wrong subtotal and pass it straight to the manager unnoticed.
Passing wrong numbers to an approver defeats the entire purpose of automation.
What’s New in v0.9.1 BETA: The Math Validation Layer
To fix this, I just shipped v0.9.1 BETA, introducing a deterministic Math Validation Layer before any invoice ever reaches an approver:
Deterministic Cross-Field Audit: A custom JavaScript node now cross-checks Subtotal + Tax against Total Amount.
Tax-Scheme Awareness: Not all vendors format tax the same way. The workflow dynamically adjusts its audit logic based on whether the invoice uses an Inclusive or Exclusive tax scheme.
Flag Before Approval: If a mismatch is detected, the invoice is blocked instantly. It will never reach the approving manager.
1-Tap Telegram Correction Loop: Instead of failing silently, the Finance Admin receives a “Mismatch Alert” in Telegram with a direct link to the original document. They can reply directly in the chat with the corrected numbers, triggering an instant automatic re-validation.
Tech Stack & Architecture Summary:
Orchestration: n8n (Multi-path sub-workflows, Function/Code nodes, HTTP Requests)
Vision / AI Model: Google Gemini 3.6 Flash
Interface & Notifications: Telegram Bot API (Inline Keyboards & Callback Queries)
Database & Storage: Google Workspace (Sheets & Drive)
Video Demos & Screenshots:
Short Video Highlights: https://www.linkedin.com/in/sabil-hasan-10a5a4419?utm_source=share_via&utm_content=profile&utm_medium=member_ios
What I Learned & Looking for Feedback
Building this system entirely in n8n taught me that AI handles unstructured vision well, but deterministic code is necessary to enforce business math.
My next milestone (v1.0) is to implement 3-Way Purchase Order (PO) Matching and sync the output directly into cloud accounting software (like Xero / Jurnal).
As I am expanding my skills in workflow engineering, I would love to get feedback, critiques, or edge-case warnings from experienced n8n builders here!
Also, if any SMB or Agency in the community wants to test this setup, I’m offering a free 14-day pilot run.
Thanks for reading! Happy automating! ![]()