ml-connector
QuickBooks OnlinePlaid

QuickBooks Online and Plaid integration

QuickBooks Online manages your invoices, bills, and general ledger. Plaid connects to your bank accounts and surfaces transactions and balances in real time. Connecting the two keeps your accounting system in sync with actual cash movement without manual bank rec work. New transactions from Plaid match automatically to open bills in QuickBooks Online, and payment details flow through without re-entry.

How QuickBooks Online works

QuickBooks Online exposes vendors, customers, employees, bills, payments, journal entries, and GL accounts through the QuickBooks Accounting API v3 over HTTPS at a company-specific realm ID. Authentication uses OAuth 2.0 Authorization Code flow with access tokens expiring in one hour and refresh tokens rotating every 24-26 hours. The platform supports both webhooks for real-time entity changes (Create, Update, Delete, Merge, Void events) and polling via a CDC endpoint with 30-day history. Webhook payloads contain only the entity ID and operation, requiring a subsequent GET to fetch the full record. QuickBooks requires exact object representation with SyncToken on all creates and updates for concurrency control.

How Plaid works

Plaid provides read access to bank account balances, transactions, and investment data via REST APIs secured with client_id and secret credentials, plus per-user access tokens obtained through the Plaid Link flow. Plaid exposes transactions with up to 24 months history, retrieved via cursor-based pagination. The platform delivers webhooks as HTTP POST for TRANSACTIONS, ITEM, HOLDINGS, INVESTMENTS, LIABILITIES, TRANSFERS, AUTH, and IDENTITY_VERIFICATION events, with signature verification using JWT ES256 and JWK lookups. Transfers require idempotency keys (48-hour expiry) and enforce strict description length (10 chars for ACH, 15 for RTP). Plaid does not provide vendor, invoice, or GL account entities, and all products are controlled via the Plaid Dashboard rather than OAuth scopes.

What moves between them

Bank transactions flow from Plaid into QuickBooks Online on a daily or configurable schedule. As Plaid delivers transaction data via webhooks or polling, ml-connector matches transactions to open bills and vendor payments in QuickBooks Online by amount, date, and payee. Matched transactions update the payment record in QuickBooks Online with bank reference data, completing the reconciliation. QuickBooks Online serves as the source of truth for bills and vendors; Plaid is read-only on the transactions side. Unmatched transactions are flagged in audit logs for manual review.

How ml-connector handles it

ml-connector stores QuickBooks realm ID and Plaid access tokens encrypted, refreshes QuickBooks access tokens one hour before expiry, and exchanges Plaid public tokens for item-scoped access tokens via the Plaid Link flow. It polls Plaid's transactions/sync endpoint with cursor tracking to avoid re-processing, matching incoming transactions to QuickBooks bills by comparing amounts, payment dates, and vendor names. For each matched transaction, ml-connector retrieves the full bill record, increments its SyncToken, and POSTs the updated BillPayment with bank reference data back to QuickBooks Online. Plaid webhooks are signature-verified using JWT ES256 validation with JWK public key lookup, rejecting any claim older than 5 minutes or signed with an unexpected algorithm. If a match fails or a QuickBooks update returns 400 (invalid SyncToken or stale object), the transaction is marked for manual review and logged in the audit trail. ml-connector respects Plaid's 24-month transaction history window and handles pagination via cursor for large account histories.

A real-world example

A small-to-mid-market business uses QuickBooks Online for accounting and has business bank accounts connected through Plaid. Before the integration, the accounting team spent 2-3 hours per week downloading transactions from the bank portal, matching them manually to bills in QuickBooks, and recording payments. Many bills went unpaid in QuickBooks for days after the check cleared because the match was manual and often missed. With QuickBooks and Plaid connected, incoming transactions automatically match to open bills, the payment record updates with bank reference data, and the accounting team sees immediate visibility into cleared payments. Month-end bank reconciliation now takes minutes instead of hours.

What you can do

  • Sync bank transactions from Plaid into QuickBooks Online on a daily or event-driven schedule.
  • Automatically match transactions to open bills and vendor payments by amount and date.
  • Update QuickBooks bill payment records with bank transaction reference data for complete audit trails.
  • Verify Plaid webhook signatures using JWT ES256 with JWK public key validation.
  • Handle OAuth 2.0 token refresh for both systems and maintain encrypted credential storage.

Questions

Does data flow both ways between QuickBooks Online and Plaid?
No. Plaid transactions flow into QuickBooks Online where they match open bills and update payment records. QuickBooks Online bills and vendors are read-only in Plaid, since Plaid does not expose accounting entities. This is a one-way read relationship.
How does ml-connector match Plaid transactions to QuickBooks bills?
ml-connector compares transaction amount, payment date, and vendor/payee name against open bills in QuickBooks Online. Matches update the corresponding BillPayment record with bank reference data. Unmatched transactions are logged for manual review and do not create new records.
What happens if a bill's SyncToken is stale when ml-connector tries to update it?
QuickBooks returns 400 on stale SyncToken, indicating the bill was modified outside the integration. ml-connector catches this error, logs the conflict in the audit trail, and flags the transaction for manual review rather than overwriting concurrent changes.

Related integrations

Connect QuickBooks Online and Plaid

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

Get started