ml-connector
AcumaticaSalesforce

Acumatica and Salesforce integration

Acumatica runs finance, distribution, and the general ledger. Salesforce runs the sales pipeline, accounts, and orders. Connecting the two means the customer master agrees on both sides, closed Salesforce orders become invoices in Acumatica without re-keying, and sales can see real receivable balances on the account. ml-connector handles the very different APIs on each side and moves the data on a schedule you control. Because Salesforce is a CRM with no AP bills or chart of accounts, the general ledger stays in Acumatica where it belongs.

How Acumatica works

Acumatica Cloud ERP exposes customers, vendors, AR sales invoices, AP bills, payments, GL accounts, journal transactions, and stock items through its Contract-Based REST API. Each call goes to a tenant-specific instance URL whose endpoint version, such as 24.200.001, must match the running ERP release exactly or the request returns 404. It authenticates with OAuth 2.0 through the built-in identity server, where the client ID embeds the company name. Field values in every request and response are wrapped in value objects. Acumatica can push change events through Push Notifications, but the most common pattern is polling by a LastModifiedDateTime filter, since the push system retries only five times and has no dead-letter queue.

How Salesforce works

Salesforce exposes Accounts, Contacts, Opportunities, Orders, Leads, and Product2 records through its REST API. Every call goes to the org's My Domain URL, which is returned as instance_url in the OAuth token response and must not be hardcoded, with the API version in each path. It authenticates with the OAuth 2.0 client credentials flow; tokens expire after about two hours and carry no refresh token, so a new one is fetched on expiry. Writes can be made idempotent by upserting on an External ID field. Salesforce pushes real-time change events through Change Data Capture over the Pub/Sub API, with a 72-hour replay window. Invoice and Payment objects exist only in Revenue Cloud orgs, so basic orgs lack them.

What moves between them

The main flow moves master data both ways and sales transactions in one direction. ml-connector reads new and changed Salesforce Accounts and Contacts and upserts them into Acumatica Customers and contacts, so the financial customer master reflects the accounts sales is working. Activated Salesforce Orders flow into Acumatica as Sales Invoices, mapped to the matching customer and stock items, with the Salesforce OrderNumber carried as the vendor reference for traceability. In the return direction, Acumatica customer status, credit limit, and AR balance flow back onto Salesforce Account fields so the sales team sees credit reality. GL accounts, AP bills, and journal entries stay in Acumatica, since Salesforce has no equivalent objects, so ml-connector never writes ledger entries into the CRM.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Salesforce side it requests a client-credentials bearer token, derives the base URL from the returned instance_url, and fetches a fresh token when the roughly two-hour session expires, since no refresh token is issued. On the Acumatica side it accepts the full tenant URL and the exact endpoint version per customer, and it wraps every field value in a value object as the Contract-Based API requires. Accounts and Contacts are mapped first, so every order line references an Acumatica customer and stock item that already exist. Writes into Salesforce upsert on an External ID field, and writes into Acumatica match on the Order reference and customer ID, so a re-read record updates in place rather than duplicating. Salesforce Change Data Capture events can trigger a sync the moment an order is activated, with a scheduled LastModifiedDateTime poll on Acumatica as the catch-up path; if the connector is offline past the 72-hour CDC window, it falls back to a full SOQL sync. Acumatica rate limits depend on the license tier and return HTTP 429 near 50 percent of the limit, so ml-connector backs off with jitter and respects the concurrent-session cap.

A real-world example

A mid-sized building products distributor with about 300 employees runs Acumatica for inventory, AR, and the general ledger, while the sales team works entirely in Salesforce. Before the integration, a sales coordinator re-typed each won order from Salesforce into Acumatica to raise an invoice, which delayed billing by a day or two, introduced wrong item codes, and left reps quoting customers who were already over their credit limit. With Acumatica and Salesforce connected, activated orders post as Acumatica invoices within the sync window against the right customer and items, and each account in Salesforce shows its live Acumatica balance and credit status. Billing goes out same day, the item errors are gone, and reps stop selling to accounts that are on hold.

What you can do

  • Upsert Salesforce Accounts and Contacts into Acumatica Customers so the financial master stays current.
  • Post activated Salesforce Orders into Acumatica as Sales Invoices against the matching customer and stock items.
  • Push Acumatica customer status, credit limit, and AR balance back onto Salesforce Account fields.
  • Authenticate Salesforce with OAuth client credentials and Acumatica with its tenant-specific OAuth login and endpoint version.
  • Sync on Change Data Capture events with a polling fallback, idempotent upserts, retries, and a full audit trail on every record.

Questions

Which direction does data move between Acumatica and Salesforce?
Master data moves both ways and sales transactions move one way. Accounts and Contacts sync from Salesforce into Acumatica Customers, while customer status, credit limit, and AR balance flow back to Salesforce. Activated Salesforce Orders post into Acumatica as Sales Invoices. GL accounts, AP bills, and journal entries stay in Acumatica, since Salesforce has no equivalent objects, so ml-connector never writes ledger entries into the CRM.
Can Salesforce hold the invoices and payments instead of Acumatica?
Generally no, and that is by design. The standard Invoice and Payment objects exist only in Salesforce Revenue Cloud orgs; basic Sales and Service Cloud orgs lack them entirely. ml-connector keeps invoicing, payments, and the general ledger in Acumatica, which is built for that, and uses Salesforce for the account and order records that feed billing.
How does the integration handle Salesforce token expiry and the version-locked Acumatica URL?
Salesforce client-credentials tokens expire after about two hours with no refresh token, so ml-connector requests a fresh one on expiry and always derives the base URL from the returned instance_url. For Acumatica it stores the full tenant URL and the exact endpoint version per customer, because a version mismatch in the path returns a 404, and it never hardcodes either value.

Related integrations

Connect Acumatica and Salesforce

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

Get started