Shopify and Acumatica
Shopify Acumatica integration
Orders, customers and payments from Shopify into Acumatica. Items, matrix items, stock per warehouse, price classes and shipments back. Built to your Acumatica license limits and your price model, then hosted and run for you.
What moves between Shopify and Acumatica
Shopify takes the order and the payment. Acumatica owns items, warehouses, prices, customers on account and the books. Acumatica's contract-based REST API names its records the same in every installation, whatever the forms are called after customization: SalesOrder, StockItem, Customer, Shipment, under an endpoint such as /entity/Default/26.200.001/.
| Flow | Direction | Shopify | Acumatica |
|---|---|---|---|
| Orders | to Acumatica | Order, line items, transactions |
SalesOrder with Details, order type SO or SA |
| Payments | to Acumatica | transaction, gateway | payment applied to the order |
| Customers and companies | both ways | customer, company, company location | Customer, customer location |
| Items | to Shopify | product, variant | stock item, non-stock item, template item |
| Stock | to Shopify | inventory level per location | quantity per warehouse and location |
| B2B prices | to Shopify | catalog, price list, quantity rules | sales prices per customer price class |
| Shipments | to Shopify | fulfillment with tracking | Shipment, after ConfirmShipment |
| Refunds | to Acumatica | refund | credit memo or return |
A sales order with all its lines is one request: PUT on SalesOrder with $expand=Details. The shipment is confirmed in Acumatica with the ConfirmShipment action and only then goes to Shopify as a fulfillment.
Which system owns what
| Data | System of record | Direction | Sync behavior |
|---|---|---|---|
| Items, template and matrix items | Acumatica | Acumatica to Shopify | changed items on a schedule |
| Titles, images, SEO | Shopify | stays in Shopify | not overwritten from Acumatica |
| Prices per price class | Acumatica | Acumatica to Shopify | effective prices, per currency |
| Stock per warehouse | Acumatica | Acumatica to Shopify | changed quantities, 250 per call |
| Orders | Shopify until import | Shopify to Acumatica | webhook plus reconciliation |
| Customers | Acumatica for accounts, Shopify for web buyers | both ways | matched on email or external ID |
| Payments | Shopify | Shopify to Acumatica | with the order |
| Shipments and tracking | Acumatica | Acumatica to Shopify | after the shipment is confirmed |
What Shopify and Acumatica store differently
Matrix items and variants
Acumatica builds variants as matrix items under a template item, from attribute values. Shopify has a product with up to three options and 2,048 variants. A template item with four attributes, such as color, size, fit and length, has one attribute too many for Shopify: one attribute goes into the product title or becomes a separate product. The Inventory ID of each matrix item becomes the variant SKU. Shopify does not require SKUs to be filled or unique, so the integration keeps its own map of Shopify variant ID to Acumatica Inventory ID and checks it before each order write.
Price classes and catalogs
Acumatica holds sales prices by price type: base, customer price class or single customer, each per unit of measure, warehouse and currency, with break quantities and effective dates. Shopify B2B holds a catalog with a price list and quantity rules, assigned to company locations.
The natural mapping is one catalog per price class and currency. Two price classes, WHOLESALE and DEALER, sold in USD and CAD, are four catalogs. Below Shopify Plus a store has at most 3 active catalogs; on Plus there is no limit of 3, and a company location can hold 25. Prices for a single customer and prices per warehouse have no direct place in a catalog: a customer with their own prices gets a catalog of their own, built from the price class with the customer's prices on top. Background in customer-specific pricing.
Stock
Acumatica keeps quantities per warehouse and per location within a warehouse, with on hand, available and available for shipping as separate numbers. Shopify keeps eight inventory states per location and accepts writes to available and on_hand only. The integration writes Acumatica's available quantity per warehouse to the matching Shopify location, minus any buffer. Since Shopify API version 2026-04 every inventorySetQuantities call carries changeFromQuantity and an idempotency key; when Shopify's number has changed in the meantime the call fails with CHANGE_FROM_QUANTITY_STALE and the integration reads again. A sale during the sync is not overwritten. Which warehouses count is a decision per warehouse: see which stock counts.
Customers, locations and tax
An Acumatica customer has a category, Organization or Individual, and customer locations for each delivery address. A Shopify company has company locations with their own catalogs and payment terms. Company maps to Organization customer, company location to customer location. A web buyer without an account has no customer in Acumatica; the order goes either to a generic guest customer or to a customer matched on email. Tax is calculated by Shopify at checkout and by Acumatica through tax zones. One side is the source: the integration writes Shopify's tax per line into Acumatica, or sends net lines and lets the tax zone calculate.
The technical reality of this pair
| Limit | Shopify | Acumatica |
|---|---|---|
| Unit | query cost points per second | sessions, concurrent requests, requests per minute |
| Set by | the plan: 100, 200, 1,000 or 2,000 points per second | the license, shown on SM604000 |
| Over the limit | THROTTLED inside an HTTP 200 |
delayed from half the per-minute limit; declined above 20 queued or after 10 minutes |
| Sign-in | app access token | OAuth 2.0; access token valid one hour |
| Release rhythm | an API version every quarter | two releases a year; endpoint version in the URL |
Sessions. The license caps the number of API users as well as requests. An integration that signs in with a username and password opens a session with a cookie and has to sign out, or the session holds a license slot until it times out; a sign-in above the limit returns 429. With OAuth 2.0 and the offline_access scope Acumatica reuses one session for every refreshed token. Acumatica has announced that direct sign-in with a username and password will be discontinued, so new integrations use OAuth.
Orders, worked through. An order is two requests: the sales order with its lines, then the payment. Take Acumatica's own example license of 50 requests a minute. Delays start at 25 requests in a minute, which is 12 orders a minute at full speed. A sale day of 600 orders in an hour is 10 orders, or 20 requests, a minute, inside that margin with 5 requests a minute left for the stock run and your other integrations. Above that the queue holds the orders; none is declined, because the integration never sends more than the concurrent limit at once.
Stock, worked through. 4,000 matrix items across two warehouses are 8,000 quantities. Written to Shopify at 250 per inventorySetQuantities call that is 32 calls. A normal run sends only changed quantities: a day with 600 orders touches a few hundred items, two or three calls.
Webhooks. Shopify waits five seconds for an answer, retries 8 times over 4 hours and then deletes the subscription. The webhook only puts the order ID in the queue; a reconciliation run compares Shopify's recent orders with the external references in Acumatica. The Shopify side is covered in Shopify API rate limits, the Acumatica side on the Acumatica page.
Where standard connectors stop
Acumatica ships its own Shopify connector as part of its retail commerce features, and standard connectors and iPaaS templates exist next to it. Acumatica's documentation of its connector states these limits:
- Price classes only. It exports prices of type Customer Price Class, effective on the day of the sync, with no warehouse. Prices for a single customer are not exported.
- 11 price tiers. At most 11 volume price tiers per item and price list; tiers beyond that are skipped. Quantity rules are created with an increment of 1, and a later change to the increment is not updated.
- Catalogs overwritten. Changes made to an exported catalog in Shopify are overwritten at the next sync.
- Fixed directions. Orders, payments and refunds are import only; stock, shipments and price lists export only.
- Records skipped. After 5 failed attempts, the default, a record is excluded from further synchronization.
- Stores by license. The license caps the number of connected stores; above the cap, stores are taken in alphabetical order and the rest are not synchronized.
The same help pages still describe Shopify catalogs as a Plus feature and give Shopify's limit as 100 variants per product; both are out of date, since catalogs reached all plans in April 2026 and a product now holds 2,048 variants. A built integration carries your price types, tiers and warehouse rules as written rules, and holds a failed record for a fix instead of excluding it. The comparison on technical grounds is in custom integration vs iPaaS.
When it goes wrong
| What fails | What the integration does | What you see |
|---|---|---|
| Acumatica delays or declines a request | keeps the record in the queue, lowers its own rate | nothing, unless it lasts |
| Sign-in returns 429 (API users at the license limit) | waits for a free session, retries | an alert if it persists |
| SKU without an Acumatica Inventory ID | holds that order, continues with the rest | the order and the SKU |
| More catalogs than the Shopify plan allows | stops the price export for the new catalog | the price class and currency |
CHANGE_FROM_QUANTITY_STALE on stock |
reads the current quantity, sends again | nothing |
| Webhook subscription deleted by Shopify | reconciliation finds the orders, subscription recreated | an alert with the time |
| Acumatica upgrade window | queue fills, drains afterwards | queue length on the dashboard |
An order that still fails after its retries is kept with its original payload and sent again once the cause is fixed. Before go-live the integration runs as a dry run against your Acumatica sandbox, writing nothing, and you approve what it would do. After that every run leaves a diff per record. This is part of every e-commerce ERP integration we build. More on the platform side on the Shopify page and in Shopify ERP integration; sibling pages are Shopify NetSuite integration and Shopify Business Central integration. Tell us how your Acumatica license and price classes are set up.
Frequently asked questions
Acumatica has its own Shopify connector. Why build an integration?
The connector covers the standard flows with fixed directions per entity and its own filters. Its documentation states where it stops: it exports only prices of customer price classes, at most 11 price tiers per item, quantity rules with an increment of 1, and it skips a record after 5 failed attempts. A built integration takes over where your price model or your warehouse rules go beyond that.
Do we need Shopify Plus for B2B prices from Acumatica?
Not since April 2026: Shopify B2B, catalogs and payment terms are on Basic, Grow and Advanced too, with at most 3 active catalogs. One catalog per price class and currency fills that quickly: two price classes in USD and CAD are four catalogs. Plus removes the limit of 3 and allows 25 catalogs per company location.
How many API calls does our Acumatica license allow?
Your license sets three numbers: API sessions, concurrent requests and requests per minute. They are on the License tab of the License Monitoring Console (SM604000). We read them before the build and size the queue to them, leaving room for your users and other integrations.
Which stock number goes to Shopify: on hand or available?
Usually available: on hand minus what is allocated to open sales orders, from the warehouses that ship web orders, minus a buffer if you set one. Writing on hand counts stock twice that is already promised to another order. The quantity is written per Shopify location, so each Acumatica warehouse that ships has a matching location.
What happens to guest checkouts in Acumatica?
They need a customer. One option is a generic guest customer that collects all guest orders; Acumatica's connector moves to a new guest account after 10,000 orders by default. The other is a customer per buyer, matched on email. The choice depends on whether your accountants need guest buyers as records of their own.
Tell us what you need
Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.
- You know the price and the timeline before you commit to anything
- We work out the connection that takes the work off your hands
- We handle the build, hosting, monitoring and maintenance
- Your team has less information to retype and fewer discrepancies to chase