Raise a Xero bill from each expense claim
Staff expense claims land in Xero as bills awaiting payment, coded to the right account and tagged to the department that spent the money.
New submission on your expense claim form
Create a bill in accounts payable against the claimant's contact record with the amount and expense account code
One-directional. A submission triggers the action — nothing is written back into your form.
Expense claims stall in the gap between a spreadsheet and the ledger. The claim sits in someone's inbox, accounts payable has no idea it exists, and the person who paid for the train ticket asks about it three weeks later.
Raising the bill at the moment of submission closes that gap. The claim form feeds Xero directly: one bill per claim, coded to the right expense account and tagged to the department that spent the money. Finance teams that approve reimbursements in batches get a payables list that is already accurate.
Setting it up
- 1
Publish the expense report form and ask one colleague to file a genuine claim, so the sample carries the way people in your organisation actually itemise.
- 2
In Zapier, trigger on New Submission from that form, add Xero, and pick Create Bill so the claim posts to accounts payable rather than appearing as money owed to you.
- 3
Map Employee Name to the bill's contact, with a Find Contact step ahead of it. Regular claimants already exist in Xero, and matching them keeps one payables record per person.
- 4
Split Itemized Expenses into individual bill lines with a Formatter step. One line per expense keeps a week of travel readable when an approver opens it.
- 5
Translate Expense Categories Included (check all that apply) into account codes with a Zapier Lookup Table — travel to your travel account, software to subscriptions — instead of asking claimants to know your chart of accounts.
- 6
Map Department to a tracking category option on each line, so departmental spend reports do not need re-coding at month end.
- 7
Set the line amount type and tax rate explicitly rather than accepting the Zap's default, then reconcile the first claim by hand to confirm the net figure is what you expected.
- 8
Put Expense Period into the bill Reference, leave the status as Draft or Awaiting Approval, run one claim through, and switch the Zap on once it appears under Business then Bills to pay.
What maps where
Using the Expense Report Form as the starting point. These are its real fields — swap in your own and the mapping works the same way.
| Form field | Xero |
|---|---|
| Employee Name | Contact the bill is raised against in accounts payable |
| Itemized Expenses | Bill line items, one line per expense, after a Formatter split |
| Total Amount Requested ($) | Bill total, checked against the sum of the individual lines |
| Expense Categories Included (check all that apply) | Account code on each bill line, resolved through a Zapier lookup table |
| Department | Tracking category option on the line, keeping departmental reporting accurate |
| Expense Period | Reference on the bill, so an approver sees which weeks the claim covers |
Variations worth knowing
Total Amount Requested ($) can drive Zapier paths. Below your sign-off threshold the bill is created as Awaiting Payment; above it, the bill stays a draft and a notification goes to the person named in Manager / Approver Name before anything reaches the payment run.
Raising every claim against one Staff expenses contact, with Employee Name in the bill Reference instead, stops a fifty-person company acquiring fifty contacts in Xero. Reporting by person then comes from the reference column rather than from the contact list.
If something isn't arriving
People type £42.50, 42,50 or forty-two fifty. Add a Formatter Numbers step to strip symbols and normalise the decimal separator before the Xero action, and change the field's help text to ask for digits only.
Xero happily accepts two identical bills. Build the Reference from Employee Name and Expense Period, add a Find Bill search on that reference, and only continue when nothing comes back so a resubmitted claim stops before payables.
Frequently asked questions
Should reimbursements be bills or spend money transactions in Xero?
A bill keeps the claim in accounts payable until it is paid, which is what most teams want for reimbursements. Spend money suits cases where the money has already left the account. The Zap can create either — pick one and stay with it.
Can the claimant check the status of their claim?
Not through the form. The connection runs one way, so nothing about payment status is read back from Xero. Claimants find out from whoever runs the payment run, or from the remittance Xero sends when the bill is paid.
Do contractors and employees need separate forms?
Not necessarily. One form works if you add a question distinguishing the two, then use Zapier paths to send contractor claims to their own supplier contact and a different purchases account code, while staff claims follow the reimbursement route.
Related automations
- Create a Xero contact when a new client signs on
Every new client who completes your intake form arrives in Xero as a contact, with company, email and phone already filled in.
- Draft a Xero sales invoice from every wholesale order
Each trade order becomes a draft sales invoice in Xero, with the buyer's contact, line items and purchase order number already in place.
- Invoice workshop places as registrations arrive
Every workshop registration raises a Xero sales invoice for the session the attendee picked, priced from your own list.
- Prepare a draft Xero quote from every enquiry
Each quote request opens a draft quote in Xero with the contact set up, the service on a line and your standard rates attached.
- Add counter signups to your Customer Directory
A signup at the till or on your site becomes a Square customer profile straight away, spelled the way the customer typed it.
- Add new clients to your QuickBooks customer list
Every new client who fills in your intake form arrives in QuickBooks as a customer record, ready to invoice.
Build the form first
The automation needs somewhere to fire from. Publish a form, connect it once, and every submission from then on runs this flow.
Start free