QuickBooks Desktop and Plaid integration
QuickBooks Desktop is where you track your general ledger and accounts. Plaid connects you to your bank accounts and transaction history across financial institutions. Linking them keeps your bank reconciliation current and eliminates manual transaction matching. When bank transactions flow from Plaid into QuickBooks, your cash accounts stay in sync with your actual bank balances, and month-end close becomes simpler because your bank accounts have already been verified against the institution.
What moves between them
Bank transactions and account data move from Plaid into QuickBooks Desktop. As bank transactions are posted in Plaid (either fetched via REST or pushed via webhook), ml-connector reads them, matches them against QuickBooks accounts by account number, and prepares them for review before posting as ReceivePayment, Bill, or JournalEntry records in QB. Account balances from Plaid are read periodically to verify they match QB account balances and to flag reconciliation breaks early. The flow is read-only from Plaid; ml-connector does not write transactions back to the bank.
How ml-connector handles it
ml-connector sits between the QB QBWC polling mechanism and Plaid's REST and webhook APIs. On the QB side, it registers as a QBWC-compatible SOAP service, receives the session token, queries for modified transactions and account changes using ModifiedDateRangeFilter, and caches the EditSequence value required for any modifications. On the Plaid side, it configures a webhook endpoint in Plaid's dashboard, validates incoming webhook signatures by verifying the JWT using Plaid's public keys and checking the iat claim is within 5 minutes, and then extracts transaction data. When a Plaid transaction webhook arrives, ml-connector maps the Plaid account to the matching QB account using stored account mappings, looks up the QB EditSequence for that account, and prepares the transaction for posting. It handles the key constraint that QB has no idempotency mechanism by tracking which Plaid transaction IDs have already been posted to QB, preventing duplicates if Plaid retries the webhook. It manages the QBWC polling interval to align with your bank's posting cycle, typically running every 6 hours rather than every few minutes, since bank transactions post less frequently than internal QB transactions.
A real-world example
A small accounting firm manages five clients' QuickBooks Desktop files on-site, and each client uses Plaid to aggregate transactions from multiple bank accounts. Before the integration, accountants manually pulled transaction histories from Plaid each week and entered them into QB for bank reconciliation, cross-checking account numbers by hand and reconciling monthly. With QuickBooks Desktop and Plaid connected, Plaid transaction webhooks push completed bank transactions into ml-connector, which matches them to the client's QB accounts and stages them for a single-click confirmation. Account balances are checked daily, so reconciliation discrepancies surface within hours of a bank posting. Month-end close time drops from three days of manual transaction entry to a few hours of exception handling and verification.
What you can do
- Read bank account and transaction data from Plaid and match them to QuickBooks account records by account number and institution routing number.
- Validate every incoming Plaid webhook using JWT ES256 signature verification and check the iat claim to prevent replay attacks.
- Handle the QB Web Connector session token handshake and manage the EditSequence version counter required for QB transactions.
- Track which Plaid transaction IDs have already been posted to QuickBooks to prevent duplicates despite webhook retries.
- Poll QuickBooks on a schedule aligned with bank posting cycles, typically every 6 hours, rather than at the QBWC default interval.
Questions
- How does the integration prevent duplicate transactions if Plaid retries a webhook?
- ml-connector stores a persistent record of which Plaid transaction IDs have been matched and posted to QuickBooks. When a Plaid webhook arrives, it first checks whether that transaction ID already exists in the posting log. If the same transaction ID is received again due to a webhook retry, ml-connector recognizes it and skips re-posting, ensuring one Plaid transaction equals one QB record.
- Does the integration handle accounts in multiple banks or currencies?
- Yes. ml-connector stores account mappings that link each QB account to its Plaid account using account number and institution routing number as the match key. This allows one QB cash account to map to multiple Plaid accounts across different banks, or separate QB accounts for different currencies. Plaid transaction history is limited to 24 months, so older reconciliation may require manual entry.
- What happens if a QB account in the integration is modified or deleted?
- ml-connector queries QB's TxnDeletedQueryRq periodically to detect deletions and halts posting to that account. Account modifications such as a name change do not break the integration since the match key is the account number, not the name. If an account is reactivated in QB, the integration resumes posting once the account mapping is re-enabled.
Related integrations
More QuickBooks Desktop integrations
Other systems that connect to Plaid
Connect QuickBooks Desktop and Plaid
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started