ml-connector
Sage 100Zoho CRM

Sage 100 and Zoho CRM integration

Sage 100 runs your accounting, AR, AP, purchasing, and inventory on premises. Zoho CRM manages your sales pipeline, accounts, and customer relationships in the cloud. Connecting them keeps your customer master clean in Zoho and syncs AR records with sales opportunities, so your sales team and your accounting team see the same customer data. Customer information flows from Sage 100 into Zoho as accounts and contacts, and vendor records in Sage 100 can also populate Zoho's vendor module if configured.

How Sage 100 works

Sage 100 is an on-premises ERP that exposes AR customers, AP vendors, GL accounts, sales orders, and purchase orders through SOAP web services (eBusiness Web Services) or through a local Windows agent that wraps the BOI COM layer. The SOAP interface covers only AR sales orders and customers; full AP, GL, and purchase access requires the local BOI agent. Authentication uses username and password credentials passed with each call (no OAuth or token refresh) and a three-character company code included in every request. Sage 100 has no webhooks or event stream, so data is read by polling with DateLastUpdated and DateCreated fields. The SOAP endpoint runs on customer infrastructure at a customer-specific IIS hostname, and COM access requires a Windows service account plus agent-layer credentials.

How Zoho CRM works

Zoho CRM is a cloud-based CRM platform that exposes accounts, contacts, vendors, invoices, purchase orders, sales orders, quotes, products, leads, and deals through REST APIs on a region-specific domain (zohoapis.com, zohoapis.eu, etc.). It uses OAuth 2.0 for authentication with access tokens valid for one hour and refresh tokens for obtaining new credentials. Zoho CRM supports webhooks for real-time push notifications on create, edit, and delete events, but notification channels expire after approximately one day and must be renewed automatically. Notifications contain only record IDs, so full records must be fetched separately. Invoices, purchase orders, sales orders, quotes, vendors, and products are available only in Professional edition and above.

What moves between them

The main flow runs from Sage 100 into Zoho CRM. AR customers and customer contacts in Sage 100 are polled every 15 to 30 minutes and synced to Zoho as accounts and contacts. AP vendors in Sage 100 (when accessed via the local BOI agent) are synced to Zoho's vendor module, also on a polling schedule. Sales orders from Sage 100 are optionally synced to Zoho sales orders. GL account hierarchies can be synced as read-only reference data in Zoho to provide accounting context for sales transactions. The reverse direction (Zoho to Sage 100) is not typically implemented because Zoho is primarily a sales management and visibility tool, not an order entry system for Sage 100.

How ml-connector handles it

ml-connector handles the significant architectural differences between the on-premises Sage 100 and cloud Zoho CRM. For Sage 100, it stores the customer SOAP endpoint hostname and company code, passes username and password with each poll request (stateless, per Sage 100's design), and uses the local BOI agent endpoint if AP or GL access is required. Polling is driven by DateLastUpdated and DateCreated fields on each entity type, with recommended cadences of 15 minutes for AR customers and AP invoices, hourly for vendors, and daily for GL accounts. ml-connector retries around Sage 100's COM record-locking limits when concurrent access causes transient failures. For Zoho CRM, it obtains an OAuth 2.0 refresh token during initial setup, stores it encrypted, and refreshes the access token automatically when it expires (every hour). Zoho's API responses include a region-specific api_domain field that must be used as the base URL for all subsequent requests, and ml-connector respects this per customer. Customer records are mapped from Sage 100 AR customers to Zoho accounts, with contact details populating Zoho contacts. Vendors are mapped to Zoho vendors (Professional edition and above). Every sync carries a full audit trail and can be replayed if a downstream Zoho API call fails.

A real-world example

A mid-sized manufacturing distributor runs Sage 100 ERP on premises for accounts receivable, accounts payable, and inventory, and uses Zoho CRM in the cloud for sales tracking and pipeline visibility. Before the integration, the sales team created new accounts and opportunities in Zoho manually, and when the accounting team invoiced a customer in Sage 100, the sales team had to search in Zoho to update the opportunity stage and log the transaction. With Sage 100 and Zoho CRM connected, every new customer added in Sage 100 is automatically created as an account in Zoho, and sales opportunities can be linked to the same customer master. The sales team sees customer credit status and recent invoices, while accounting sees the opportunities tied to each invoice. Month-end reconciliation is faster because the two systems agree on who the customers are.

What you can do

  • Sync AR customers and contacts from Sage 100 to Zoho as accounts and contacts on a polling schedule.
  • Map AP vendors in Sage 100 (via BOI agent) to Zoho vendors for multi-source supplier management.
  • Pull GL account hierarchies from Sage 100 and store them as reference data in Zoho for accounting context on sales orders.
  • Authenticate Sage 100 with customer-hosted SOAP credentials and company code, and Zoho with OAuth 2.0 refresh tokens and region-specific API domains.
  • Retry around Sage 100 COM record-locking contention and track all synced records in an audit log for replay on failure.

Questions

How does ml-connector handle Sage 100's lack of REST APIs and cloud connectivity?
Sage 100 runs on premises and exposes data through SOAP web services (for AR only) or a local Windows BOI agent (for full AP, GL, PO access). ml-connector connects to the customer's SOAP endpoint or agent, polls for changes using DateLastUpdated fields, and stores the customer's company code and endpoint hostname in encrypted credentials. There are no webhooks, so polling is required on a cadence matching your business process (e.g., every 15 minutes for AR customers).
What happens when Zoho's OAuth token expires or the API domain changes?
Zoho access tokens expire every hour. ml-connector stores the refresh token encrypted and automatically fetches a new access token when a call returns 401 Unauthorized. Zoho's API response includes a region-specific api_domain that may differ from the initial endpoint, and ml-connector uses that domain for all subsequent requests so region changes do not cause routing failures.
How does ml-connector handle Sage 100's COM record-locking limits when syncing AP vendors or GL accounts?
Sage 100's COM layer enforces locking on concurrent access, causing transient failures when multiple processes read the same records. ml-connector detects these lock contentions, backs off with jitter, and retries up to a configured threshold. Every sync attempt is logged, so if a retry succeeds, the full audit trail shows both the failure and the recovery.

Related integrations

Connect Sage 100 and Zoho CRM

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

Get started