ml-connector
AcumaticaZoho CRM

Acumatica and Zoho CRM integration

Acumatica runs finance, billing, and inventory. Zoho CRM runs the sales pipeline and customer relationships. Connecting the two means the people selling and the people invoicing work from the same customer list. New customers and items created in Acumatica appear in Zoho CRM as accounts and products, and the invoices Acumatica posts show up against the matching Zoho account so reps can see what was billed and what is still open. ml-connector handles the different APIs, the two OAuth setups, and the change tracking on each side, and moves records on a schedule you control.

How Acumatica works

Acumatica exposes customers, sales invoices, sales orders, stock and non-stock items, and GL accounts through its Contract-Based REST API. The base URL is tenant-specific and the endpoint version in the path must match the running ERP release, or the call returns 404. Authentication is OAuth 2.0 against the identity server built into the instance, and every field value in a request or response body is wrapped in a value object rather than a flat pair. Acumatica can push change notifications with a shared-secret header, but those are optional per tenant, so the reliable pattern is to poll with a LastModifiedDateTime filter and offset paging.

How Zoho CRM works

Zoho CRM exposes accounts, contacts, deals, products, vendors, and invoice records through its REST v8 API using GET, POST, PUT, PATCH, and DELETE. Authentication is OAuth 2.0 with a long-lived refresh token, and the correct base URL comes from the api_domain field in the token response because the org may sit on any of seven datacenters. Zoho can POST webhooks when records change, but the payload carries only record IDs, so the full record must be fetched afterward, and notification channels expire after about a day and must be renewed. Invoice, product, and vendor modules require a Professional plan or higher.

What moves between them

The main flow runs from Acumatica into Zoho CRM. Acumatica customers sync to Zoho accounts, and stock and non-stock items sync to Zoho products, so the sales team works from the same master records as finance. Posted Acumatica sales invoices are copied into Zoho invoices and linked to the matching account, giving reps visibility into billed amounts and balances. New customers created from won deals in Zoho can flow back to Acumatica as customer records. Cadence is scheduled polling against Acumatica with an optional push trigger from Zoho webhooks; financial postings stay owned by Acumatica and are never written back from CRM.

How ml-connector handles it

ml-connector stores both credential sets encrypted and runs two OAuth flows: one against the Acumatica identity server at the customer instance URL, refreshing the token with offline_access, and one against the Zoho accounts server for the org datacenter, exchanging the refresh token before calls and using the returned api_domain as the base URL. It pins the Acumatica endpoint version per customer so the path stays valid, and wraps every field value in the value object Acumatica requires. Because Acumatica push is optional, it polls customers, items, and posted invoices using a LastModifiedDateTime filter with $top and $skip paging and stores a high-water mark per run. Where Zoho webhooks are enabled it accepts the ID-only notification, verifies the echoed token, then fetches the full record, and it renews the Zoho channel before its roughly one-day expiry. Customer codes map to Zoho account names and items map to products. Acumatica has no idempotency key, so the connector checks for an existing record before creating and uses Zoho upsert with a duplicate-check field to avoid doubles. On a 429 from either side it backs off and retries, and every record carries a full audit trail and can be replayed.

A real-world example

A specialty distributor with roughly 120 staff runs Acumatica for inventory, billing, and accounts receivable, and its sales team lives in Zoho CRM. Before the integration, reps had no view of whether an order had been invoiced or paid, so they pinged accounting over chat for account balances and sometimes promised stock that finance had already discontinued. New customers set up by sales in Zoho were re-keyed into Acumatica by hand, which introduced mismatched names and duplicate accounts. With Acumatica and Zoho CRM connected, the customer master and item catalog flow into Zoho, posted invoices appear on each account, and won-deal customers go back to Acumatica cleanly, so sales and finance finally see one consistent picture.

What you can do

  • Sync Acumatica customers into Zoho CRM accounts so sales and finance share one customer list.
  • Push Acumatica stock and non-stock items into Zoho products for accurate quoting.
  • Copy posted Acumatica sales invoices into Zoho and link them to the matching account.
  • Send new customers won in Zoho back to Acumatica without manual re-keying.
  • Bridge Acumatica and Zoho OAuth, refresh both tokens, and route Zoho calls to the right datacenter.

Questions

Does this use Acumatica webhooks or polling?
It defaults to polling because Acumatica push notifications are configured per tenant and are not guaranteed to be present. The connector reads customers, items, and posted invoices using a LastModifiedDateTime filter with offset paging and stores a high-water mark after each run. If your Acumatica instance has push notifications set up, those can trigger a faster sync, with polling still running as a catch-up safety net.
How does it handle the Zoho datacenter and token expiry?
Zoho orgs can live on any of seven datacenters, so the connector never hardcodes a base URL. It exchanges your refresh token at the accounts server for your region and uses the api_domain returned in the token response for every call. Zoho access tokens last one hour, so the connector refreshes proactively before they expire.
Will it create duplicate records in Zoho CRM?
No. Acumatica does not provide an idempotency key, so the connector checks for an existing match before creating and uses the Zoho upsert API with a duplicate-check field such as account name or item code. Records are also tracked per job, so a retried sync re-targets the same record instead of inserting a second copy.

Related integrations

Connect Acumatica and Zoho CRM

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

Get started