ml-connector
Oracle JD EdwardsZuora

Oracle JD Edwards and Zuora integration

Oracle JD Edwards runs your general ledger, AP, and AR. Zuora handles subscription billing and invoicing. Connecting them keeps your financial records in sync without manual re-entry. Invoices, payments, and revenue journals from Zuora flow into JD Edwards GL accounts and AP subledgers, and your customer master stays aligned across both systems. ml-connector handles the different APIs on each side and moves the data on your billing cycle.

How Oracle JD Edwards works

Oracle JD Edwards EnterpriseOne is an on-premises ERP exposing financial data through REST via Application Interface Services (AIS) Server. Authentication uses session tokens (obtained via username/password POST to /jderest/v2/tokenrequest, valid for 30-60 minutes, passed in jde-AIS-Auth header) or HTTP Basic Auth per-request. Key entities include the Address Book (F0101), GL Account Master (F0901), Account Ledger (F0911), Accounts Payable Ledger (F0411), Purchase Orders (F43xx), and Item Master (F4101). JD Edwards has no native outbound webhooks; data is retrieved by polling data service tables with date filters on UPMJ (date updated) or document date, tracking the last-polled timestamp. Writes to GL and AP require named orchestrations or batch entry forms rather than direct table updates. Pagination uses maxPageSize (default 100 records) and a continuation token for moreRecords.

How Zuora works

Zuora is a subscription billing and revenue management platform exposing accounts, subscriptions, invoices, payments, and revenue records through a multi-region REST API. Authentication requires OAuth 2.0 Client Credentials; the token endpoint varies by region (rest.zuora.com, rest.sandbox.na.zuora.com, rest.eu.zuora.com, rest.ap.zuora.com) and must be captured from the customer's tenant configuration. Tokens expire in 1 hour. Zuora fires webhook notifications (Callout Notifications) as HTTPS POST to configured endpoints with HMAC-SHA256 signature support for event categories including Invoice Posted, Payment Processed (electronic only, not external/manual payments), subscription changes, and account updates. Webhook payloads are minimal and include just the object ID; the receiver must call back to fetch full record data. Pagination is cursor-based with max page size 40; some operations like account deletion are asynchronous and return a job ID for polling. Rate limits are 50,000 RPM in production and vary by sandbox type; concurrent request limits are 40 by default.

What moves between them

The main flow runs from Zuora into JD Edwards. Zuora invoices, line items, and payments flow into JD Edwards' GL Account Ledger (F0911) as revenue and AR GL entries mapped to the customer's GL account and cost center dimensions. When a Zuora invoice is paid, the payment transaction posts to AR subledger and cash GL accounts in JD Edwards. Customer accounts and billing contacts from Zuora sync into JD Edwards Address Book (F0101) to keep the customer master aligned. Zuora webhooks trigger immediate updates for Invoice Posted and Payment Processed events; between webhook firings, ml-connector polls Zuora's invoice and payment endpoints daily to capture any events Zuora did not notify. Reference data such as product-to-GL-account mappings and business unit identifiers are configured per tenant, so all downstream GL entries land on the correct accounts.

How ml-connector handles it

ml-connector stores both the JD Edwards AIS Server URL (which is customer-hosted and has no public hostname) and Zuora's OAuth2 credentials encrypted. For each Zuora tenant configuration, ml-connector discovers the correct Zuora region (rest.zuora.com, rest.eu.zuora.com, etc.) from the tenant setup and maintains a 1-hour OAuth2 token lifecycle, refreshing when approaching expiry. JD Edwards session tokens are obtained on-demand and cached for their 30-60 minute lifetime; if a request returns HTTP 444 (invalid token), ml-connector re-authenticates. Zuora webhooks trigger ml-connector immediately with a HMAC-SHA256 signature verification step (the webhook signature must match the tenant's shared secret, preventing unauthorized payloads). For invoice data, ml-connector fetches the full invoice, its line items, and associated payment records from Zuora, maps each line item to a GL account using the product catalog and tenant-configured dimension mapping, then posts a journal entry batch into JD Edwards using a named orchestration (a pre-built JDE_ORCH_ template must be imported into the customer's Orchestrator Studio before the first sync). Payment transactions are posted to AR subledger (F0401x) and cash GL accounts. Retry logic accounts for Zuora's 50,000 RPM rate limit; if a call returns HTTP 429, ml-connector backs off and retries with exponential jitter. JD Edwards batch entries use the Zuora invoice ID and line item sequence as the dedup key so duplicate GL posts can be detected if a Zuora webhook fires twice. Customer records sync at the start of the day and whenever an Account Updated webhook fires, pulling the current customer data from Zuora and inserting or updating the Address Book record in JD Edwards.

A real-world example

A mid-market SaaS company with annual contract value of 50 million dollars runs JD Edwards for GL, AR, and financial reporting, and uses Zuora to manage 200+ subscription plans, usage-based billing, multi-year contracts, and revenue recognition. Before the integration, the billing team exported daily invoice and payment reports from Zuora, then the finance team manually re-entered invoice amounts and payment allocations into JD Edwards AR and GL each morning, introducing delays and transcription errors. Month-end close required a full reconciliation between Zuora's invoiced revenue and JD Edwards' posted AR and GL balances, taking 3-5 days. With Zuora and JD Edwards connected, invoice line items flow into GL accounts automatically, payments are posted to AR subledger the moment they clear Zuora's payment processor, and the AR and revenue GL accounts balance with Zuora invoices without re-entry. Month-end close now reconciles in hours because the financial records are already in sync.

What you can do

  • Post Zuora invoices as GL revenue entries into JD Edwards on a daily schedule or triggered by invoice webhook notifications, with line items mapped to the correct GL accounts and cost centers.
  • Sync paid invoices and payments from Zuora into JD Edwards AR subledger and cash GL accounts, with automatic deduplication based on invoice ID.
  • Keep JD Edwards customer master (Address Book, F0101) aligned with Zuora account and billing contact changes.
  • Authenticate to JD Edwards with on-premises AIS Server session tokens and refresh when needed, and to Zuora with OAuth2 tokens, handling multi-region tenants.
  • Verify Zuora webhook signatures with HMAC-SHA256 and replay failed GL posts with a full audit trail of every invoice, payment, and GL transaction.

Questions

How does the integration handle JD Edwards being on-premises with no public hostname?
ml-connector accepts the full AIS Server URL from each customer (typically https://<internal-hostname>:<port>/jderest/v2/) as a credential. The connector reaches the AIS Server from the customer's network via VPN, direct Internet routing, or a firewall rule allowing outbound HTTPS to the AIS port. The customer provides the URL at setup and ml-connector validates it by requesting a session token.
Why does data flow mainly from Zuora to JD Edwards, not the other way?
JD Edwards GL transactions are the source of truth for financial reporting, and Zuora invoices and payments are the source of truth for subscription billing. Zuora's invoice and payment data is the recent transaction activity that needs to post into JD Edwards GL and AR; posting JD Edwards GL transactions back into Zuora would create circular updates and duplicate billing entries. Customer master data flows both directions so Address Book records in JD Edwards stay in sync with Zuora billing contacts.
What happens if a Zuora webhook is lost or a webhook endpoint is down?
Zuora webhooks are the primary trigger for immediate GL posting, but ml-connector also polls Zuora's invoice and payment endpoints on a daily schedule to capture any invoices or payments that Zuora did not notify about. If the webhook endpoint is unreachable, Zuora retries the notification according to its configured retry policy, and ml-connector's daily poll ensures the transaction is posted within 24 hours. The full audit log tracks which invoices and payments have been posted, preventing duplicates if a webhook is delivered after the transaction was already polled.

Related integrations

Connect Oracle JD Edwards and Zuora

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

Get started