ml-connector
SYSPROZuora

SYSPRO and Zuora integration

SYSPRO runs your manufacturing and distribution operations. Zuora handles your subscription billing and recurring revenue. Connecting them keeps your customer master synchronized and your invoices aligned between ERP and billing. New customers and order lines in SYSPRO flow into Zuora's order catalog, invoice records are matched to GL accounts in real time, and payment receipts from Zuora post back to SYSPRO's AR without manual re-entry.

How SYSPRO works

SYSPRO Adaptive ERP exposes customers, invoices, purchase orders, suppliers, GL accounts, and warehouse inventory through REST Business Objects (REST/SOAP, read and write) and OData (REST GET read-only). Authentication uses either a session token retrieved at login (Utilities/Logon endpoint returning a UserId GUID) or HTTP Basic Auth with operator code and OData password. All API calls reference a customer-supplied server URL with no shared base endpoint. SYSPRO has no outbound webhooks, so billing and order records are read by polling OData tables with timestamp filters on PostDate or InvoiceDate.

How Zuora works

Zuora exposes accounts, subscriptions, invoices, payments, orders, and revenue recognition through REST APIs requiring OAuth 2.0 client credentials (client_id and client_secret). Tokens expire in one hour and are reused across requests, presented in an Authorization Bearer header. Zuora also supports webhook Callout Notifications that fire on billing events (invoice posted, payment processed), subscription events (renewed, cancelled, amended), and account events, each signed with HMAC-SHA256. Webhook payloads contain only object IDs, requiring a follow-up API call to fetch the full record. Multi-region deployments require capturing the tenant base URL (e.g., rest.zuora.com, rest.eu.zuora.com, rest.ap.zuora.com).

What moves between them

Data flows bidirectionally. From SYSPRO to Zuora: customer records, invoice line items, and order data are polled from SYSPRO OData and mapped to Zuora account and order structures. From Zuora to SYSPRO: payment notifications (payment processed, payment declined) and invoice events are received via webhook, matched against SYSPRO GL accounts and customer records, and posted as AR payments and adjustments. The sync is event-driven on the Zuora side (webhooks) and time-triggered on the SYSPRO side (polling every 5 to 15 minutes).

How ml-connector handles it

ml-connector manages two separate credential sets and authentication flows. On SYSPRO it accepts the customer server URL and either a session token (requiring periodic refresh at Utilities/Logon) or basic auth credentials (operator code and OData password), and polls OData tables with timestamp filters to detect new customers and invoices. On Zuora it exchanges client credentials for an OAuth token, caches it until expiry, and registers a webhook listener for payment and invoice notifications, validating each payload with HMAC-SHA256 before processing. Customer records from SYSPRO are mapped to Zuora account IDs, and invoice line items are translated to Zuora order lines tied to the matching GL revenue accounts. Zuora payment webhooks fire only for electronic payments, not external or manual payments, so ml-connector must poll for those separately. Rate limits are honored via backoff: Zuora enforces 50,000 requests per minute in production and 2,000 per minute on the AUTH endpoint. Webhook payloads are minimal and trigger API callbacks to Zuora for full record detail. Every payment record carries an audit trail and can be replayed if a GL posting fails.

A real-world example

A mid-sized software company runs SYSPRO for procurement, inventory, and finance, and Zuora for subscription billing and SaaS order management. Before the integration, the finance team exported customer lists from both systems weekly, manually reconciled accounts and subscription counts, and re-entered payment records from Zuora into SYSPRO's AR module by hand. With SYSPRO and Zuora connected, new customer accounts created in SYSPRO automatically appear in Zuora's account catalog, invoices generated in SYSPRO are matched to subscriptions in Zuora, and payments received through Zuora's payment processor post to SYSPRO's AR ledger without re-keying. Month-end close is faster because customer and revenue records are already in sync.

What you can do

  • Poll customer and invoice data from SYSPRO OData and create or update matching accounts and orders in Zuora.
  • Receive payment and invoice notifications from Zuora and post them to SYSPRO's AR and GL accounts using the mapped customer and account relationships.
  • Map SYSPRO GL accounts to Zuora revenue recognition accounts so invoices land on the correct ledger line.
  • Authenticate SYSPRO with session tokens or HTTP Basic Auth, and Zuora with OAuth 2.0 client credentials, managing token refresh and expiry automatically.
  • Validate webhook signatures with HMAC-SHA256 on all Zuora events and maintain a full audit trail on every payment and invoice posted to SYSPRO.

Questions

Which direction does data move between SYSPRO and Zuora?
Data flows both ways. Customer and invoice records move from SYSPRO to Zuora on a polling schedule. Payment notifications and invoice events from Zuora are validated and posted back to SYSPRO's AR and GL accounts. GL account mappings are configured in both directions so revenue lands on the correct account.
How does ml-connector handle SYSPRO's lack of webhooks and Zuora's minimal webhook payloads?
ml-connector polls SYSPRO OData every 5 to 15 minutes using timestamp filters on PostDate and InvoiceDate to detect new records. For Zuora webhooks, ml-connector receives the event notification with minimal data (object ID only), validates the HMAC signature, and immediately calls Zuora's REST API to fetch the full record for posting to SYSPRO.
What happens when Zuora payment notifications include only electronic payments?
Zuora webhooks fire only for electronic payments processed through Zuora's payment processor. ml-connector still polls SYSPRO's AR for manually entered or external payments, and manual payments in Zuora must be re-keyed or sent via a separate sync. The audit trail tracks which records came through webhooks and which came from polling.

Related integrations

Connect SYSPRO and Zuora

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

Get started