ml-connector
SAP S/4HANAZuora

SAP S/4HANA and Zuora integration

SAP S/4HANA runs your enterprise finance and procurement. Zuora runs your subscription billing and revenue recognition. Connecting the two keeps your customer master, subscription records, and billing GL in agreement. Customers added in Zuora become business partners in SAP S/4HANA, subscription changes sync automatically, and invoice GL postings flow from Zuora into your general ledger without manual journal entry. ml-connector handles the OAuth dance on both sides, the tenant-specific endpoint URLs, and polls Zuora on a billing calendar you control.

How SAP S/4HANA works

Zuora exposes accounts, subscriptions, invoices, payments, product catalogs, and orders through REST APIs over HTTPS. The platform authenticates with OAuth 2.0 Client Credentials and issues bearer tokens with a one-hour expiry. Zuora is multi-region, so the base URL must be captured from your tenant (rest.zuora.com, rest.eu.zuora.com, rest.ap.zuora.com, or sandbox variants). In addition to pull-via-API, Zuora can push webhook notifications (Callout Notifications) when invoices post, subscriptions renew or cancel, and payments process, though the payload is minimal and requires a callback to fetch the full record. Zuora rate limits at 50,000 requests per minute in production and enforces a 25-second timeout on outbound webhooks, so real-time push can be unreliable for high-volume tenants.

How Zuora works

SAP S/4HANA exposes finance and procurement entities through OData V2 and OData V4 REST APIs over HTTPS. The cloud product authenticates with OAuth 2.0 Client Credentials against a tenant-specific base URL that must be captured from the Communication Arrangement (token endpoint and service URLs vary by tenant and must not be constructed manually). SAP issues short-lived tokens, typically 12 hours, so token refresh before expiry is required. On-Premise instances require an additional sap-client query parameter. SAP S/4HANA has no native webhook system, so data flows are pull-only. Key entities for the integration are business partners (customers), purchase orders, GL accounts, cost centers, and journal entries, though GL accounts and cost centers are read-only (maintained in SAP only). The GL Account Line Items API is not designed for bulk extracts, so large historical syncs must be paginated carefully.

What moves between them

The flow is Zuora to SAP S/4HANA. Customer records (accounts) from Zuora flow into SAP S/4HANA as business partners on a weekly or monthly schedule. Subscription and invoice data from Zuora map to purchase orders and GL journal entries in SAP S/4HANA for revenue recognition and billing GL. Payment records can be synced as well if needed. SAP S/4HANA has no corresponding push back to Zuora, so the integration is one-directional from billing into ERP.

How ml-connector handles it

ml-connector stores both OAuth credential sets encrypted and handles token refresh on both sides before expiry. Because SAP S/4HANA has no webhooks, ml-connector polls Zuora on a schedule you define (e.g., after invoice posting runs, weekly, or daily), rather than waiting for a push. The tenant-specific URLs are required on both sides: Zuora's multi-region base URL must be configured per customer, and SAP S/4HANA's OData service URLs come from the Communication Arrangement setup, not constructed. Customer accounts from Zuora are mapped to SAP S/4HANA A_BusinessPartner records, with Zuora account IDs stored in the partner's external ID field for deduplication on future syncs. Invoice GL postings from Zuora are transformed into SAP S/4HANA journal entries and posted to GL accounts and cost centers that already exist in SAP. ml-connector respects SAP's read-only GL account and cost center data, so there is no push back to SAP. Zuora rate limits at 50,000 requests per minute, so high-volume syncs are paginated, and ml-connector backs off on 429 responses. Every record carries a full audit trail so a failed downstream GL post can be replayed once the blocking issue is resolved.

A real-world example

A mid-market SaaS company runs Zuora for subscription management and billing across ten product lines and multiple geographies, and uses SAP S/4HANA Cloud for consolidated finance and intercompany settlements. Before the integration, the finance team exported customer lists and invoice registers from Zuora each month and re-entered them into SAP S/4HANA by hand to update the customer master and GL. The process took two days and introduced reconciliation errors, since Zuora had the ground truth for active subscriptions but SAP had an out-of-date view. With Zuora and SAP S/4HANA connected, customer changes flow automatically on a weekly basis, and invoice GL postings are recognized the day invoicing runs complete, so the revenue GL is current and the customer master matches the billing system. Month-end close now starts with billing and AR already reconciled.

What you can do

  • Sync Zuora customers (accounts) into SAP S/4HANA as business partners, deduplicated by external ID.
  • Flow Zuora invoice GL postings into SAP S/4HANA journal entries on a schedule tied to your billing calendar.
  • Map Zuora subscription and revenue data to SAP S/4HANA GL accounts and cost centers for billing GL in your general ledger.
  • Refresh OAuth 2.0 tokens on both sides before expiry and handle Zuora's multi-region base URLs and SAP S/4HANA's tenant-specific OData endpoints.
  • Poll Zuora on a schedule you define, with automatic retries on rate limits, full audit trail, and error replay if a GL post fails.

Questions

Does data flow bidirectionally between Zuora and SAP S/4HANA?
No. The integration flows Zuora to SAP S/4HANA only. Customer, subscription, invoice, and billing GL data move from Zuora into SAP S/4HANA. SAP S/4HANA has no corresponding push back to Zuora, and GL accounts and cost centers in SAP are maintained in SAP only.
Why does ml-connector poll Zuora instead of using webhooks?
SAP S/4HANA has no native webhook system for cloud connectors, so data must be pulled on a schedule. Although Zuora supports outbound webhooks, polling is more reliable for billing integrations, since Zuora's webhook timeout is fixed at 25 seconds and high-volume tenants can exceed rate limits during peak invoice posting runs.
How does ml-connector handle the different OAuth token expiry times on each side?
ml-connector caches both OAuth tokens and refreshes them before expiry on each side independently. Zuora tokens expire in one hour, so ml-connector refreshes them regularly. SAP S/4HANA tokens are typically 12 hours, so ml-connector refreshes them as well before they expire, ensuring no 401 errors during polling.

Related integrations

Connect SAP S/4HANA and Zuora

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

Get started