Automated Expensify Reimbursement Pipeline to Xero (Zapier)

Eliminate manual bookkeeping by syncing approved Expensify reports to Xero as Bills using Zapier.

Tools: ExpensifyXero

Platform: Zapier

Short Answer

Every time an expense report is approved in Expensify, a corresponding Bill is automatically created in Xero with the correct contact, line items, and receipt attachments. This ensures real-time visibility into liabilities and a touchless audit trail for tax compliance.

The Problem

Manual entry of employee expense reports into accounting software is prone to human error and delays financial closing. Finance teams often struggle with missing receipts and incorrect account code mapping between Expensify categories and the Xero Chart of Accounts.

The Outcome

Every time an expense report is approved in Expensify, a corresponding Bill is automatically created in Xero with the correct contact, line items, and receipt attachments. This ensures real-time visibility into liabilities and a touchless audit trail for tax compliance.

Step-by-Step Guide

1. **Authenticate Expensify**: Sign in to Zapier and create a new Zap. Choose Expensify as the Trigger and select 'New Report Status Change'. Connect your account using your Partner User ID and Secret. 2. **Configure Trigger**: Set the 'Status' filter to 'Approved' or 'Reimbursed' depending on when you want the bill to hit your ledger. 3. **Add Filter by Zapier**: Add a 'Filter' step to ensure the Zap only continues if the 'Status' exactly matches your desired workflow state (e.g., 'Approved'). 4. **Map Categories via Formatter**: Add a 'Formatter by Zapier' step. Choose 'Utilities' > 'Lookup Table'. Map your Expensify Categories (e.g., 'Office Supplies') to your Xero Account Codes (e.g., '429'). This prevents sync errors caused by text-to-ID mismatches. 5. **Find/Create Contact in Xero**: Add a Xero action 'Find Contact'. Map the 'Employee Name' or 'Merchant' from Expensify. Enable the 'Create Xero Contact if it doesn't exist yet' checkbox to prevent 'Contact Not Found' errors. 6. **Create Purchase Invoice (Bill)**: Add the 'Create Purchase Invoice' action for Xero. - Set 'Status' to 'Awaiting Approval' or 'Awaiting Payment'. - Map 'Report Title' to 'Reference'. - Map the Formatter output to the 'Account Code' field. - Map 'Total Amount' to 'Unit Amount'. 7. **Handle Multi-Line Items**: If using a report with many expenses, ensure you are mapping the 'Line Items' array correctly to the Xero 'Line Amount' fields using Zapier’s line-item support. 8. **Attach Receipt**: Add the 'Xero: Upload File' action. Pass the 'Receipt URL' from Expensify into the 'File' field and associate it with the Invoice ID generated in Step 6. 9. **Setup Error Handling**: Click the '...' on the Xero step and select 'Add Extra Step (Path)' to handle failed tasks, sending a Slack or Email notification if a mapping fails.

Data Mapping

| Expensify Field | Zapier Transformation | Xero Destination Field | Requirement | | :--- | :--- | :--- | :--- | | Report Title | None | Reference / Invoice Number | Required | | Merchant Name | Find/Create Contact | Contact Name | Required | | Total Amount | Formatter: Number (Optional) | Line Amount | Required | | Category | Lookup Table (ID Mapping) | Account Code | Required | | Report ID | None | External Reference / Memo | Optional | | Receipt URL | File Import | Attachment / File Inbox | Optional | | Transaction Date | Formatter: Date/Time | Date | Required |

Gotchas & Failure Modes

* **The Account Code Trap**: Xero requires the *Numerical ID* (e.g., 400) for account codes, not the name (e.g., Advertising). Use a Zapier Lookup Table to convert these names before the Xero step. * **Task Usage**: Each line item in an Expensify report can consume tasks. Use 'Approved Reports' rather than 'New Expenses' to minimize task burn. * **Duplicate Bills**: Zapier does not natively check if a Bill exists before creating a new one. Always use the Expensify 'Report ID' in the Xero 'Reference' field and use a 'Find Invoice' step to check for duplicates before creating. * **Rate Limits**: Xero has a limit of 60 calls per minute via Zapier. If you approve 100 reports simultaneously, some may go into a 'Held' status in Zapier and require a replay.

Verification Checklist

- [ ] **Test Trigger**: Run the test in Zapier to ensure a 'Recently Approved' report is pulled correctly. - [ ] **Validate Mapping**: Ensure the Formatter output correctly generates the Xero Account Code (e.g., '620') and not the text label. - [ ] **Check Contact Logic**: Verify that 'Find or Create Contact' doesn't create a duplicate contact if the name has a slight spelling variation. - [ ] **Verify Attachment**: Confirm the receipt image is actually viewable in the Xero File Inbox or attached to the Bill. - [ ] **Live Run**: Approve one 'Dummy' report in Expensify and verify the Bill appears in Xero under 'Purchases' > 'Draft' or 'Awaiting Approval'.

Ready to Automate?

Build this automation with Zapier in minutes.