ml-connector
QuickBooks OnlineZuora

QuickBooks Online and Zuora integration

QuickBooks Online runs accounting for small-to-mid-market businesses. Zuora runs subscription billing. Connecting them keeps your accounts receivable reconciled: new invoices in QuickBooks flow to Zuora, payments from Zuora post back against the matching QuickBooks invoice, and subscription metrics remain aligned with your general ledger. ml-connector handles the different OAuth flows on each side and moves the records on both push and pull schedules.

How QuickBooks Online works

QuickBooks Online exposes vendors, customers, employees, items, accounts, bills, invoices, payments, journal entries, and purchase orders through the QuickBooks Online Accounting API (v3) over REST, authenticated with OAuth 2.0 Authorization Code flow. Access tokens expire in 1 hour and refresh tokens rotate every 24-26 hours with a 5-year maximum lifetime; the realm_id (company identifier) must be captured from the OAuth callback. QuickBooks supports both webhooks (push on Create/Update/Delete/Merge/Void operations) and CDC polling with 30-day history, though webhook payloads contain only entity ID and name, requiring a fetch to retrieve the full record.

How Zuora works

Zuora exposes accounts, subscriptions, invoices, payments, refunds, credit memos, and products through a REST API with OAuth 2.0 Client Credentials grant. Tokens expire in 1 hour and are reused across requests. Zuora publishes event notifications via HTTPS webhook (Callout Notifications) for billing events (invoice posted, invoice due), payment events (processed for electronic payments), and subscription events (renewed, cancelled, amended), with configurable retry behavior and HMAC-SHA256 signature support. The multi-region architecture requires the base URL to be captured per customer tenant (rest.zuora.com, rest.eu.zuora.com, rest.ap.zuora.com, etc.). Webhook payloads are minimal and require a callback fetch to read the full record.

What moves between them

Invoices and payments flow bidirectionally. QuickBooks invoices and payments pull or push into Zuora for billing reconciliation and revenue tracking, synced on both webhook push and polling intervals. Zuora payment-processed and subscription-amended events post back to QuickBooks to reconcile received payments and subscription updates against the accounts receivable ledger. Customer and account records align in both directions so invoices land on valid Zuora accounts.

How ml-connector handles it

ml-connector stores both OAuth 2.0 credential sets encrypted and refreshes access tokens (QuickBooks every 55 minutes, Zuora every 55 minutes) before expiry. On the QuickBooks side it uses the realm_id per customer and supports both webhook delivery and CDC polling for reliability. On the Zuora side it reads the multi-region base URL per customer tenant and receives HMAC-SHA256-signed webhook notifications. Invoice and payment records are mapped so Zuora customer IDs match QuickBooks customers, and payment postings reference the correct invoice. Zuora rate limits are 50,000 RPM for production, so ml-connector throttles batch reads and retries with exponential backoff. Both systems require the full object representation on updates, so ml-connector fetches current state before patching. Webhook payloads are minimal on both sides, triggering a full-record fetch to populate the flow.

A real-world example

A mid-market SaaS business runs QuickBooks Online for general ledger and accounts receivable and Zuora for subscription billing and revenue recognition. Before the integration, invoices issued in QuickBooks had to be manually entered into Zuora, and Zuora payments had to be manually matched and recorded back in QuickBooks, creating a two-day reconciliation backlog each week. With QuickBooks Online and Zuora connected, invoices sync automatically into Zuora, payments post back to QuickBooks instantly on receipt, and subscription amendments in Zuora flow back to update accounts receivable. Reconciliation becomes a verification step rather than manual data entry.

What you can do

  • Sync invoices from QuickBooks Online into Zuora accounts for billing reconciliation and revenue recognition.
  • Post Zuora payment-processed and payment-declined events back to QuickBooks to reconcile cash received.
  • Keep customer accounts aligned between QuickBooks Online and Zuora so invoices and payments land on valid records.
  • Authenticate QuickBooks Online with OAuth 2.0 Authorization Code flow and Zuora with OAuth 2.0 Client Credentials, refreshing tokens automatically before expiry.
  • Support both webhook push and polling pull on the QuickBooks side, with webhook Callout Notifications and multi-region base URL handling on the Zuora side.

Questions

Which direction do invoices and payments move between QuickBooks Online and Zuora?
Invoices and payments flow bidirectionally. Invoices and new payments move from QuickBooks Online into Zuora for billing reconciliation and revenue tracking. Payment-processed events and subscription amendments from Zuora post back to QuickBooks to reconcile cash received and subscription updates. Customer accounts are kept aligned in both directions.
How does ml-connector handle OAuth 2.0 token refresh on each side?
QuickBooks Online uses Authorization Code flow with 1-hour access tokens and rotating 24-26 hour refresh tokens; ml-connector refreshes every 55 minutes before expiry. Zuora uses Client Credentials grant with 1-hour tokens and no rotation; ml-connector also refreshes every 55 minutes. Both systems cache tokens in encrypted storage and refresh on 401 response as a safety valve.
What if QuickBooks Online and Zuora are in different regions or use different base URLs?
QuickBooks Online uses a region-agnostic base URL parameterized by realm_id per customer. Zuora requires the multi-region base URL per tenant (rest.zuora.com, rest.eu.zuora.com, etc.) captured at setup. ml-connector stores and uses the correct URL for each customer.

Related integrations

Connect QuickBooks Online and Zuora

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

Get started