ml-connector
MYOBZuora

MYOB and Zuora integration

MYOB runs the accounting ledger and GL for SMEs across Australia and New Zealand. Zuora handles subscription orders, invoicing, and payment collection for recurring-revenue businesses. Connecting the two means customer account hierarchies and subscription invoice data move seamlessly into MYOB, so your accounting records reflect what your billing platform has already processed. When Zuora invoices, MYOB sees the transaction without re-keying. When a payment clears in Zuora, MYOB recognizes the cash.

How MYOB works

MYOB AccountRight Live API v2 exposes contacts (suppliers, customers, employees), purchase and sale invoices, purchase orders, payments, GL accounts, tax codes, categories, and jobs through REST endpoints with OData v3 query filters. Authentication requires OAuth2 Authorization Code flow plus company file credentials supplied as a separate x-myobapi-cftoken header; both must present on every call. Access tokens expire in 20 minutes and refresh tokens last one week. The API enforces a rate limit of 8 requests per second and one million requests per day per API key, and pagination caps at 1000 records per request. MYOB has no webhook system, so all polling uses the LastModified OData filter to detect changes since the last sync.

How Zuora works

Zuora exposes accounts, subscriptions, invoices, orders, payment methods, and refunds via REST over HTTPS at a multi-region base URL specific to each customer (rest.zuora.com, rest.eu.zuora.com, rest.ap.zuora.com, and others). Authentication uses OAuth2 Client Credentials, and every request requires the Bearer token in the Authorization header. Tokens expire after one hour. Zuora can push billing, payment, subscription, and account events to a registered webhook endpoint via HTTPS callouts with HMAC-SHA256 signature support. Payment notifications fire only for electronic payments, not external or manual payments. The platform rate-limits at 50,000 requests per minute on production and enforces concurrent request limits of 40 by default. Webhook callouts have a fixed 25-second timeout and retry on failure according to configurable behavior.

What moves between them

Customer accounts and subscription data flow from Zuora into MYOB on a polling schedule. When a subscription is created in Zuora, ml-connector reads the account and subscription details, maps the Zuora account to an MYOB contact (customer or supplier), and adds or updates the MYOB record. When Zuora invoices post, ml-connector polls the invoice and its line items, maps each item to the corresponding MYOB GL account and job code, and creates a matching MYOB purchase invoice or customer payment to record the transaction in the ledger. Payment records from Zuora flow into MYOB as customer or supplier payments once received. MYOB itself is read-only in this pairing; ml-connector does not write sales, GL entries, or account data back into Zuora.

How ml-connector handles it

ml-connector stores Zuora OAuth credentials (client_id and client_secret) encrypted and refreshes the bearer token every 50 minutes, well before the one-hour expiry. On the MYOB side, it stores the OAuth access token and company file credentials encrypted, and it maintains a separate OAuth session since MYOB requires both headers on every request. Because neither system pushes unsolicited notifications by default, ml-connector polls both Zuora and MYOB on a schedule you configure, typically after each billing cycle when Zuora invoices are finalized. When polling Zuora, ml-connector reads invoices and payments via REST list endpoints; it then queries MYOB for the matching GL account and job code and constructs the appropriate MYOB invoice or payment record. If a Zuora GL code or job does not yet exist in MYOB, the record is held in an error state until the reference is added. MYOB's rate limit of 8 requests per second is respected in all bulk operations, and ml-connector retries on 429. The Zuora webhook system can optionally supplement polling for faster notification, but polling remains the primary path because payment notifications fire only for electronic payments. Every record synced carries a full audit trail so payment reconciliation discrepancies can be traced back to the source.

A real-world example

A SaaS company in Australia runs MYOB for accounting and tax compliance and uses Zuora for subscription order management and invoicing. Previously, the finance team downloaded subscription invoices from Zuora every billing cycle and re-entered them manually into MYOB, mapping each subscription tier and add-on to the correct GL account by hand. Month-end close meant comparing Zuora revenue reports against MYOB income accounts to spot missed entries. With Zuora and MYOB connected, each new subscription invoice flows directly into MYOB under the correct GL account, and payment collections are recorded automatically. The finance team now runs month-end close against a ledger that is already in sync with the billing platform, eliminating the manual entry step and reducing errors.

What you can do

  • Sync Zuora customer accounts and subscription data into MYOB contact records, keeping customer hierarchies aligned across both systems.
  • Flow Zuora invoices directly into MYOB as purchase or customer invoices, mapped to the correct GL accounts and job codes.
  • Capture Zuora payments and record them in MYOB as customer or supplier payments without manual re-entry.
  • Authenticate Zuora with OAuth2 client credentials and MYOB with OAuth2 plus company file credentials, managing token expiry and refresh automatically.
  • Poll both systems on a schedule tied to your billing cycle, with full error recovery and audit trails for every synced record.

Questions

Which direction does data flow between MYOB and Zuora?
Data flows primarily from Zuora into MYOB. Zuora customer accounts, subscriptions, and invoices are read by ml-connector and synced into MYOB as contacts and invoices. Payment records from Zuora are recorded in MYOB as customer or supplier payments. MYOB acts as the accounting ledger and is not written back to Zuora; Zuora remains the system of record for subscription and billing events.
How does ml-connector handle MYOB's dual authentication requirement?
MYOB requires both an OAuth2 bearer token and company file credentials (username and password) on every API call. ml-connector maintains two encrypted credential pairs: the OAuth access token (refreshed every 20 minutes) and the Base64-encoded company file credentials supplied in a separate x-myobapi-cftoken header. Both are presented together on every request, and the company file token refresh is handled automatically.
What happens if a Zuora invoice references a GL account that does not yet exist in MYOB?
ml-connector queues the invoice in an error state with an audit record showing which GL account or job code is missing. Once the reference is added to MYOB, the invoice can be replayed on the next sync cycle. This prevents incorrect GL mappings and keeps the audit trail clear for reconciliation.

Related integrations

Connect MYOB and Zuora

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

Get started