ml-connector
QuickBooks DesktopExpensify

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.

How QuickBooks Desktop works

QuickBooks Desktop is a locally-installed Windows accounting system that exposes vendors, bills, invoices, accounts, employees, journal entries, and other accounting records through SOAP web services and QBXML XML envelopes. Integration requires a customer-hosted Web Connector agent (QBWC) running on the same Windows machine where QuickBooks is installed and logged into the company file. The agent polls your SOAP endpoint at an interval you specify (minimum 1 minute, typical 5-15 minutes) and authenticates using a session-token handshake; your service provides a username and password and receives a session GUID for all subsequent calls in that session. Query records with date-range filters to detect changes, and use EditSequence (a version counter on each record) to prevent concurrent edit conflicts.

How Expensify works

Expensify is a cloud-based expense and reporting platform that exposes approved expense reports, individual expenses (transactions), employees, and corporate card data through a REST API. All requests POST to a single integration endpoint with JSON payloads containing a partner API key (partnerUserID and partnerUserSecret). The API is polling-only with no webhooks; you export reports using scheduled requests with date-range or status filters. Expensify has no vendor or invoice entities; expenses are line items with merchant names, amounts, categories, and optional tags that function as accounting dimensions like cost centers or projects.

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

Connect QuickBooks Desktop and Expensify

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

Get started