QuickBooks Desktop and Expensify integration
QuickBooks Desktop runs your on-premise accounting ledger. Expensify tracks employee expenses and generates approved reports. Connecting the two eliminates manual expense entry: approved and closed reports flow from Expensify into QuickBooks Desktop as bills or journal entries, mapped to the correct GL accounts and cost centers. Your finance team spends less time copying numbers from emails and attachments, and your expense records stay consistent across both systems.
What moves between them
Approved and closed expense reports flow from Expensify into QuickBooks Desktop on a schedule you define (typically daily or weekly after the expense approval cycle). ml-connector reads the full report and all itemized expenses, then posts them as either a single bill (if grouping the entire report) or multiple journal entry line items (if allocating per cost center or project). The direction is one-way: Expensify to QuickBooks. Employee records and categories can be cached and refreshed periodically to keep validation tables aligned.
How ml-connector handles it
ml-connector stores both credential sets (Expensify API key and QuickBooks Web Connector username/password) and submits Expensify requests via HTTPS POST to the integration endpoint using the partner API key. On the QuickBooks side, ml-connector acts as a SOAP web service that responds to QBWC poll calls: when QBWC polls, ml-connector generates QBXML request payloads to fetch open reports from Expensify, performs the session-token handshake with each poll, and submits formatted bills or journal entries into QuickBooks. The connector maps Expensify category codes to QuickBooks GL accounts and Expensify tags to cost centers or other custom dimensions so expense lines land on valid accounts. Critically, ml-connector re-queries each account before posting to obtain the current EditSequence, preventing concurrent edit conflicts if QuickBooks users are editing the same account. QBXML requests time out after approximately 60 seconds, so large reports are split across multiple poll cycles. All expense report IDs and journal entries are tracked in an audit log and can be replayed if a downstream bill creation fails.
A real-world example
A mid-sized professional services firm uses QuickBooks Desktop for accounting and Expensify for employee travel and project expenses. Finance staff previously downloaded Expensify reports weekly, manually re-entered expense totals into QuickBooks as bills or journal entries, and reconciled the two systems monthly to catch missed or duplicated entries. With QuickBooks Desktop and Expensify connected, each approved expense report automatically posts into QuickBooks on the schedule the finance team chooses, allocated to the correct project and cost center based on Expensify tags. Month-end reconciliation now takes hours instead of days, duplicates are eliminated, and the finance team has more time for analysis.
What you can do
- Post approved and closed Expensify expense reports into QuickBooks Desktop as bills or journal entries on a polling schedule you control.
- Map Expensify expense categories to QuickBooks GL accounts and Expensify tags to cost centers or custom dimensions so expenses land on valid accounts.
- Authenticate with QuickBooks using the customer-hosted Web Connector SOAP session-token handshake and manage EditSequence versioning to prevent concurrent edits.
- Handle QBXML request formatting, timeouts, and pagination for large expense reports that exceed the 60-second request limit.
- Maintain a complete audit trail of all posted expenses and support replay if a downstream bill creation fails.
Questions
- How does ml-connector authenticate with QuickBooks Desktop?
- ml-connector acts as a SOAP web service that responds to QBWC poll requests. When QBWC polls, ml-connector performs a session-token handshake by accepting the Web Connector's username and password and returning a session GUID. Subsequent QBXML requests in that session use the GUID, and ml-connector re-authenticates on each new poll cycle.
- What happens if the same Expensify report is downloaded twice?
- ml-connector tracks expense report IDs in an audit log to detect and skip duplicates, preventing duplicate bills or journal entries in QuickBooks. The audit log also captures the EditSequence of each posted record, so re-processing can reuse the same EditSequence if needed.
- Can ml-connector post different expense categories to different GL accounts?
- Yes. ml-connector maps Expensify expense categories and tags to QuickBooks GL accounts at configuration time. For example, travel expenses can post to one account, meals to another, and supplies to a third, all within the same expense report. Tags function as cost dimensions and can further refine the GL posting (by project, cost center, or custom field).
Related integrations
More QuickBooks Desktop integrations
Other systems that connect to Expensify
Connect QuickBooks Desktop and Expensify
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started