Wave Accounting and Expensify integration
Expense management and accounting ledgers often live in separate systems. Wave Accounting holds your chart of accounts and general ledger, while Expensify tracks employee spending and corporate card transactions. ml-connector syncs approved expense reports from Expensify into Wave Accounting's general ledger, coding each expense to the correct GL account and cost center tag so your books reflect real spending without manual re-entry. Every transaction carries a full audit trail and can be replayed if a downstream posting fails.
What moves between them
The flow runs from Expensify into Wave Accounting. ml-connector polls Expensify on a schedule you set for approved expense reports, extracts the expense transactions with their GL account codes and cost center tags, and creates matching transactions in Wave Accounting's chart of accounts. Each expense report maps to a single Wave transaction, and the GL posting is split across all GL accounts and cost centers referenced in the report. Tags in Expensify (cost center, project, class) are read and attached to the Wave transaction for reconciliation. Wave's transaction history then reflects all corporate spending, and your expense accounts stay in agreement with Expensify's approved reports.
How ml-connector handles it
ml-connector stores both credential sets encrypted and refreshes Wave's access token when it expires (every 2 hours). On every poll, it requests Expensify's approved expense reports via the REST API using the API key pair, filters by date range and report status, and reads the expense detail including merchant, amount, GL account code, and tags. For each expense, ml-connector looks up the corresponding Wave GL account by its code, applies the cost center tag if present, and creates a transaction in Wave. Because Expensify polls only and has no webhooks, ml-connector polls Expensify on a cadence you configure (daily, weekly, at month-end) rather than reacting to an event. If a Wave transaction creation fails due to an invalid GL account code or missing cost center in Wave, ml-connector retries and logs the full failure so it can be replayed once the data issue is resolved. Expensify's read-only corporate card transactions are also polled and coded into Wave if they appear on approved reports.
A real-world example
A mid-sized services company runs Wave Accounting for invoicing and general ledger, and uses Expensify to manage employee travel, meals, and equipment expenses across three offices. Before the integration, accountants downloaded expense reports from Expensify each month and manually coded and entered each one into Wave's chart of accounts, matching each expense to the right cost center and GL account. This process took 2-3 days at month-end and introduced coding errors. With Wave and Expensify connected, approved expense reports flow into Wave automatically, coded to the correct GL accounts and cost centers based on the expense categories and tags configured in Expensify. Month-end close begins with all expenses already posted and reconciled, and the manual data entry step is eliminated.
What you can do
- Sync approved expense reports from Expensify into Wave Accounting's general ledger on a schedule you control.
- Code each expense to the correct GL account and cost center tag without manual re-entry.
- Automatically refresh Wave's OAuth 2.0 access token and handle Expensify's API key pair on every request.
- Maintain a full audit trail on every transaction, with replay capability if a Wave posting fails.
- Poll Expensify on a configurable cadence (daily, weekly, or monthly) to capture all approved expenses and corporate card transactions.
Questions
- Which direction does data flow between Wave Accounting and Expensify?
- Data flows from Expensify into Wave Accounting. Approved expense reports are read from Expensify and posted as transactions into Wave's general ledger, allocated to the correct GL accounts and cost center tags. Wave Accounting is the system of record for the general ledger, and Expensify remains the system of record for expense management and approval workflows.
- How does ml-connector handle the differences in how Wave and Expensify expose data?
- Wave Accounting uses GraphQL with OAuth 2.0, while Expensify uses REST with API key authentication. ml-connector stores both credential sets encrypted and handles the protocol and authentication differences transparently. Wave's access tokens expire every 2 hours and are refreshed automatically. Expensify has no webhooks, so ml-connector polls on a schedule you set rather than waiting for a push.
- What happens if an expense fails to post into Wave Accounting?
- If a Wave transaction creation fails due to a missing GL account, invalid cost center, or other error, ml-connector logs the full failure detail with the expense record and audit trail. The failed record is retried on the next poll cycle, and once the underlying issue is fixed in Wave (e.g., the cost center tag is created), the transaction can be replayed and posted without re-downloading the expense data from Expensify.
Related integrations
More Wave Accounting integrations
Other systems that connect to Expensify
Connect Wave Accounting and Expensify
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started