ml-connector
QuickBooks OnlineStripe

QuickBooks Online and Stripe integration

QuickBooks Online tracks your invoices, customers, and accounts. Stripe accepts and processes payments. Connecting them keeps your invoices and customer records aligned across both platforms, and payment notifications flow back into QuickBooks so you know which invoices are paid. ml-connector handles the different authentication schemes and moves the data on a schedule you control, whether triggered by webhook or polling at regular intervals.

How QuickBooks Online works

QuickBooks Online exposes customers, vendors, invoices, payments, journal entries, GL accounts, and other accounting records through the QuickBooks Online Accounting API (v3) at https://quickbooks.api.intuit.com/v3/company/{realmId}. It authenticates with OAuth 2.0 Authorization Code flow; access tokens expire in 1 hour and refresh tokens rotate every 24-26 hours. QuickBooks publishes webhooks for Create, Update, Delete, Merge, and Void operations on most entities, but webhook payloads contain only the entity ID and operation - the full record must be fetched via GET. A CDC endpoint is also available for polling with up to 30 days of history. Every create or update requires a full object representation and a SyncToken for concurrency control.

How Stripe works

Stripe exposes customers, invoices, charges, payment intents, subscriptions, and payouts through a REST API at https://api.stripe.com/v1. It authenticates with API keys sent via HTTP Basic Auth (Secret key sk_live_ for production, sk_test_ for sandbox). Stripe publishes webhooks for payment_intent., charge., invoice., customer., subscription., and payout. events with HMAC-SHA256 signatures, and guarantees at-least-once delivery with a 3-day retry window. Stripe does not have vendors, POs, GL accounts, or employees - it is payments-only. Updates use POST not PUT/PATCH, and prices are immutable after creation.

What moves between them

The main flow runs from QuickBooks Online into Stripe. Customer records are synced first so Stripe charges land against recognized accounts in QuickBooks. Invoices created in QuickBooks flow to Stripe with customer, amount, and due date so Stripe can process payments against the correct invoice. Payment notifications from Stripe - including successful charges, refunds, and disputes - flow back into QuickBooks to mark invoices as paid and reconcile cash receipts. The cadence is controlled by webhook (when QuickBooks publishes a change) or polling on a schedule you set.

How ml-connector handles it

ml-connector stores the QuickBooks OAuth 2.0 credential set (access token, refresh token, realm_id) encrypted and automatically refreshes the access token when a call returns 401, ensuring uninterrupted syncing across token rotations. For Stripe, it stores the API secret key encrypted and uses HTTP Basic Auth on every request. On the QuickBooks side, ml-connector accepts webhook notifications and polls the CDC endpoint as a fallback. Webhook payloads contain only the entity ID, so ml-connector immediately fetches the full record via GET to capture all fields. Customer records are synced first so every invoice reference a recognized customer ID in both systems. Invoices sync with their customer, amount, description, and due date. Stripe's webhook payloads for payment_intent and charge events include the customer ID and invoice ID, so ml-connector matches them back to QuickBooks and updates the invoice status to Paid. Because both systems require retries, ml-connector backs off on 429 and 5xx errors and tracks the state of every record in its audit trail so a failed payment notification can be replayed once Stripe confirms it. The QuickBooks refresh token rotates every 24-26 hours; ml-connector caches the new token and ensures a stale token does not interrupt a sync - if a call returns 401, it immediately refreshes and retries. Stripe API key rotation is manual and must be coordinated outside ml-connector.

A real-world example

A small software company with multiple subscription tiers uses QuickBooks Online to track customers, issue monthly invoices, and manage GL accounts for revenue and cash accounts. The company accepts online payments through Stripe. Before the integration, the finance team exported customer lists from QuickBooks and manually created matching customers in Stripe, then spent time every week cross-checking which invoices had been paid by comparing Stripe's dashboard to QuickBooks payment records. With QuickBooks and Stripe connected, new customers created in QuickBooks automatically appear in Stripe, invoices sync with their amounts and due dates, and when a customer pays through Stripe, the payment record flows back into QuickBooks and the invoice is marked paid. Reconciliation is now immediate - the two systems stay aligned without re-keying, and the finance team has confidence that their records match.

What you can do

  • Sync customer records from QuickBooks Online into Stripe, so charges land against recognized accounts.
  • Push invoices with customer reference, amount, and due date from QuickBooks to Stripe.
  • Receive payment notifications from Stripe and update invoice status in QuickBooks to mark them paid.
  • Automatically refresh QuickBooks OAuth 2.0 access tokens and manage Stripe API key authentication.
  • Track every record change in an audit trail and replay failed syncs without duplicating records.

Questions

Which records move between QuickBooks Online and Stripe?
Customers and invoices move from QuickBooks Online into Stripe. Payment records (successful charges, refunds, disputes) move from Stripe back into QuickBooks to update invoice status and cash receipts. All other QuickBooks records - vendors, POs, GL accounts, employees, journal entries - remain in QuickBooks only, since Stripe is a payments system and does not have those entities.
How does the integration handle the difference between QuickBooks webhook payloads and full records?
QuickBooks webhook payloads contain only the entity ID and operation type, not the full record data. ml-connector immediately follows the webhook with a GET request to fetch the complete invoice or customer record, then syncs all fields to Stripe. If webhooks are missed or out of order, ml-connector can also poll the CDC endpoint for up to 30 days of history.
What happens when the QuickBooks OAuth 2.0 refresh token rotates?
QuickBooks refresh tokens rotate every 24-26 hours, and a stale token causes the authentication chain to fail and forces re-authorization. ml-connector caches the new token immediately after rotation and retries any failed call with the fresh token, so token rotation does not interrupt syncing. You do not need to manually refresh or re-authorize unless you revoke access in the QuickBooks account settings.

Related integrations

Connect QuickBooks Online and Stripe

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

Get started