ml-connector
Sage IntacctZoho CRM

Sage Intacct and Zoho CRM integration

Sage Intacct runs your accounting and GL. Zoho CRM runs your sales pipeline and customer records. Connecting the two keeps your vendor and account master data aligned across finance and sales. Vendors and customer accounts created in Intacct flow into Zoho so your sales team works from the same master data, eliminating re-entry and reconciliation work. ml-connector bridges the two very different APIs and keeps the data fresh on a schedule you control.

How Sage Intacct works

Sage Intacct exposes vendors, bills, payments, GL accounts, and dimensions through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication is session-based: you send partner and user credentials in an XML-formatted getAPISession request, Intacct returns a sessionid, and that sessionid is cached for 50 minutes and used on all subsequent calls. All operations serialize through the single XML POST connection. HTTP 200 responses may contain application-level errors in XML body tags, so ml-connector parses for errormessage elements and status flags. Intacct does not offer webhooks, so all integration flows are polling-driven or manual-run.

How Zoho CRM works

Zoho CRM exposes accounts, contacts, vendors, deals, invoices, and purchase orders through region-specific REST endpoints (https://www.zohoapis.{region}/crm/v8, where region is .com, .eu, .in, .com.au, .jp, .ca, or .com.cn). Authentication uses OAuth 2.0 with an access token valid for 1 hour; the token response includes an api_domain field that must be used as the base URL for subsequent requests. Zoho offers push webhooks on create, edit, and delete events via notification channels, but channels expire after about 1 day and must be renewed. Vendors, invoices, and purchase orders are available only in Professional edition and above. Full payloads are not included in webhook notifications, so ml-connector must fetch each record by ID after receiving a notification.

What moves between them

The main data flow is from Sage Intacct into Zoho CRM. Vendors and customer accounts from Intacct are read on a polling schedule and upserted into Zoho CRM's Accounts and Vendors modules. Contacts and account hierarchies are created or updated to match the Intacct master. Reference data such as account types and customer status is mapped from Intacct dimension values into Zoho custom fields so sales and finance use the same classification. This one-way flow ensures Zoho always reflects the current vendor and account roster from Intacct without requiring manual sync steps.

How ml-connector handles it

ml-connector stores both credential sets encrypted and manages the two very different authentication flows in parallel. On the Intacct side, it calls the XML gateway with the initial getAPISession request, caches the returned sessionid for the 50-minute lifetime, and refreshes automatically on the next call if expired. It parses XML response bodies for application-level errors (errormessage tags, status codes) because HTTP 200 may contain failures. On the Zoho side, it exchanges the OAuth 2.0 refresh token for a new access token when the 1-hour token expires, and it uses the api_domain returned in the token response as the base URL for all subsequent REST calls, since this varies by region and customer. Because Zoho CRM Professional edition is required for vendors and invoices, ml-connector checks the API response status codes and maps gracefully if a lower edition is in use. Vendor and account names, IDs, and types are matched between systems using Intacct's VENDOR and GLACCOUNT keys as the upstream identifiers, and Zoho record IDs are stored as external IDs to prevent duplicate upserts. Polling runs on a schedule you define, typically daily or weekly, ensuring accounts and vendors are never stale.

A real-world example

A mid-sized manufacturing company uses Sage Intacct for accounting and Zoho CRM for sales pipeline management. The finance team maintains the vendor master in Intacct as suppliers are onboarded and offboarded. Previously, the sales team manually copied vendor data into Zoho CRM or worked from spreadsheets, creating mismatches between the finance and sales records of the same company. Mismatched names or account hierarchies caused confusion in deal tracking and invoice matching. With Sage Intacct and Zoho CRM connected, each vendor onboarded in Intacct appears automatically in Zoho CRM within the polling window, carrying the correct names, IDs, and classification. Sales gets a single source of truth for account structure, eliminating re-entry and spreadsheet creep.

What you can do

  • Sync vendors and customer accounts from Sage Intacct into Zoho CRM's Accounts and Vendors modules on a polling schedule.
  • Map Intacct vendor IDs and account hierarchies to Zoho accounts and contacts so sales and finance share the same master data.
  • Handle Intacct's session-based XML authentication with automatic token refresh and XML error parsing.
  • Manage Zoho's OAuth 2.0 token refresh and region-specific API endpoints without manual intervention.
  • Prevent duplicate record creation by matching on Intacct vendor IDs and storing external IDs in Zoho.

Questions

Which direction does data move between Sage Intacct and Zoho CRM?
The main flow is from Sage Intacct into Zoho CRM. Vendors and customer accounts are read from Intacct and synced into Zoho's Accounts and Vendors modules. Contact records and account hierarchies are created or updated to keep sales and finance aligned. This is a one-way pull; ml-connector does not write accounts back into Intacct.
How does ml-connector handle the different authentication methods?
Sage Intacct uses session-based XML authentication: ml-connector calls getAPISession once with partner and user credentials, caches the sessionid for 50 minutes, and refreshes automatically on expiry. Zoho CRM uses OAuth 2.0 with 1-hour access tokens; ml-connector exchanges the refresh token for a new token when needed and uses the api_domain from the token response as the region-specific base URL.
What happens if Zoho CRM is on the Free or Standard edition instead of Professional?
Vendors, invoices, and purchase orders are available only in Professional edition and above. If the Zoho instance is on Free or Standard, ml-connector will still sync Accounts and Contacts but will not be able to create Vendor records. The API will return a clear error, and you can upgrade the Zoho edition to enable the full feature set.

Related integrations

Connect Sage Intacct and Zoho CRM

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

Get started