ml-connector
Exact OnlineZuora

Exact Online and Zuora integration

Exact Online runs your accounting and ERP. Zuora runs your subscription billing. When subscription invoices post in Zuora, they need to land in your Exact Online general ledger so your accounting records stay current. ml-connector bridges the OAuth2 authentication for both systems, receives Zuora invoice notifications, and posts them into Exact Online's journal entries without manual re-entry. Subscription revenue is recognized in the same system where your orders and accounts live.

How Exact Online works

Zuora exposes accounts, subscriptions, invoices, payments, credit memos, refunds, and orders through REST APIs organized by billing events. Authentication uses OAuth 2.0 Client Credentials, where the bearer token expires in one hour and must be refreshed before reuse. Base URLs are tenant-specific and region-dependent (rest.zuora.com, rest.eu.zuora.com, etc.), so the endpoint varies per customer. Zuora offers webhook notifications (Callout Notifications) via HTTPS POST for billing, payment, subscription, and account events, where the payload includes an HMAC-SHA256 signature. Payment notifications fire only for electronic payments, not external or manual payments. Webhook payloads are minimal (typically just object ID), so the full record must be fetched separately via the REST API after a notification arrives.

How Zuora works

Exact Online is a cloud ERP covering accounting, purchasing, sales, inventory, and HR, with a REST API that uses OData v3 query syntax (filter, select, orderby, top, skip). Authentication is OAuth 2.0 Authorization Code Grant only, where access tokens expire after 10 minutes and refresh tokens rotate on each refresh and must be used at least once every 30 days. Region-specific base URLs serve Netherlands, Belgium, UK, Germany, France, Spain, and USA divisions, and the division ID must be included in every API call. Exact Online supports webhooks for a broad set of resources including accounts, invoices, purchase orders, and GL accounts, with HMAC-SHA256 signature verification. Related entities do not support expand ($expand), so related data must be fetched in separate API requests.

What moves between them

Invoice and credit memo events from Zuora flow into Exact Online. When Zuora posts an invoice, ml-connector receives the webhook notification, fetches the full invoice record with line items, maps each line item to a GL account and cost center in Exact Online, and posts the transaction as a journal entry. Customer account creation and updates in Zuora are synced back to Exact Online accounts so billing and ERP records remain aligned. The flow runs on an event-driven cadence tied to Zuora's billing cycle rather than a fixed schedule.

How ml-connector handles it

ml-connector stores both OAuth2 credential sets and refreshes Zuora tokens before the one-hour expiry window arrives, while managing Exact Online's 10-minute token lifetime and 30-day refresh token rotation. When a Zuora invoice webhook arrives, ml-connector verifies the HMAC-SHA256 signature against the webhook secret, then queries Zuora to fetch the full invoice including line items and payment status. It fetches the corresponding Zuora subscription and customer account to retrieve project and cost center context. On the Exact Online side, it translates the Zuora invoice into a journal entry using the correct GL accounts and cost center for that customer and subscription type, splitting multi-line invoices into separate transaction lines. Division ID is included in every Exact Online call. Retry logic handles token refresh failures and Zuora API rate limits (50,000 requests per minute in production). Since Exact Online webhooks for GL accounts and cost centers may fire before they are reachable via the main REST API, ml-connector polls for confirmation that the target accounts exist before posting. Every invoice and journal entry carries a full audit trail.

A real-world example

A mid-market SaaS company runs its ERP on Exact Online across three European divisions and uses Zuora for subscription management, recurring billing, and contract amendments. Before integration, the finance team received a weekly export of invoices from Zuora, manually classified them by product line and customer, and re-entered the revenue transactions into Exact Online. Month-end close involved hunting for reconciliation differences between Zuora's invoicing totals and Exact Online's GL, and re-posting missed invoices. With Exact Online and Zuora connected, invoices post automatically to the correct GL accounts when they are generated, mapped to the division and cost center for each subscription, so the revenue is recognized in real time. Month-end close now starts with revenue already posted and no manual re-entry step.

What you can do

  • Post Zuora invoices and credit memos into Exact Online's general ledger automatically when billing events occur.
  • Map subscription and customer data from Zuora to the correct GL accounts and cost centers in Exact Online.
  • Verify Zuora webhook signatures using HMAC-SHA256 and fetch full invoice details after webhook notification.
  • Manage OAuth 2.0 token refresh for both systems, handling Zuora's one-hour expiry and Exact Online's 10-minute expiry separately.
  • Poll Exact Online to confirm GL accounts and cost centers exist before posting, and maintain a full audit trail on every transaction.

Questions

In which direction do invoices flow between Exact Online and Zuora?
Invoices flow from Zuora into Exact Online. When Zuora posts an invoice or credit memo, ml-connector receives the webhook notification, fetches the full record, maps it to the correct GL accounts and cost centers, and posts it as a journal entry in Exact Online. Customer account changes also sync from Zuora to Exact Online so billing and ERP records stay aligned.
How does ml-connector handle Zuora and Exact Online's different OAuth2 token lifetimes?
Zuora tokens expire after one hour and are refreshed before that window closes. Exact Online tokens expire after 10 minutes and refresh tokens rotate on each use and must be refreshed at least once every 30 days. ml-connector manages both cycles independently, caching Zuora tokens where safe and refreshing Exact Online tokens for every request to respect the 10-minute window.
Does the integration handle multi-region deployments and division IDs?
Yes. Zuora base URLs are tenant and region-specific (rest.zuora.com, rest.eu.zuora.com, etc.), and ml-connector captures the correct endpoint per customer. Exact Online requires division ID in every API call, so ml-connector includes the division ID when posting journal entries and querying GL accounts. This allows the integration to span multiple European and US divisions on Exact Online.

Related integrations

Connect Exact Online and Zuora

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

Get started