ml-connector
SYSPROSalesforce

SYSPRO and Salesforce integration

SYSPRO runs order management and finance for manufacturing and distribution businesses. Salesforce runs the sales pipeline and customer relationship management. Connecting the two keeps your CRM customer records and sales opportunities aligned with your ERP invoices and payments. New customer accounts in SYSPRO appear in Salesforce as accounts, and invoices update the corresponding opportunities so your sales team sees the real order-to-cash status without re-keying. ml-connector handles the very different APIs on each side and synchronizes the data on a schedule you control.

How SYSPRO works

SYSPRO exposes customers, suppliers, purchase orders, invoices, payments, general ledger accounts, and inventory through three API layers: e.net Business Objects (REST and SOAP, read and write), OData (REST read-only with query filtering), and Workflow Service (REST and SOAP, limited operations). Customers supply their own SYSPRO server URL and authenticate using either a session token from the Logon endpoint (UserId GUID passed on all subsequent calls) or HTTP Basic Auth with SQL credentials (operator code and OData password). SYSPRO has no outbound webhook system, so integrations pull data by polling OData tables with timestamp filters, typically every 5 to 15 minutes for financial data. OData is read-only, so any writes go through e.net Business Objects using XML payloads.

How Salesforce works

Salesforce exposes accounts, contacts, opportunities, orders, invoices, and other standard objects through REST APIs secured with OAuth 2.0 Client Credentials flow. The connector requires a client_id (Consumer Key), client_secret (Consumer Secret), and instance URL (My Domain). Tokens expire after a configurable session timeout, default 2 hours. Salesforce can push change notifications in real time via Change Data Capture on the Pub/Sub API (gRPC streaming), retaining changes for 72 hours, or data can be polled using GET requests with datetime ranges. The Invoice object requires Revenue Cloud or Order Management (API v48.0+) and may not be available in basic Sales or Service Cloud orgs.

What moves between them

Customer records and open invoices flow from SYSPRO into Salesforce. SYSPRO customers are posted as Salesforce Accounts, and SYSPRO invoices are posted as Opportunities with amount and stage mapped from the invoice status and aging. New customers and invoices are detected by polling SYSPRO OData tables on a schedule you control, typically aligned with your invoice cycle. Payment activity can also be synchronized if your Salesforce org has the Revenue Cloud module. The flow is one-way, from SYSPRO into Salesforce, because Salesforce is the source of truth for deal stage and customer relationship management while SYSPRO remains the order fulfillment and financial system.

How ml-connector handles it

ml-connector obtains a SYSPRO session token by calling the Logon endpoint with the operator credentials you supply, stores the UserId GUID, and passes it on every OData read. When the session expires or times out, ml-connector logs on again automatically. On the Salesforce side, ml-connector exchanges the Client Credentials (client_id and client_secret) for an OAuth 2.0 access token and refreshes it when it expires. The polling schedule runs on a cadence you define, typically daily or weekly depending on your invoice volume. When polling SYSPRO OData, ml-connector filters on timestamp fields (InvoiceDate, PostDate) to find new and changed records since the last poll. Each SYSPRO customer is matched to a Salesforce Account by legal name and optional external ID field, and invoices are posted as Opportunities with the invoice amount as the expected revenue and the invoice status (open, paid, overdue) as the opportunity stage. If no matching Account exists, ml-connector creates one automatically. The SYSPRO-to-Salesforce mapping is documented in the flow configuration and can be customized per customer. Every record carries a full audit trail, so if a Salesforce API call fails, the record can be replayed once the failure is resolved.

A real-world example

A mid-sized industrial distribution company runs SYSPRO for order management, invoicing, and financial reporting, and uses Salesforce to track customer relationships and sales pipeline. Before the integration, the sales team entered customer data and invoice amounts into Salesforce by hand or waited several days for a weekly report, so the CRM often showed outdated customer status and missed open invoices. With SYSPRO and Salesforce connected, every new customer created in SYSPRO appears in Salesforce automatically, and invoice status updates flow in daily, so the sales team sees current order-to-cash status without manual entry and can prioritize follow-up based on aging and payment terms.

What you can do

  • Post SYSPRO customers into Salesforce as Accounts, keeping names, addresses, and contact information synchronized.
  • Map SYSPRO invoices to Salesforce Opportunities with amount and stage based on invoice status (open, paid, overdue).
  • Poll SYSPRO OData on a schedule aligned with your invoice cycle, detecting new and changed records.
  • Authenticate SYSPRO with session tokens and Salesforce with OAuth 2.0 Client Credentials, handling token refresh automatically.
  • Maintain a full audit trail on every customer and invoice record, with replay capability if a Salesforce update fails.

Questions

Which direction does data move between SYSPRO and Salesforce?
Data flows from SYSPRO into Salesforce. SYSPRO customers are posted as Accounts and invoices are posted as Opportunities so your sales team has current order-to-cash visibility. Salesforce is the source of truth for customer relationship management and deal stage, so ml-connector does not write customer or opportunity changes back to SYSPRO.
How does ml-connector detect new customers and invoices in SYSPRO?
SYSPRO has no outbound webhooks, so ml-connector polls the SYSPRO OData tables on a schedule you define, typically daily or weekly. Polling uses timestamp filters on fields like InvoiceDate and PostDate to find records changed since the last poll, so you only fetch new and updated records, not the entire table every time.
How does ml-connector handle SYSPRO session tokens and Salesforce OAuth?
ml-connector obtains a SYSPRO session token by calling Logon with your operator credentials and automatically re-authenticates when the token expires. On Salesforce, ml-connector exchanges Client Credentials for an OAuth 2.0 access token and refreshes it before expiry, so both sides stay authenticated without manual intervention.

Related integrations

Connect SYSPRO and Salesforce

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

Get started