01 / backbone
Acumatica is the ledger
Finance, inventory, customer-specific pricing, order management. The authoritative record the business is run on.
Integration / Makro Middleware
Your ERP stays the system of record. Shopify Plus becomes where the order gets placed. We build custom Acumatica to Shopify Plus middleware for B2B, multi-warehouse and real-time sync.
The real problem
The work is the space between: finance, inventory, customer-specific pricing and order management on one side, B2B buyer self-serve on the other. The native connector is strong and free, and was the first ERP to support Shopify B2B. But under Plus-scale load it slips.
01 / backbone
Finance, inventory, customer-specific pricing, order management. The authoritative record the business is run on.
02 / front door
Where B2B buyers place repeat orders without a phone call, a rep, or an EDI batch. The native connector is strong and free, and was the first ERP to support Shopify B2B.
03 / the gap
The native connector oversells in a flash sale, imports only the first payment capture, and hands you a Sync History grid instead of a system you can audit, replay and reconcile.
We built a product around that exact gap. Acumatica plugs into it as a first-class adapter, path mapped.
The decision guide
There are three ways to connect Acumatica to Shopify: the native connector included in Retail or Commerce Edition, an iPaaS platform like Celigo, DCKAP or MuleSoft, and a custom build on the Shopify Plus side. The choice is not whether a tool supports Plus, since Acumatica says all versions work. It is reliability, observability and reconciliation under load.
Option 01
Included free in Acumatica's Retail or Commerce Edition. Real-time-capable, bidirectional, and the first ERP connector to support Shopify B2B. Competent on the happy path.
Right for straightforward catalogs where the out-of-the-box sync is enough.
Option 02
Subscription middleware on a shared platform. Strong for non-standard multi-system flows across templated connectors.
Right for non-standard multi-system flows that fit a fixed-mapping template.
Option 03 our build
Built on top of Acumatica's native connector, around your exact order flow, B2B experience and the edge cases the connector cannot reach. Owned by you, operated with a support agreement.
Right for the Plus B2B storefront, multi-store catalog control, multi-warehouse mapping, payment and order-edit handling, or the need to audit and replay every transaction.
Where Makro fits
We make the native connector deliver a great Plus B2B store, and own the edge cases it explicitly cannot reach.
Right for brands whose B2B catalog, multi-store or multi-warehouse setup, or order complexity has outgrown the connector out of the box.
Architecture
Customers, items, inventory and pricing are read out of Acumatica and pushed to Shopify. The storefront never writes to the ledger. Orders are the only thing that travels both ways, and Acumatica stays the source of truth.
System of record
read · never overwritten
The platform
map · reconcile · audit
The storefront
where buyers self-serve
The console
Every sync, every failure, every reconciliation is visible. This is the same Makro Middleware console your team would watch in production. Move through the views.
| Time | Entity | Error class | Attempts | Next | Action |
|---|---|---|---|---|---|
| 08:13:04 | SalesOrder · SO006142 | PERMANENT · validation | 3 / 3 | held | Inspect |
| 07:55:22 | Customer · ABCORP01 | TRANSIENT · timeout | 2 / 5 | 09:50 | Retry now |
| 06:40:11 | StockItem · AALEGO500 | RATE_LIMIT · 429 | 1 / 5 | paced | Inspect |
Every record carries three identities at once: the Acumatica business key, the cross-session-stable NoteID GUID, and the Shopify GID. The middleware reads this row before every write and decides create, update, or skip.
A PUT with a $filter is a native upsert, so a record synced twice updates rather than duplicating. This is what stops Acumatica's documented Business-Customer contact duplication and double-posted orders before they reach your ledger.
Change detection runs on the stored checksum, so a catalog of 50,000 items with 12 real edits syncs 12 records, not 50,000.
entity key map · every id matched before write
Inside the platform
The same engineered parts run behind every ERP adapter. What changes for Acumatica is how we speak to it: the entity key map, the dead-letter queue, the error classifier and the rest are the platform. None of them is a setting you toggle.
01 / 10
The failure modes no vendor page admits
The native connector is strong, but it handles the happy path and skips the edge cases. These are the points it cannot reach under Plus-scale load. A custom middleware layer is built to handle all of them, explicitly.
The connector's "real-time" mode is two-phase and queue-backed: the change is recorded in Sync History immediately, but the posting into Acumatica waits for a scheduled run. In a flash sale, orders do not reach Acumatica fast enough, so it pushes a stale, higher count back to Shopify and re-opens sold-out stock. It is a lost-update race between two throttled systems, by design.
→ authoritative ledger, reserve-on-order, write-back guardAcumatica has no single stock level. Availability is computed per an Availability Calculation Rule assigned per Item Class, so "committed" is whatever that rule deducts. Rules that do not deduct open or on-hold orders make availability overstate stock and generate phantom backorders.
→ publish Available, never On Hand, consumed directlyThe connector does not support multiple captures against a single authorization. It imports only the first capture and ignores the rest, per Acumatica's own marketplace listing. On split-payment and partial-capture flows it silently under-records revenue.
→ model the full capture set, reconcile captured vs orderedThe connector does not map Acumatica warehouses to Shopify Locations, and does not give store-level control over which items pass to each store. It aggregates or publishes a single warehouse. Shopify Plus models inventory per Location, so segmenting multi-store or multi-region catalogs is custom work, not a toggle.
→ per-warehouse Available mapped to the right Shopify LocationAcumatica was the first ERP to support Shopify B2B and syncs the data well, but it has documented data-model failures: it generates new Individual-category customers for each contact of a Business Customer, and at random creates more than one location for a customer, activating one while deactivating the other.
→ deterministic hierarchy mapping through the entity key mapState lives in a Sync History grid with no permanent replay and no independent reconciliation. iPaaS retention is windowed: 30 to 90 days, the recent 20,000 errors, manual retry within roughly 30 days. You cannot replay an order from four months ago, and nothing proves Acumatica and Shopify agree.
→ permanent append-only ledger and a daily reconciliation passWhen a record fails
It is classified before it is retried, and nothing disappears into a Sync History grid. Colour carries the verdict: amber is sorted, teal retries, red is held, green replays.
A record fails to write to Shopify or Acumatica. Instead of disappearing into a Sync History grid, it enters the pipeline with full context.
capturedEvery failure is sorted before anything is retried, so a bad record never loops forever. An Acumatica HTTP 429 is a rate-limit, not a permanent fault.
Transient and 429 rate-limit failures retry with adaptive backoff and pacing, automatically, until they clear. At-least-once Push Notifications dedup on the payload Id.
retryingA permanent failure, a validation reject or a missing record, routes straight to the dead-letter queue for review. It is never retried blindly or lost.
held for reviewFix the cause, replay from the queue. A daily reconciliation pass catches anything the live path missed. The whole journey is on the audit trail.
replayed · reconciledClaims you can check
Every reality below is verified against a primary Acumatica source, a community thread with a staff answer, the marketplace listing, or a named vendor doc. This is the difference between a team that read the marketing and a team that shipped against the documentation.
Available, never On Hand. Available is computed per an Availability Calculation Rule assigned per Item Class, so two item classes compute it differently. Rules that do not deduct open or on-hold orders overstate stock and generate phantom backorders. The middleware consumes Available directly.api:concurrent_access unless you track the session cookie, or every call spins a new session and burns the concurrent-session license. And always log out.PUT with $filter is a native upsert, anchored by the cross-session-stable NoteID GUID. A Usr custom field can be promoted to first-class or read via $custom. A UDF or attribute rides $custom only, with a per-entity view name. A custom record needs a new endpoint. We run $adHocSchema per client to discover them.Shipment entity, then issue a separate ConfirmShipment action. The middleware treats shipment create and confirm as a two-step state machine with idempotency keys, and pushes the Shopify fulfillment and tracking only after confirm succeeds, or it notifies customers about shipments that later fail.Id is a transaction id provided so the consumer can deduplicate, and replying with an error causes redelivery. The SignalR destination is not reliable, since a missed notification cannot be resent later. Idempotency, dedup and ordering are the consumer's job, exactly what a custom layer owns.How long it takes
An Acumatica ⇄ Shopify Plus build lands in one of three bands depending on B2B complexity, the number of warehouses and stores, and how many of the break points above are in play.
Band 01 · foundation
single store · standard catalog
Band 02 · B2B
Shopify Plus B2B · price lists
Band 03 · multi-entity
multi-warehouse · multi-store
We price an Acumatica integration as an engineering engagement: a build with a support agreement, not a per-record meter or a platform seat that renews forever. The native connector itself has no separate license fee, since it is included in the Retail or Commerce Edition, so cost is mostly the storefront, the B2B experience and the Plus-scale reliability build. For context, enterprise iPaaS commonly runs $30,000 to $100,000+ a year before the work begins. Your exact figure is scoped to the band and the break points in play, and we put it in writing before anything starts.
Security posture
Acumatica and Shopify secrets are held as encrypted fields, isolated per tenant and rotatable without downtime. No secret sits in plaintext, anywhere.
Every Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id, so a replayed webhook cannot create a second order.
Authentication runs on OAuth 2.0 Authorization Code with refresh tokens, on a dedicated least-privilege integration user registered on Connected Applications. We request api and offline_access, and skip api:concurrent_access.
An append-only audit trail logs every operation, source-tagged, so you can prove what happened during month-end close.
The questions we have already answered
The details that separate a team that read the docs from a team that shipped against them. Open any one.
ManualPrice set), or let Acumatica price a SalesOrder line and read it back. In multi-entity clients we carry branch and currency on every call.Available via InventoryQuantityAvailable, consume it directly rather than re-deriving it, and map each warehouse onto the right Shopify Location so Plus can model inventory per Location.$adHocSchema discovery per client to map your exact view and field names, including any Usr custom fields and attributes, before mapping to Shopify metafields.The framework underneath
Every ERP sits behind the same contract: authenticate, fetch master data, push orders, validate, report. The platform runs in production today against a live enterprise ERP. Acumatica is a registered target on that same framework, its path mapped to the contract-based REST API, OAuth 2.0, the License-Monitoring throttle math, the entity catalog, the price cube and Push Notifications.
We say this plainly: the credibility is a real platform and a precisely understood Acumatica path, not a live Acumatica install. That distinction is exactly what your architect can verify, which is why we lead with it.
The engineering standard
The proof point comes first: for Clarius we built a unified account page integrating NetSuite ERP, Salesforce CRM and Shopify Plus into one view of customer information, orders and invoices, with Shopify Flow feeding order data back into the ERP. That is a NetSuite engagement, not an Acumatica one. It is here as pattern evidence for how we integrate Shopify Plus to an enterprise ERP. Then the numbers below, which are the platform's checkable standard.
NetSuite + Salesforce + Shopify PlusWe built a unified account page integrating Clarius' NetSuite ERP, Salesforce CRM and Shopify Plus into a single view of customer information, orders and invoices across enterprise systems, with Shopify Flow automation feeding order data into the ERP. That is a NetSuite engagement, here as pattern evidence for how we integrate Shopify Plus to an enterprise ERP, not an Acumatica build.
Automated tests across 139 suites, run on every change.
Coverage gate enforced before any deploy.
End-to-end browser tests across Chromium, Firefox and WebKit.
Failure classes, each with its own pre-decided policy.
Credentials stored in plaintext, anywhere, ever.
A real conversation about your Acumatica environment, your data, and the three sharp questions you already have.