ml-connector
Sage X3Zoho CRM

Sage X3 and Zoho CRM integration

Sage X3 runs the back office: manufacturing, inventory, procurement, finance. Zoho CRM manages the front office: leads, deals, customers. Connecting them keeps customer master data in agreement and moves opportunities from CRM into order planning without re-entry. Customers created or updated in Zoho CRM flow into Sage X3, sales orders move back into Zoho as records of fulfillment, and the two systems stay in sync. ml-connector handles the very different APIs and the refresh cadence required on each side.

How Sage X3 works

Sage X3 is an on-premise and cloud ERP covering finance, procurement, inventory, manufacturing, and project management. It exposes customers, suppliers, purchase orders, invoices, products, and GL accounts through GraphQL (Xtrem) at http(s)://<server>:<port>/xtrem/api, or through REST (api1) at http(s)://<server>:<port>/api1/<application>/<folder>/<CLASS>. Authentication uses OAuth2 with JWT bearer tokens for GraphQL, or HTTP Basic Authentication for REST api1. Access tokens expire in 5 minutes and require refresh tokens valid for 30 days. Sage X3 has no native webhooks, so records are read by polling using updatedDate and modifiedDateTime fields to detect changes. The server URL, port, and folder name are customer-specific, and there is no central tenant registry.

How Zoho CRM works

Zoho CRM is a cloud-based customer relationship management platform managing accounts, contacts, vendors, leads, deals, sales orders, and invoices. It exposes data through REST APIs at https://www.zohoapis.{region}/crm/v8, where region varies by customer (com, eu, in, com.au, jp, ca, com.cn). Authentication uses OAuth2 with access tokens valid for 1 hour, and a refresh token enables long-lived integrations. The token response includes an api_domain field that must be used as the base URL for subsequent requests. Zoho supports webhook push notifications on create, edit, and delete events, available on Professional edition and above, though notification channels expire and require automated renewal. Invoices, purchase orders, sales orders, quotes, vendors, and products are available only in Professional edition and above.

What moves between them

Customer and account records flow bidirectionally between Sage X3 and Zoho CRM. When a new customer is created in Zoho CRM, it flows into Sage X3 as a customer record. When opportunities or deals close in Zoho, ml-connector creates matching sales orders in Sage X3. Customer updates in either system propagate to the other. Sage X3 initiates sync by polling using updatedDate fields at a regular interval, since Sage X3 has no outbound webhooks. Zoho CRM can push notifications to ml-connector when records change on Professional edition and above, reducing polling overhead. GL account mappings ensure that invoices flow to the correct accounts.

How ml-connector handles it

ml-connector accepts the customer-specific Sage X3 server URL, port, and folder name, and stores both Sage X3 OAuth2 and Zoho CRM OAuth2 credentials encrypted. On the Sage X3 side, it maintains an access token valid for only 5 minutes, so every request checks expiry and refreshes from the refresh token if needed. On the Zoho side, it stores the refresh token and extracts the api_domain from each token response to route all subsequent API calls to the correct regional endpoint. When a customer record changes in Zoho CRM, ml-connector fetches the full payload via GET /crm/v8/Accounts/{id} since Zoho webhook notifications contain only the ID. On Sage X3, ml-connector polls using the updatedDate field to detect new and changed customers, then upserts them into Zoho. Sales opportunities that close in Zoho are mapped to sales order data and posted into Sage X3. Webhook channels in Zoho expire and must be renewed via PATCH /crm/v8/actions/watch before they lapse, and ml-connector handles this automatically. Both systems carry a full audit trail, and failed records can be replayed once upstream systems are corrected.

A real-world example

A mid-sized B2B distributor runs Sage X3 for inventory, purchasing, and finance, and uses Zoho CRM for sales pipeline and customer management across a distributed sales team. Before the integration, sales reps entered deals in Zoho, and when a deal closed, the office staff manually created a purchase order or sales order in Sage X3, then updated the customer master if new accounts were added. This process was error-prone and created a multi-day lag between a deal closing in the CRM and inventory being reserved. With Sage X3 and Zoho CRM connected, customers created in Zoho flow into Sage X3 automatically, closed deals create sales orders directly, and the sales team sees customer credit limits and inventory availability from Sage X3 within Zoho. Month-end reconciliation is faster because customer master data is no longer duplicated and out of sync.

What you can do

  • Sync customers and accounts bidirectionally between Sage X3 and Zoho CRM so master data stays in agreement.
  • Create sales orders in Sage X3 automatically when deals close or opportunities are qualified in Zoho CRM.
  • Refresh Sage X3 OAuth2 credentials every 5 minutes and manage Zoho's 1-hour access token lifecycle transparently.
  • Detect customer changes in Sage X3 by polling updatedDate fields, and receive Zoho CRM changes via webhooks where available.
  • Renew Zoho webhook channels automatically before expiry so push notifications never lapse.

Questions

How does the integration handle Sage X3 credentials that expire every 5 minutes?
ml-connector checks the Sage X3 access token expiry on every request and refreshes from the refresh token when needed. The refresh token is valid for 30 days, so ml-connector stores both and renews the short-lived access token transparently without interrupting data flow.
Does Zoho CRM's region-specific API endpoint affect the integration?
Yes. Zoho CRM returns an api_domain in the token response that varies by region (com, eu, in, etc). ml-connector stores the api_domain from each successful authentication and routes all subsequent API calls to that endpoint, ensuring requests reach the correct regional server.
Can this integration work without Zoho CRM webhooks if we only have the Standard edition?
Yes. ml-connector can poll Zoho CRM like it polls Sage X3, though this is less efficient than webhooks. Standard edition does not include Invoices, Purchase Orders, Sales Orders, Quotes, or Vendors, so the integration focuses on Accounts, Contacts, Leads, and Deals on the Zoho side when Professional features are not available.

Related integrations

Connect Sage X3 and Zoho CRM

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

Get started