惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
月光博客
月光博客
腾讯CDC
Engineering at Meta
Engineering at Meta
博客园 - Franky
Vercel News
Vercel News
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
GbyAI
GbyAI
B
Blog
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
How to Automate Expense Reimbursement with n8n and Receip...
vernonroque · 2026-05-18 · via DEV Community

vernonroque

Target keywords: n8n receipt automation, automate expense reimbursement workflow, n8n HTTP node API
Platform: dev.to (primary) + n8n Community Discord #showcase + Hashnode (cross-post)
Word count target: 1,200–1,500 words
Meta title (60 chars): Automate Expense Reimbursement with n8n + Receipt API
Meta description (155 chars): Build an n8n workflow that parses receipt images, extracts structured data, and routes them for approval — no code required. Step-by-step tutorial.


The API powering this workflow — try it before you build:
👉 ilovesreceipt.com
Upload any receipt and see the structured JSON output in seconds.


What We're Building

An n8n workflow that:

  1. Triggers when a receipt image is submitted (email attachment, Google Drive upload, or webhook)
  2. Parses the receipt using the Receipt Parser API → returns structured JSON
  3. Routes based on amount: auto-approves small expenses, flags large ones for manager review
  4. Logs every expense to a Google Sheet
  5. Notifies the submitter via Slack or email with the parsed details

No code required. Pure n8n nodes.


Prerequisites

  • n8n instance (cloud or self-hosted — n8n.io)
  • Receipt Parser API key from ilovesreceipt.com (free tier: 500 calls/month)
  • Google account (for Sheets logging)
  • Optional: Slack workspace for notifications

Workflow Overview

[Trigger] → [HTTP Request: Parse Receipt] → [IF: Amount > $50?]
                                                 ├── YES → [Slack: Flag for Review]
                                                 └── NO  → [Google Sheets: Log Expense]
                                                                    ↓
                                               [Gmail/Slack: Notify Submitter]

Enter fullscreen mode Exit fullscreen mode


Step 1: Set Up the Trigger

Choose your entry point based on how employees submit receipts:

Option A — Webhook (most flexible):
Add a Webhook node. Set method to POST. This lets you trigger the workflow from any tool (form, mobile app, Zapier) that can send a webhook.

Option B — Gmail (receipts by email):
Add a Gmail Trigger node. Filter by subject containing "receipt" or "reimbursement". The workflow fires each time a matching email arrives with an attachment.

Option C — Google Drive:
Add a Google Drive Trigger node. Watch a specific folder (e.g., /Receipts/Pending). Fires when any new file is uploaded.

For this tutorial we'll use the Webhook option since it's the most reusable.


Step 2: Read the File

No conversion needed. The Receipt Parser API accepts the raw file directly as multipart/form-data — no base64 encoding required.

If your trigger provides a URL (e.g. a Google Drive file URL), add an HTTP Request node set to GET to download the binary first. If your trigger provides a binary attachment directly (e.g. Gmail attachment), pipe it straight into Step 3.


Step 3: Call the Receipt Parser API

Add an HTTP Request node with these settings:

Field Value
Method POST
URL https://web-production-58295.up.railway.app/api/parse
Authentication Header Auth
Header name Authorization
Header value Bearer {{ $credentials.receiptParserKey }}
Body Content Type Form Data (multipart)
Body field name file
Body field value (binary data from previous node)

Tip: Store your API key in n8n Credentials as a Generic Credential with AuthorizationBearer YOUR_KEY. This keeps it secure and reusable across workflows. Get your free key at ilovesreceipt.com — 500 calls/month, no credit card required.

After this node runs, you'll have the full parsed JSON available in subsequent nodes as $json.data.merchant.name, $json.data.total, etc.


Step 4: Add Routing Logic (IF Node)

Add an IF node to route based on the expense amount:

Condition:

{{ $json.data.total }} > 50

Enter fullscreen mode Exit fullscreen mode

  • True branch → flag for manager review (high expense)
  • False branch → auto-approve and log

You can layer additional conditions:

  • Category-based routing (meals vs. travel vs. supplies)
  • Merchant allowlist/blocklist
  • Employee-specific thresholds

Step 5: Log to Google Sheets

On the False (auto-approved) branch, add a Google Sheets node:

  • Operation: Append Row
  • Spreadsheet: your expense log sheet
  • Sheet: Expenses

Map these columns:

Column Value
Date {{ $json.data.date }}
Merchant {{ $json.data.merchant.name }}
Total {{ $json.data.total }}
Tax {{ $json.data.tax }}
Tip {{ $json.data.tip }}
Payment {{ $json.data.payment_method }}
Status Auto-Approved
Submitted {{ $now }}

Step 6: Flag for Manager Review (Slack)

On the True (high expense) branch, add a Slack node:

  • Operation: Send Message
  • Channel: #expense-approvals
  • Message:
🧾 *Expense Approval Required*

*Merchant:* {{ $json.data.merchant.name }}
*Amount:* ${{ $json.data.total }}
*Date:* {{ $json.data.date }}
*Payment:* {{ $json.data.payment_method }}

React ✅ to approve or ❌ to reject.

Enter fullscreen mode Exit fullscreen mode


Step 7: Notify the Submitter

On both branches, add a Gmail or Slack node to confirm receipt:

Hi there  your expense was received and parsed successfully.

Merchant: {{ $json.data.merchant.name }}
Date: {{ $json.data.date }}
Total: ${{ $json.data.total }}

{{ $json.data.total > 50 ? "Your expense has been flagged for manager review." : "Your expense has been auto-approved and logged." }}

Enter fullscreen mode Exit fullscreen mode


The Complete Workflow (JSON Import)

You can import this workflow directly into n8n. Copy the JSON below and use File → Import from JSON in n8n:

Download workflow JSON(link to GitHub gist with the workflow JSON)


Testing the Workflow

  1. Open the workflow in n8n
  2. Click Execute Workflow with test mode on
  3. Send a POST request to your webhook URL with a receipt image:
curl -X POST https://your-n8n-instance.com/webhook/receipt-parse \
  -F "data=@receipt.jpg"

Enter fullscreen mode Exit fullscreen mode

  1. Check your Google Sheet for the logged row and Slack for any approval notifications.

Going Further

  • Multi-currency support: The API detects currency — add a conversion step using an exchange rate API
  • PDF invoices: The API handles PDFs too — great for contractor invoices submitted via email attachment
  • Airtable instead of Sheets: Swap the Google Sheets node for an Airtable node for richer filtering
  • Approval loop: Use n8n's Wait node to pause the workflow until a Slack reaction is received

Try the API First

Before building the workflow, see what the parsed JSON looks like for your receipt types:

👉 Live Demo — no signup required

Ready to start building? Get your free API key at ilovesreceipt.com — 500 calls/month, no credit card required.


Built this workflow or have a question about a specific node? Share it in the comments — I'll help debug.