Work through these in order. Most broken ExpenseBot Zaps are one of the first three.
The Receipt File field is not a file
Symptom: Upload Receipt errors on the file, or processes something that is not a receipt.
Receipt File needs the actual file object from the trigger, or a directly downloadable file URL. A link to a preview page or a sharing page is a web page, not a receipt. The attachment's name is not the file either. Check this mapping before anything else — it is the single most common cause.
The wrong ID in Get Receipt Processing Result
Symptom: the result step returns nothing, or a not-found error.
Map 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.
Terminal Result Found keeps coming back false
Not a failure. Processing has not finished. Add or lengthen the Delay before the result step and check again. Upload Receipt returns when the file is queued, not when it has been read.
MIME Type is wrong or hardcoded
Symptom: intermittent failures on a trigger that produces several file types.
Map the true type from the source step — image/jpeg, image/heic,
image/png, application/pdf. Do not hardcode one type for a trigger that can
produce several, and make sure File Name keeps its real extension.
The group does not exist
Symptom: the client, project, or trip group field will not accept your value.
No ExpenseBot action creates a group. The field selects from groups that already exist. Create the group in ExpenseBot first, then map to it. Category fields behave the same way — they need an exact configured category name.
A date is rejected
Calendar dates are strict YYYY-MM-DD. Ranges are inclusive, need both ends, and
the end must fall on or after the start. Ambiguous or reversed dates are rejected
rather than guessed at, which is deliberate — a silently reinterpreted date puts
an expense in the wrong tax year.
The connection fails or stops working
Authentication is OAuth 2.0 with PKCE and Zapier refreshes tokens itself, so there is no key to rotate. If the connection breaks, reconnect the ExpenseBot app in Zapier and sign in again. A connection that authenticates but then fails at a step usually means a missing prerequisite: no Google Sheet connected in ExpenseBot, or — for scan actions — Gmail never connected inside ExpenseBot.
The Gmail scan action fails
Gmail must already be connected inside ExpenseBot. The action uses the access you authorized there; it does not grant it and cannot scan an account ExpenseBot has never seen. Also check the range: use Lookback Days or Start Date and End Date, not both.
The Zap succeeded but nothing appeared in my sheet
Read the Receipt Verdict rather than the success flag. A duplicate verdict
means the receipt was recognized against an existing expense and correctly not
written twice. skipped, errored, or unknown means it went to Review
Expenses for a person to decide. mixed is a batch where some files were added
and some were duplicates — it is not an error. Only added writes new rows
outright. Treating "not added" as a hard failure is the most common way a
working integration looks broken.
A retry created a second record
The Source Event ID was not mapped, or was mapped to something that changes on replay — a timestamp or a random value. Map the trigger's stable unique identifier instead. See prevent duplicate expenses.
Still stuck
Email support@expensebot.ai with the Zap step that failed, the exact error text, and the Submission ID if you have one.
