Remember my friend “Mike”? The duplicate invoice detector I shared previously saved his company so much hassle that he asked for help with their approval process. It was a mess: 4 back-and-forth emails and a manual spreadsheet update for every single invoice.
I wanted to learn Slack interactivity in n8n, so I built a two-part workflow to turn this into a single Slack button click.
The Solution
Workflow 1: Invoice → Slack Approval Request
Upload an invoice (form, email, photo)
AI extracts supplier, amount, date, and invoice number via easybits’ Extractor
Assigns an approval tier based on amount ( Standard, Medium, High)
Posts a rich Slack message with the details and three buttons: Approve, Reject, Flag
Workflow 2: Approval Handler (Slack Listener)
Listens for button clicks from Slack
Parses who clicked what
Routes to the right Google Sheet tab (Approved / Rejected / Flagged)
Sends a confirmation DM to the approver
The Biggest Learning: Why Two Workflows?
n8n doesn’t like multiple triggers in one workflow. I originally tried to have the form trigger AND the Slack webhook in the same workflow. It kept breaking – triggers would conflict and webhooks wouldn’t register.
The fix? Split them. One workflow sends the message, another listens for the response. The button click itself carries all the invoice data back to the webhook. Plan for two workflows from the start to save yourself the headache!
The Workflows
I’ve attached both workflow JSONs below. You’ll need:
Happy to answer questions about the Slack setup – that part definitely took some trial and error. Would love to hear if anyone else has built approval flows and how you handled the multi-trigger problem.
The two-workflow split for this kind of approval flow makes total sense — the multi-trigger problem in n8n is real and splitting send vs. listener is the right call. One thing i’ve found useful: pack all the invoice context into the Slack button’s value as a JSON string, so Workflow 2 gets everything it needs from the click without re-fetching. solid implementation.
Hey, thank you for the kind words! That’s actually how I set it up in this case as well. The “Parse Payload” node in the second workflow pulls all the invoice data from the button click, so nothing gets lost along the way.
Splitting this into two workflows was definitely a learning experience, but since I’ll likely need this pattern again in the future, it was great to explore it in a smaller example first.
Nice — having all the invoice data embedded in the button payload means Workflow 2 stays fully self-contained, no external lookups needed. And once you have that split pattern wired up it’s pretty much a template: same trigger/handler structure applies to any async approval flow with minimal changes.
Nice workflow Felix! The two-workflow split makes sense - fought that trigger conflict before too.
Curious about easybits Extractor - how’s it handle messy invoices? Like scanned receipts, handwriting, tilted images? That’s usually where extraction falls apart.
Hey @Truong , thank you! And yes, that double-trigger issue was definitely a tough nut to crack.
Regarding the Extractor: it handles messy invoices (different formats, poor scans, even tilted images) really well because it understands context. While some tools still rely on bounding boxes to locate data points, this approach focuses on understanding the document and extracting the relevant information directly. Another great feature is that you can define a description/prompt for each data point, which makes it much easier to achieve high accuracy.
In terms of speed, the invoice processing in the workflows I shared averages around 2-3 seconds.
I’d definitely recommend giving it a try – it also offers a free tier with up to 50 API requests per month.
yeh, appreciate the detailed response! The context-understanding approach sounds solid, especially with the per-field prompting.
I’ve been using PDF Vector for similar stuff - mostly invoice processing for small business clients. The AI context reading vs template matching was a game changer for me. Had a client with suppliers who sent invoices in like 5 different formats. Old OCR approach would’ve needed templates for each one. AI just… figured it out.