Jotform to Google Sheets, expense claims logged clean
Expense claims fall apart in the boring parts. Receipts go missing, totals get mistyped, and finance ends up chasing people for “just one more detail” when everyone’s already moved on.
If you run ops or finance, expense claim automation can feel like the difference between clean approvals and a weekly fire drill. HR/Admin teams see it too, because reimbursements turn into awkward back-and-forth. And employees? They just want to submit and be done.
This workflow takes a Jotform submission, saves receipts to Google Drive, extracts key invoice fields with AI, logs each expense to Google Sheets, and emails finance a clear summary you can approve faster.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Jotform to Google Sheets, expense claims logged clean
flowchart LR
subgraph sg0["Jotform Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Transform Output"]
n1@{ icon: "mdi:cog", form: "rounded", label: "Upload file", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Extract from File", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Transform invoice record"]
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Create HTML Email Template"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Handle multiple files"]
n8@{ icon: "mdi:brain", form: "rounded", label: "GPT", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Document Extractor", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jotform.dark.svg' width='40' height='40' /></div><br/>Jotform Trigger"]
n8 -.-> n10
n1 --> n4
n11 --> n7
n0 --> n6
n2 --> n10
n10 --> n0
n7 --> n1
n7 --> n2
n5 -.-> n10
n4 --> n3
n6 --> n9
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n11 trigger
class n5,n10 ai
class n8 aiModel
class n3 database
class n0,n4,n6,n7 code
classDef customIcon fill:none,stroke:none
class n0,n4,n6,n7,n11 customIcon
Why This Matters: Expense Claims Get Messy Fast
Manual expense processing rarely fails in a dramatic way. It fails quietly. Someone uploads three PDFs but forgets to label what they were for. A receipt photo is unreadable, so the “total” becomes a guess. Finance copies numbers into a spreadsheet, then later finds two receipts were for the same meal because the vendor names were typed differently. And when reimbursements slow down, people stop submitting on time, which makes the next cycle even worse. Honestly, it’s not the paperwork that hurts most. It’s the constant context switching and chasing.
The friction compounds. Here’s where it breaks down in real life.
- Finance spends about 5–10 minutes per receipt just to open files, read totals, and retype fields into a tracker.
- Employees get follow-up emails because dates, vendors, or tax amounts weren’t captured consistently.
- Receipts end up scattered across inboxes and chats, which makes audits and disputes a headache later.
- Approvals slow down because there’s no clean summary that ties trip context to the line items.
What You’ll Build: Jotform → Drive + Sheets + Finance Email
This workflow turns one form submission into a complete, finance-ready expense record. It starts when an employee submits your Jotform expense claim with trip details (name, department, dates, purpose) and uploads one or more receipt PDFs. Each file is saved into a specific Google Drive folder so you get clean record-keeping without anyone dragging files around. Then the workflow reads each PDF, runs it through an AI “DocClaim Assistant” (GPT-4o via an OpenAI chat model), and extracts the structured fields finance cares about, like vendor, invoice date, subtotal, tax, and total. Finally, it formats that data into a consistent structure, appends rows into Google Sheets (one row per receipt), and emails finance a neat HTML summary so approvals don’t require detective work.
The workflow begins with a Jotform submission and splits out each uploaded receipt so they can be processed one-by-one. AI extracts and standardizes invoice fields, then two paths run in parallel. Google Sheets becomes the central log, and a formatted email gives finance a quick decision-ready view.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say an employee submits a trip claim with 8 receipt PDFs. Manually, finance often spends maybe 7 minutes per receipt (open file, find total, copy fields), plus about 10 minutes to write a summary email, which lands around an hour. With this workflow, the employee submits once (about 5 minutes), receipts save to Drive instantly, and AI extraction runs in the background (often 2–5 minutes total). Finance gets a clean email and a Sheet already populated, so review becomes the main task, not data entry.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Jotform to collect trip details and uploads.
- Google Drive for storing receipt PDFs in one place.
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, set folder/sheet targets, and tweak a prompt or two for your receipt formats.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A Jotform submission kicks everything off. The trigger fires when the employee submits the expense claim form, including trip details and one or more uploaded PDFs.
Receipts get split and stored. If multiple files were uploaded, the workflow separates them so each PDF can be handled independently, then uploads each one into your chosen Google Drive folder.
AI reads the PDFs and standardizes the fields. n8n extracts the PDF content, sends it to the AI agent backed by the OpenAI chat model, and uses a structured output parser so the result looks like the same JSON every time.
Two outputs happen in parallel. One path maps the receipt fields into a Google Sheets row (vendor, date, totals, and whatever else you choose). The other path builds a polished HTML summary and emails finance via Gmail/SMTP so they can approve quickly.
You can easily modify the extracted fields and email formatting to match your finance policy. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Submission Trigger
Set up the incoming JotForm submission that kicks off the expense claim flow.
- Add and open Form Submission Trigger.
- Set Form to
[YOUR_ID]. - Credential Required: Connect your jotFormApi credentials.
- Save the trigger and leave it ready to receive a test submission.
Step 2: Connect Google Drive and Google Sheets
Store uploaded receipts in Drive and log claim metadata into Sheets.
- Open Upload Receipt File and set Name to
=invoice-{{ $now.toFormat("yyyyLLdd-HHmmss") }}-{{$binary.data.fileName}}. - In Upload Receipt File, select the Folder with
[YOUR_ID]. - Open Append Sheet Entry and confirm Operation is
append. - Set Document to
[YOUR_ID]and Sheet togid=0. - Keep Columns set to auto-map so the incoming fields map to
EmployeeName,Department,TripPurpose,FromDate,ToDate,FileName,DownloadURL,Size, andSubmittedAt.
Step 3: Set Up Receipt Processing and AI Extraction
Split multiple receipt files, extract PDF text, and parse structured invoice data via the AI agent.
- Open Split Receipt Binaries and keep the provided JavaScript Code to split files where the binary key starts with
Receipts___Invoices_. - Ensure Split Receipt Binaries outputs to both Upload Receipt File and Parse PDF Content in parallel.
- In Parse PDF Content, set Operation to
pdfto extract text from each receipt. - Open Invoice Data Extractor and keep Text set to
=Extract all relevant information from thisreceipt or invoice below: --- {{ $json.text }} --- I need the output in a structured format suitable for generating a business expense claim report. Include fields like vendor name, invoice or receipt number, date, total amount, tax, payment method, currency, and item descriptions.. - Confirm Structured Parse Output is attached to Invoice Data Extractor and contains the JSON schema example.
- Credential Required: Connect your openAiApi credentials in OpenAI Chat Model. Structured Parse Output is a sub-node; credentials are added to OpenAI Chat Model, not the parser.
Step 4: Configure Claim Assembly and Email Output
Build the claim payload, render the HTML summary, and email the final report.
- In Assemble Claim Data, keep the JavaScript that compiles
employeeandexpensesfrom the parsed output. - In Build HTML Summary, keep the HTML template generator so it outputs
{ html }for email. - Open Dispatch Email Notice and set Message to
={{ $json.html }}. - Set Subject to
=Expense Claim Request - {{ $('Assemble Claim Data').item.json.employee.name }} – {{ $('Assemble Claim Data').item.json.employee.department }} - {{ $('Assemble Claim Data').item.json.employee.tripPurpose }}. - Credential Required: Connect your gmailOAuth2 credentials in Dispatch Email Notice.
html and that the connection from Assemble Claim Data is intact.Step 5: Test and Activate Your Workflow
Run a full test to confirm receipt uploads, sheet entries, AI parsing, and email delivery.
- Click Execute Workflow and submit a JotForm entry with one or more receipt PDFs.
- Verify that Upload Receipt File creates files in Drive and Append Sheet Entry appends a new row.
- Check that Invoice Data Extractor outputs structured JSON and that Assemble Claim Data aggregates all expenses.
- Confirm Dispatch Email Notice sends a formatted email with the HTML summary.
- When everything is correct, toggle the workflow to Active for production use.
Troubleshooting Tips
- Google Drive credentials can expire or need specific permissions. If things break, check the connected Google account scopes and the target folder access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
About 30–60 minutes if your form, folder, and sheet are ready.
No. You will connect accounts and adjust a few mapping fields in n8n.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs, which are usually a few cents per receipt depending on model and document size.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. You can adjust the “Map Invoice Row” and “Append Sheet Entry” parts to match your columns, and tweak the AI agent’s extraction prompt to capture extra fields like expense category, cost center, or project code. Common changes include routing high-value claims for manager approval, adding validation rules (like a max nightly hotel rate), and attaching the original PDFs to the finance email.
Usually it’s permissions. Confirm the connected Google account can write to the target folder, then re-authenticate the Google Drive credential in n8n if it’s stale. Also check that the folder ID hasn’t changed (shared drives and moved folders can bite you). If the upload works sometimes and fails in bursts, you may be hitting Google API limits during high-volume submissions.
A typical setup can handle dozens of receipts per day without drama. On n8n Cloud, your limit is driven by your plan’s monthly executions; self-hosting has no execution cap, but your server resources matter. The slow part is usually AI document extraction, so if you expect large batches (like end-of-month travel dumps), run it on a schedule or increase concurrency carefully.
Often, yes. This workflow benefits from multi-step logic (split multiple receipts, parse each document, normalize outputs, then write to Sheets and email finance), which is where n8n tends to stay simpler and more cost-predictable. You also get a self-hosting option, so high volumes don’t force you into expensive task-based pricing. Zapier or Make can still be fine for basic “form to sheet” logging, especially if you’re not doing AI extraction. But once you add document parsing and structured output requirements, n8n is usually the cleaner fit. If you want help choosing, Talk to an automation expert.
Once this is running, expense claims stop being a weekly cleanup project. The workflow handles the repetitive parts so finance can focus on approvals, not chasing receipts.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.