ml-connector
Sage 300Microsoft Dynamics 365 Sales

Sage 300 and Microsoft Dynamics 365 Sales integration

Sage 300 runs your financial operations with accounts payable, accounts receivable, and general ledger. Microsoft Dynamics 365 Sales manages your sales pipeline with accounts, contacts, and opportunities. Connecting the two keeps customer master data in sync so your sales team works from AR data that matches your financial records. New customers created in Sage 300 appear in Dynamics 365 Sales, and changes to customer details flow so billing and AR stay aligned.

How Sage 300 works

Sage 300 is an on-premise ERP system running on Windows IIS with SQL Server backend. It exposes accounts receivable customers, AR invoices, GL accounts, and other business entities through REST and OData endpoints. Authentication uses HTTP Basic Authentication with base64-encoded uppercase username and password sent with every request. The API base URL is customer-hosted on their IIS server with no Sage-managed cloud endpoint. Sage 300 has no webhooks or change-data-capture, so all sync is pull-based via polling with OData filters on date and time fields and pagination parameters.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales is a cloud-based CRM application built on Microsoft Dataverse. It manages accounts, contacts, leads, opportunities, quotes, and sales orders. Dynamics 365 Sales authenticates via OAuth 2.0 through Microsoft Entra ID using client credentials flow for server-to-server integrations. All data is accessed through the Dataverse Web API using OData v4.0. The platform supports both webhooks via the Dataverse Event Framework for real-time notifications and polling for bulk sync. Webhook payloads are limited to 256 KB and use a shared secret for verification rather than HMAC signatures.

What moves between them

Customer records flow from Sage 300 AR into Microsoft Dynamics 365 Sales accounts. ARCustomers from Sage 300, including customer number, name, address, and AR status, are mapped to Dynamics 365 Sales account records. Contact records can be created from Sage 300 AR contact information. The sync runs on a polling schedule since Sage 300 offers no webhooks, with OData filters to retrieve only new and changed records since the last poll. Changes to Sage 300 customer records are picked up on the next scheduled sync and upserted into Dynamics 365 Sales accounts.

How ml-connector handles it

ml-connector stores the Sage 300 API URL and uppercase Basic Auth credentials encrypted, and it stores the Dynamics 365 Sales OAuth 2.0 client credentials encrypted. For Sage 300, it encodes credentials into the Authorization header on every request and polls the ARCustomers endpoint with OData filters on DocumentDate and pagination to retrieve customer records in batches. Because Sage 300 is pull-only with no webhooks, polling is scheduled on a regular cadence that you define. For Dynamics 365 Sales, ml-connector refreshes the OAuth 2.0 bearer token before expiry and writes accounts via the Dataverse Web API. It maps Sage 300 customer attributes to Dynamics 365 Sales account fields such as name, address, phone, and custom fields. If a 256 KB webhook payload limit is hit on the Dynamics 365 Sales side, ml-connector batches the write operations to stay under the limit. Every sync carries a full audit trail with timestamps, record counts, and error details.

A real-world example

A mid-market wholesale distributor runs Sage 300 for accounts receivable, inventory, and purchasing, and uses Microsoft Dynamics 365 Sales for pipeline and opportunity management across a national sales team. Before the integration, the sales team entered new customers into Dynamics 365 Sales manually, and AR staff created them in Sage 300, leading to duplicate records, mismatched credit limits, and confusion about which system held the truth. Sales reps called AR to confirm customer status before closing deals. With Sage 300 and Dynamics 365 Sales connected, new customers created in Sage 300 appear automatically in the CRM, sales reps see current AR balance and payment status on the account record, and credit holds in Sage 300 sync to Dynamics 365 Sales so reps are prevented from creating orders for customers on credit block.

What you can do

  • Sync Sage 300 AR customers into Dynamics 365 Sales accounts with address, phone, and custom field mapping.
  • Keep customer master data aligned between the financial system and the CRM so sales and AR work from the same record.
  • Poll Sage 300 on a scheduled cadence and upsert new and changed customers into Dynamics 365 Sales accounts.
  • Authenticate Sage 300 with HTTP Basic Auth and uppercase credentials, and Dynamics 365 Sales with OAuth 2.0 client credentials.
  • Track every sync in an audit trail with record counts, errors, and timestamps so you can verify data integrity.

Questions

Which direction does data move between Sage 300 and Microsoft Dynamics 365 Sales?
The main flow is from Sage 300 into Dynamics 365 Sales. Customer records from Sage 300 Accounts Receivable are synced into Dynamics 365 Sales accounts. Changes to customer details in Sage 300 flow into Dynamics 365 Sales on the next scheduled poll.
Does ml-connector support real-time sync between Sage 300 and Dynamics 365 Sales?
Sage 300 has no webhook system, so ml-connector uses polling on a schedule you define. Dynamics 365 Sales supports webhooks, so once a record is in Dynamics 365 Sales, ml-connector can optionally receive real-time notifications of changes. The initial customer sync from Sage 300 is always poll-based.
How does ml-connector handle authentication for both systems?
Sage 300 uses HTTP Basic Authentication with uppercase username and password, which ml-connector encodes in the Authorization header on every request. Microsoft Dynamics 365 Sales uses OAuth 2.0 client credentials, which ml-connector exchanges for a bearer token via Microsoft Entra ID. Both credential sets are stored encrypted.

Related integrations

Connect Sage 300 and Microsoft Dynamics 365 Sales

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

Get started