ml-connector
QuickBooks DesktopLooker

QuickBooks Desktop and Looker integration

QuickBooks Desktop runs on premises and holds vendors, invoices, purchase orders, and general ledger accounts. Looker provides analytics and reporting on top of a data warehouse. Connecting them lets you pull accounting transactions from QuickBooks Desktop into Looker on a schedule, so your financial data appears alongside operational metrics in a single analytics layer. ml-connector handles the QBWC polling setup, the OAuth2 authentication to Looker, and the mapping of accounting records into dimensions and measures your analysts can query.

How QuickBooks Desktop works

QuickBooks Desktop runs locally on Windows and exposes accounting data through QBXML over a SOAP Web Connector agent (QBWC) installed on the customer's machine. The QBWC agent polls a remote SOAP endpoint at a configurable interval (minimum 1 minute, typical 5-15 minutes) and sends requests containing vendor, invoice, purchase order, GL account, and transaction data. Authentication uses a SOAP session-token handshake; the QBWC agent provides credentials and receives a session ticket (GUID) for all calls in that session. QuickBooks Desktop offers no webhooks or push capability, so data is detected by polling with a ModifiedDateRangeFilter on each request. Modifications require the current EditSequence value to avoid conflicts from concurrent edits. The QBXML request timeout is approximately 60 seconds, so large queries must be paginated.

How Looker works

Looker exposes its modeled data through a REST API accessible via OAuth2 client credentials. The API base URL is instance-specific (https://<instance>.cloud.looker.com/api/4.0/ for modern deployments). API tokens expire after 1 hour with no refresh endpoint, so ml-connector must re-authenticate when needed. Looker can accept scheduled data delivery via Scheduled Plans (cron-driven webhooks sent to S3 or SFTP), but for active integration ml-connector uses the REST query API to pull modeled data and push accounting transactions. Looker's permission model is role-based; the API user is assigned roles and permission sets that govern query scope. Looker does not natively store ERP data, so accounting records must be loaded into the underlying data warehouse and then modeled in Looker.

What moves between them

QuickBooks Desktop transactions flow into Looker. On a schedule you configure (hourly, daily, or tied to your month-end close), ml-connector polls QuickBooks Desktop for vendors, invoices, purchase orders, and GL accounts modified since the last sync, then extracts those records and loads them into Looker's underlying data warehouse. The records become queryable as Looker measures and dimensions. Direction is one-way; QuickBooks Desktop is the source of truth for accounting transactions, and Looker is read-only for analytics and reporting.

How ml-connector handles it

ml-connector handles the QuickBooks Desktop QBWC polling flow and the Looker REST authentication bridge. On the QuickBooks Desktop side, ml-connector provides a SOAP web service endpoint listening at a URL you register in QBWC; the agent calls that endpoint on your chosen interval. ml-connector validates the session-token handshake, extracts the username and password, returns a valid session ticket, and then processes the QBXML requests from QBWC to read vendors, invoices, purchase orders, and GL accounts. It tracks the ModifiedDateRangeFilter state across sessions to detect only new and changed records. For Looker, ml-connector calls /api/4.0/login with your client credentials, obtains a bearer token, and uses that token to query and push data. Because Looker tokens expire after 1 hour, ml-connector refreshes the token before each request if needed. QuickBooks Desktop records are transformed into a flat schema suitable for warehouse loading: invoice header and line items are denormalized so each line becomes one row with the invoice header data repeated, GL accounts are mapped to a chart-of-accounts dimension, and vendors are mapped to a vendor master. The sync respects QuickBooks Desktop's EditSequence concurrency model so no stale data overwrites a concurrent edit. Retries use exponential backoff on QBWC polling failures, and every loaded record carries an audit trail with the timestamp and source.

A real-world example

A mid-sized distributor runs QuickBooks Desktop on Windows for accounts payable and GL, and uses Looker dashboards for daily cash flow and expense trending. The accounting team exports vendor aging reports from QuickBooks Desktop each week and manually adds them to a spreadsheet for comparison with purchase order spend in the warehouse. With QuickBooks Desktop and Looker connected, new invoices and vendor master changes from QuickBooks Desktop appear in Looker within your chosen polling interval. The dashboard now shows live AP aging by vendor and cost center, eliminating the weekly manual export and reconciliation. The finance team can drill from an outlier vendor balance in the dashboard directly back to the invoice detail in the underlying data.

What you can do

  • Poll QuickBooks Desktop on a configurable interval and extract vendors, invoices, purchase orders, and GL accounts.
  • Authenticate to Looker with OAuth2 client credentials and load extracted accounting records into your data warehouse.
  • Detect changed and new records in QuickBooks Desktop using ModifiedDateRangeFilter and avoid re-loading unchanged data.
  • Map QuickBooks Desktop GL accounts to Looker dimensions and denormalize multi-line invoices for warehouse-friendly flattening.
  • Respect QuickBooks Desktop EditSequence versioning to prevent stale updates and maintain data integrity across concurrent edits.

Questions

Why does ml-connector need a SOAP endpoint to integrate with QuickBooks Desktop?
QuickBooks Desktop has no pull-based API; instead, the QBWC agent (installed on the customer's Windows machine) is configured to call a remote SOAP service on a polling interval. ml-connector provides that SOAP endpoint. QBWC initiates the connection, exchanges a session token with ml-connector, and then sends QBXML requests to read vendors, invoices, and GL accounts.
How does ml-connector handle Looker's 1-hour token expiration?
ml-connector calls /api/4.0/login with your client credentials before each request batch and caches the bearer token. If more than 1 hour has elapsed since the last successful login, or if a request returns a 401 Unauthorized, ml-connector re-authenticates and obtains a fresh token before retrying.
What happens if QuickBooks Desktop is not running when QBWC tries to call ml-connector?
QBWC will not send the request if QuickBooks Desktop is not running on the customer's machine. ml-connector will not receive the call, so no sync will occur that interval. The next time QBWC detects that QuickBooks Desktop is running and available, it will retry and pick up any modified records since the last successful sync using the ModifiedDateRangeFilter.

Related integrations

Connect QuickBooks Desktop and Looker

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

Get started