ml-connector
QuickBooks OnlineExpensify

QuickBooks Online and Expensify integration

Your team submits expenses in Expensify. Your accountant enters them by hand into QuickBooks Online. ml-connector closes that gap. Approved expense reports flow from Expensify into QuickBooks Online as bills or expense transactions, mapped to the cost centers and GL accounts in your chart of accounts. Your accounts payable and expense ledgers stay current without re-keying, and you have a complete audit trail of every imported report.

How QuickBooks Online works

QuickBooks Online exposes vendors, bills, employees, accounts, departments, items, and classes through the QuickBooks Online Accounting API (v3) over REST. Authentication uses OAuth 2.0 with server-side authorization flow and hourly token refresh, and each API call specifies a realmId (company identifier). The platform supports both webhooks for real-time notifications and a CDC endpoint for polling the past 30 days of changes. Webhook payloads contain only the entity ID and operation type, so full records must be fetched separately. No hard delete is available for vendors, customers, or accounts - deactivation is the standard approach.

How Expensify works

Expensify is a cloud-based expense management platform that tracks employee expenses, manages approval workflows, and records corporate card transactions. It exposes approved expense reports and individual transactions through its REST API using API key pair authentication (partnerUserID and partnerUserSecret), with all calls routed through a single integration endpoint. Expensify uses polling only - there are no webhooks. The platform contains no vendor master, AP invoice, or purchase order entities. Expenses are tagged with accounting dimensions like project codes, cost centers, and department references configured within Expensify policies. Employee records are returned in diff responses after updates, not via a direct read endpoint.

What moves between them

Approved expense reports move from Expensify into QuickBooks Online on a daily or weekly schedule you configure. Each report becomes a bill in QuickBooks Online mapped to a QBO vendor (typically an internal clearing account or department), with line items allocated to the correct GL accounts based on the expense category and cost center tags in Expensify. Reimbursable and non-reimbursable expenses are separated by report type. The sync is one-way - reports flow into QBO but are not modified or reversed in Expensify by ml-connector.

How ml-connector handles it

ml-connector stores the Expensify API key pair encrypted and presents it on every request to the Expensify integration endpoint. On the QuickBooks Online side, it performs OAuth2 authorization code flow once to obtain the initial access token, handles token refresh when calls return 401, and captures the realmId from the OAuth callback so subsequent calls target the correct company. The integration polls Expensify for new or updated approved reports on a schedule tied to your expense close cycle, then creates matching bill records in QuickBooks Online. Before posting, it validates that each GL account and cost center referenced in an Expensify policy exists in the QBO chart of accounts - mismatched dimensions are flagged in the audit log and held for manual review. If a bill creation fails or a downstream validation fails, ml-connector retries with exponential backoff and maintains a full audit trail so reports can be replayed once the issue is resolved. Expensify's lack of hard-delete semantics is handled by tracking report IDs, so revisions to a submitted report are recognized and the corresponding QBO bill is updated rather than duplicated.

A real-world example

A professional services firm with 50-100 billable consultants uses Expensify for employee expense submission and approval, and QuickBooks Online for financial accounting. Before integration, the office manager reviewed approved reports in Expensify every Friday, transcribed the details into a spreadsheet, and then manually created one bill per report in QuickBooks Online on Monday morning. With Expensify and QuickBooks Online connected, approved Friday reports are automatically posted to QBO as bills over the weekend, allocated to the correct cost codes and projects. The office manager now runs a monthly audit and reconciliation instead of doing data entry, and the accounts payable cycle closes a week earlier.

What you can do

  • Import approved Expensify expense reports into QuickBooks Online as bills, with line items mapped to GL accounts and cost centers.
  • Authenticate Expensify with API key pairs and QuickBooks Online with OAuth2, handling token refresh and credential encryption.
  • Poll Expensify on a schedule aligned with your expense close cycle and validate GL dimensions before posting to QuickBooks Online.
  • Track Expensify report changes and update corresponding QuickBooks Online bills when reports are revised or corrected.
  • Maintain a full audit trail of every imported report and support replay if a bill creation or validation fails.

Questions

Does ml-connector post expenses back into Expensify or modify submitted reports?
No. The sync is one-way from Expensify into QuickBooks Online. ml-connector imports approved reports and creates bills in QBO but does not write or modify records in Expensify. This protects the expense approval workflow and the single source of truth in Expensify.
How are Expensify expense categories and cost center tags mapped to QuickBooks Online accounts?
Expensify policies assign GL account codes and tags (project, cost center, department, etc.) to each expense category. ml-connector maps those tags to the corresponding GL accounts in your QBO chart of accounts. If a tag or account does not exist in QBO, ml-connector flags it in the audit log and holds the report for manual review to avoid posting to a wrong or missing account.
What happens if QuickBooks Online bill creation fails or an OAuth token expires during a sync run?
ml-connector retries failed bill creations with exponential backoff and maintains a complete audit trail. If a token expires, the OAuth2 refresh is triggered automatically on the next call. All transaction attempts - successes, failures, and retries - are logged and can be replayed once the underlying issue is resolved.

Related integrations

Connect QuickBooks Online and Expensify

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started