ml-connector
Sage 300Zendesk

Sage 300 and Zendesk integration

Sage 300 manages your core business: customers, orders, inventory, and invoices. Zendesk manages support tickets and customer communication. Connecting them gives your support team order history and customer context without leaving Zendesk. New customers and recent orders from Sage 300 populate Zendesk organizations and ticket fields automatically. Support agents see the whole picture - what a customer ordered, when it shipped, and its value - so they can resolve issues faster and make better decisions about escalation or replacement.

How Sage 300 works

Sage 300 is an on-premise ERP system that runs on Windows IIS with a SQL Server backend. It exposes accounts receivable, orders, inventory, and general ledger data through REST and OData APIs at customer-specific domain URLs. Authentication uses HTTP Basic Authentication with uppercase username and password sent in the Authorization header on every request. Sage 300 supports OData filters, ordering, pagination, and $skip/$top parameters. The system has no webhooks or push notifications, so ml-connector polls on a schedule you set using date and time filters to retrieve only new and modified records. Master data endpoints like ARCustomers and OEOrders support read and write operations, while transaction batches support read and create.

How Zendesk works

Zendesk is a cloud-based support platform that provides REST APIs for tickets, users, and organizations. It uses OAuth2 authorization with access tokens that do not expire unless revoked. Zendesk supports webhooks configured through its Admin Center or Webhooks API, with 9 event categories including ticket creation, assignment, and closure. Webhook events are signed with HMAC-SHA256 and include an X-Zendesk-Webhook-Signature header for verification. Zendesk's API token limit is 256 active tokens per account, and rate limits apply per the official documentation. The platform has no native ERP or finance entities - invoices, purchase orders, payments, GL accounts, and items exist in Sage 300 only.

What moves between them

The main flow is from Sage 300 into Zendesk. ml-connector polls Sage 300 on a schedule for new and modified customers (ARCustomers) and orders (OEOrders), then creates or updates matching Organizations in Zendesk and enriches ticket custom fields with order numbers, amounts, and dates. Organizations in Zendesk are created from ARCustomers, mapped by customer ID. Support tickets are enriched with order context from OEOrders so agents can see customer purchase history without leaving Zendesk. The sync runs on a configurable schedule and uses Sage 300 date filters to fetch only records created or updated since the last poll, avoiding large full-table scans.

How ml-connector handles it

ml-connector stores both credential sets encrypted. For Sage 300, it encodes the uppercase username and password in Base64 for each REST request in the HTTP Authorization header, accepting the customer's IIS domain URL without modification. On the Zendesk side, it stores the OAuth2 access token and presents it as a Bearer token on each request, monitoring for token expiry signals (though Zendesk tokens persist until revoked). ml-connector polls Sage 300 at a configurable cadence using OData filters with DocumentDate gt and last-sync timestamp to retrieve only new records. It maps ARCustomers to Zendesk Organizations by external ID, creates or updates them, then maps OEOrders to ticket custom fields, preserving order number, order date, order amount, and customer linkage. Because Sage 300 is pull-only, ml-connector does not wait for webhooks; it uses polling intervals tuned to your order and customer creation patterns. Zendesk webhook events are optional; if enabled, ml-connector can ingest ticket updates to trigger backflows to Sage 300 for support case logging. Every record carries a timestamp and deduplication key so replays do not create duplicates.

A real-world example

A mid-sized distributor uses Sage 300 for order management and customer records and Zendesk for customer support. Support agents fielding customer calls previously had to switch out of Zendesk to look up orders in Sage 300, or ask customers to provide order numbers verbally. Now, when a customer emails support, ml-connector has already synced their organization and recent orders into Zendesk, so agents see a 12-month order history, total purchase value, and last order date in the ticket context. When a customer calls about a backorder, the agent immediately spots the order in Zendesk, checks its status in the ERP without leaving the ticket, and offers a faster resolution or alternative. Support tickets also log back to Sage 300 as cases for follow-up, closing the loop between support and operations.

What you can do

  • Sync Sage 300 customer records (ARCustomers) into Zendesk as organizations, mapped by customer ID and external reference.
  • Enrich Zendesk support tickets with order context from Sage 300 (order number, date, total, customer), so agents see purchase history without switching systems.
  • Poll Sage 300 on a schedule tuned to your order and customer creation patterns, using OData filters to fetch only new and modified records.
  • Handle Sage 300 HTTP Basic Auth with uppercase credentials and Zendesk OAuth2 bearer tokens transparently, with credential rotation on token expiry.
  • Track poll timestamps and deduplication keys to prevent duplicate organization and ticket enrichment on replayed syncs.

Questions

Does ml-connector write data back to Sage 300 from Zendesk?
The primary flow is Sage 300 to Zendesk. ml-connector reads customers and orders from Sage 300 and updates Zendesk organizations and tickets. Optionally, if you enable Zendesk webhooks, support ticket events can trigger case records in Sage 300, creating a two-way flow for issue tracking. Most configurations are read-only from Sage 300 into Zendesk.
How does ml-connector handle Sage 300's uppercase Basic Auth requirement?
ml-connector stores the username and password encrypted, converts them to uppercase before each request, and Base64-encodes them for the HTTP Authorization header. The customer supplies the uppercase credentials during setup, and ml-connector applies them to all Sage 300 API calls without modification.
Why does ml-connector poll Sage 300 instead of using webhooks?
Sage 300 has no webhooks or change-data-capture system. ml-connector polls at a configurable schedule, using OData date filters to fetch only records created or updated since the last sync. This approach is efficient, avoids large full-table scans, and aligns sync timing with your business processes like daily order batches.

Related integrations

Connect Sage 300 and Zendesk

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

Get started