Connect ExpenseBot to Zapier

Upload receipts, run Gmail scans, and build expense reports from inside a Zap — with the field mappings and outcome routing that decide whether it actually works.

60-day free trial · No credit card · Sign in with Google

Quick answer: How do I connect ExpenseBot to Zapier?

ExpenseBot has a native app in the Zapier App Directory. Add ExpenseBot to a Zap and sign in through ExpenseBot’s consent screen — it uses OAuth, so there are no API keys to copy. The core receipt workflow is five steps: a trigger that produces a file, the Upload Receipt action, a Delay, Get Receipt Processing Result, then Paths that route anything uncertain to a human. You need an ExpenseBot account with its Google Sheet connected first.

The Leg You’re Assembling

Nobody arrives at a Zapier integration page wanting an expense app. They arrive holding a pipeline they are building out of parts — capture, maintain, report, hand off, bill — and a gap where the receipts should be. This page is about that gap.

ExpenseBot is a receipt and expense tracking app that reads receipts from Gmail, photos, and PDFs, extracts the merchant, date, amount, tax and currency, checks them against what is already recorded, and keeps the result in a Google Sheet you own. In a Zapier pipeline it is the receipts-to-ledger leg: files go in from whatever your upstream steps produce, and structured, reviewable expense rows come out the other side, in a spreadsheet that stays yours whether or not you keep paying for ExpenseBot.

What it is not is the whole pipeline. Downstream accounting platforms remain the accounting source of truth, and this page is honest about where the boundary sits — see what this does not do before you design around it. If you are mapping the wider chain rather than just this link, the accounting automation hub covers how the legs fit together.

Two Ways to Connect, and Which One You Want

There are two genuinely different routes, and picking the wrong one costs an afternoon.

The native ExpenseBot app — use this for a normal Zap

Listed in the Zapier App Directory as ExpenseBot, under Accounting, currently carrying a Beta status badge. The triggers, actions, and searches described on this page are the ones you will find there. Everything below assumes this route.

The Zapier MCP Client (beta) — use this for an agentic step

A separate route that points a Zap at ExpenseBot’s broader MCP toolset over a custom MCP connection. Worth it when you want a step to choose among allowed tools rather than run a fixed sequence. It is Zapier’s beta surface, so treat it accordingly and verify a read-only request before building on it. Setup lives on the MCP page, and MCP connectors explains the category.

Before You Build: What the Connection Needs

Four prerequisites. Skipping any of them produces a Zap that authenticates fine and then fails at the step that matters.

  • An ExpenseBot account with its Google Sheet connected. The connection writes into your sheet; if there is no sheet, there is nowhere for a receipt to land.
  • Sign-in through ExpenseBot’s consent screen. Authentication is OAuth 2.0 with PKCE. Zapier obtains and refreshes tokens itself — you never create an API key or paste a client secret. The connection carries scopes for reading and writing expenses, starting Gmail scans, and reading and creating reports.
  • Gmail connected inside ExpenseBot, before any scan action. The Start Gmail Receipt Scan action uses the Gmail access you authorized in ExpenseBot. It does not grant that access itself, and it cannot scan an account ExpenseBot has never seen.
  • A stable event ID from your trigger, for every data-creating action. This is the one people skip. See duplicates and safe retries for why it is not optional.

The Receipt Zap, Step by Step

This is the workflow most people are here for: a file appears somewhere, and an expense row should exist a minute later. Five steps.

  1. Start with a trigger that produces a file. A new attachment in Gmail, a new file in a Drive folder, a form upload, a Slack file — anything whose output includes the real file. The trigger also has to give you a stable unique ID for the event; you will need it in the next step.
  2. Add the Upload Receipt action. Map the file into Receipt File, the original name into File Name, and the true type into MIME Type. Map the trigger's stable unique ID into Source Event ID. Optionally select an existing client, project, or trip group. The action returns a Submission ID.
  3. Add a Delay. Extraction is not instant. A short delay before you ask for the result is the difference between a Zap that reports the truth and one that reports 'still processing' as a failure.
  4. Add Get Receipt Processing Result. Map the exact Submission ID returned by Upload Receipt — not the Source Event ID. Read Terminal Result Found: while it is false, the submission has not finished and you should wait and check again.
  5. Route the outcome with Paths or a Filter. Added continues the workflow. Duplicate means ExpenseBot recognized the receipt and did not write it twice — continue, or notify. Skipped and failed go to the Review Expenses URL the step returns, where a human decides.

The Delay and the result check are what separate this from a Zap that looks green and quietly loses receipts. Upload Receipt returns as soon as the file is queued, not when it has been read. Treat the upload as complete only when Get Receipt Processing Result reports Terminal Result Found as true.

The Mappings That Decide Whether It Works

Nearly every broken receipt Zap is one of five mapping mistakes. In order of how often they happen:

FieldMap thisNot this
Receipt FileThe actual file object from the trigger, or a directly downloadable file URL.A link to a preview or sharing page, or the attachment’s name.
File NameThe original file name including its extension — receipt.heic, invoice.pdf.A name with the extension stripped, or a generated label.
MIME TypeThe true type from the source step: image/jpeg, image/heic, image/png, application/pdf.A guess, or one type hardcoded for a trigger that produces several.
Client, Project, or Trip GroupA group that already exists in ExpenseBot, selected from the dropdown.A new name typed in hoping it will be created — the action never creates groups.
Submission IDThe exact Submission ID returned by the Upload Receipt step.The Source Event ID, the file name, or a timestamp. They are different values.

Dates follow the same discipline everywhere in the connection. Calendar dates are strict YYYY-MM-DD, ranges are inclusive and need both ends, and the end must fall on or after the start. Ambiguous or reversed dates are rejected rather than guessed at.

Reading the Outcome Instead of Assuming It

Get Receipt Processing Result returns a verdict, not just a success flag. Four outcomes, three different things you should do:

OutcomeWhat it meansWhat the Zap should do
AddedThe receipt was read and written as an expense row.Continue — notify, tag, post to Slack, whatever is next.
DuplicateExpenseBot recognized it against an existing expense and did not write it twice.Continue, or notify that it was recognized. This is a success, not an error.
Skipped or failedThe file could not be turned into a confident expense — unreadable, not a receipt, or missing something required.Route to the Review Expenses URL the step returns and let a person decide.

For a batch upload, the step also returns per-file counts — submitted, added, duplicates, skipped, errors — alongside per-file outcomes, so a Zap handling several receipts at once can route each one rather than collapsing the batch into a single pass-or-fail. Treating “not added” as a hard failure is the most common way a working integration ends up looking broken.

Duplicates and Safe Retries

Zapier retries. Triggers re-fire, autoreplay runs, someone turns a Zap off and on. Without a guard, each of those becomes a duplicate expense in a financial record, which is far more annoying to clean up than to prevent.

Every data-creating ExpenseBot action takes a Source Event ID. Map the trigger’s stable unique identifier — the Gmail message ID, the Drive file ID, the form submission ID — and never a timestamp or a random value. Replaying the same Source Event ID for the same operation returns Safe Retry Replayedinstead of creating a second record. Reusing the same ID with conflicting data is rejected rather than silently merged, so a mis-mapped ID surfaces as an error instead of corrupting the ledger.

Everything You Can Build With

ExpenseBot exposes triggers, actions, and searches to Zapier, covering receipt capture, reviewed manual entry, Gmail scanning, lookups, and reporting.

Triggers — start a Zap from ExpenseBot

  • New Expense — fires when a recent expense appears, returning its identity, amounts, category, group, Notes, and review link.
  • New Report — fires when a recent expense report appears, with its status, totals, and report link.

Both are polling triggers, so they are the right tool for reacting to activity, and the wrong tool for exporting a large historical ledger. Use a report for that.

Actions — write into ExpenseBot

  • Upload Receipt — sends a JPEG, PNG, HEIC, or PDF for extraction and returns a Submission ID.
  • Create Expense — records a reviewed cash or card expense with merchant, total, date, category, and optional tax, tip, and currency.
  • Add Mileage Entry — records reviewed one-way or round-trip business mileage at the account’s configured rate.
  • Add Income Entry — records reviewed income with source, payment method, category, and optional fees and tax collected.
  • Start Gmail Receipt Scan — starts a bounded scan over a lookback window or an explicit inclusive date range.
  • Create Expense Report — builds a report for a date range, with optional category and group filters, and returns a Report URL.

Searches — read from ExpenseBot

  • Get Receipt Processing Result — the terminal result for one exact submission.
  • Get Gmail Scan Status — the current or last scan status; repeat after a Delay until it completes, and route any Action Needed count to its review link.
  • Find Expense — by merchant, text, category, group, or inclusive date range, for approval and reconciliation workflows.
  • Find Report — locate an existing report to hand off or bill from.

Two patterns are worth calling out. A Gmail scan follows the same shape as a receipt upload — start it, delay, poll Get Gmail Scan Status until it is done, then route anything needing attention rather than assuming the scan was clean. And when a report is the end of the workflow, Create Expense Report returns a Report URL to deliver; a Bill Client URL is returned only for the reviewed client-advance handoff, so treat billing as a deliberate step, never an automatic one.

If you are wiring calls yourself rather than using the Zapier app, the same capability is documented endpoint by endpoint in the Zapier REST API reference. And if you have not decided between platforms yet, Zapier vs Make for expense automation compares the two directly — ExpenseBot has a native app on both.

What This Does Not Do

Worth being blunt, because it decides whether this leg fits your pipeline. ExpenseBot is not a general ledger and does not do double-entry bookkeeping. It does not reconcile your bank feed, and it does not file anything with a tax authority. A Zap that completes successfully proves a receipt was captured and given a terminal result — it does not prove anything downstream reconciled.

Nothing here is unattended approval, either. The actions write what you mapped them to write, so review the mappings and test one controlled record before enabling a Zap on live data. Outcomes ExpenseBot is not confident about are handed to a person through the Review Expenses link rather than guessed at, and pushing a reviewed report into QuickBooks Online, Xero, or another accounting package stays a step you take deliberately.

Frequently Asked Questions

How do I connect ExpenseBot to Zapier?

Add ExpenseBot as an app inside a Zap and sign in when Zapier opens ExpenseBot's consent screen. The connection uses OAuth 2.0 with PKCE, so there are no API keys or client secrets to copy by hand. You need an ExpenseBot account with its Google Sheet already connected before the connection will do anything useful.

Do I need the Zapier MCP Client instead?

Not for a normal Zap. The native ExpenseBot app is the route for building step-by-step workflows and is the one described on this page. The Zapier MCP Client is a separate, beta route that connects a Zap to ExpenseBot's broader MCP toolset — useful when you want an agentic step to choose among allowed tools rather than running a fixed sequence.

Why does my Upload Receipt step fail with a file error?

Almost always because the Receipt File field was mapped to something that is not the file. It needs the actual file object from the trigger step or a downloadable file URL — not a link to a preview page, not the attachment's name. File Name must include the real extension, and MIME Type must be the true type, such as image/jpeg, image/heic, or application/pdf.

I've mapped the Submission ID and still get nothing back. What's wrong?

Get Receipt Processing Result needs the exact Submission ID that Upload Receipt returned. It is a different value from the Source Event ID you supplied, and it is not the file name or a timestamp. If Terminal Result Found is false, processing has not finished yet — add or lengthen the Delay and check again rather than treating it as a failure.

Will a retry create a duplicate expense?

No, provided you map the trigger's stable unique ID into Source Event ID on every data-creating action. Replaying the same Source Event ID returns Safe Retry Replayed instead of writing a second record. Reusing the same ID with conflicting data is rejected rather than silently merged.

Can a Zap create a new client or project group?

No. The group field on the receipt and expense actions selects from client, project, and trip groups that already exist in ExpenseBot. Create the group in ExpenseBot first, then map to it. This is deliberate — auto-created groups from a misfiring trigger are very hard to unpick later.

Does a successful Zap mean my books are done?

No. A successful Zap means the receipt reached ExpenseBot and got a terminal result. ExpenseBot is not a general ledger, does not do double-entry bookkeeping, does not reconcile your bank feed, and does not file anything with a tax authority. Pushing a reviewed report into your accounting package is a separate, deliberate step you take.

You need the account before you can build the Zap

60 days free. Connect Gmail, watch what it finds, then wire it into the rest of your pipeline.

Last updated: August 25, 2026