01 / backbone
GP is the ledger
Finance, inventory, pricing, sales order processing. The authoritative record the business is actually run on, and it is running fine today.
Integration / Makro Middleware
Dynamics GP × Shopify Plus
Custom middleware for Shopify Plus that keeps GP authoritative today and survives your ERP migration tomorrow. Your ERP stays the system of record. Shopify Plus becomes where the order gets placed, and nobody re-keys a single order.
Microsoft Dynamics GP, formerly Great Plains, is where the ledger, the item master and the price cube live. Shopify Plus is where your buyer wants to be. The work is the space between, and on GP that space is wider than on any other ERP we integrate.
01 / backbone
Finance, inventory, pricing, sales order processing. The authoritative record the business is actually run on, and it is running fine today.
02 / front door
Where B2B buyers place repeat orders without a phone call, a rep, or a spreadsheet emailed to someone in customer service.
03 / the gap
Duplicate customers. Orders written twice. Pricing that drifts. Silent failures at month-end close, found by an accountant and not by a dashboard.
GP is the only sunsetting, on-premises ERP we integrate, and that changes the argument twice over. There is no cloud API, so there is no direct path: every transport terminates inside your LAN and a gateway is a structural requirement, not a preference. And Microsoft has published an end date, so the integration has to be portable. Middleware is not the better architecture here. It is the only one.
What syncs between Shopify and Dynamics GP: customers, price levels, items, and inventory are read out of GP and pushed to Shopify. The storefront never writes to your ledger. Orders are the only thing that travels both ways, and GP stays the source of truth.
Dynamics GP → Shopify Plus master data, one way
System of record · on-prem
SQL Server · eConnect · never overwritten
The platform
on-prem agent + cloud core · map · reconcile · audit
The storefront
where buyers self-serve
Every sync, every failure, every reconciliation is visible. This is the same Makro Middleware console your team would watch in production, on a demo tenant with a GP-shaped catalog. Move through the views.
| Time | Entity | Error class | Attempts | Next | Action |
|---|---|---|---|---|---|
| 08:13:04 | SOP order · WEB-0001038 | PERMANENT · eConnectException | 3 / 3 | held | Inspect |
| 07:55:22 | customer · RM00101 · CUST-00910 | TRANSIENT · agent link | 2 / 5 | 09:50 | Retry now |
| 06:40:11 | item qty · IV00102 · ITEM-44120 | RATE_LIMIT · paced | 1 / 5 | paced | Inspect |
Every record carries three identities at once: its GP key (CUSTNMBR, 15 characters), a canonical UUID the middleware owns, and its Shopify GID. The middleware reads this row before every write and decides create, update, or skip.
GP forces this. Its keys are short natural keys with no GUID at the API surface: CUSTNMBR 15, ITEMNMBR 30, SOPNUMBE 21. A Shopify GID does not fit in any of them, so the cross-reference map is ours to own. We stamp the GID into INTEGRATIONID for traceability and keep the join here.
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
Ten engineered subsystems sit between Dynamics GP and Shopify Plus. None of them is a setting you toggle. Each is something we built, and something your team can watch run.
01 / 10
Follow one failed eConnect write. GP's error model is real and legible: an eConnectException carries a SQL procedure error code you resolve against taErrorCode in the system database, plus Node Identifier Parameters showing the offending values. Colour carries the verdict: amber is sorted, teal retries, red is held, green replays.
An eConnect document is rejected, or the agent cannot reach SQL. Instead of disappearing into a Windows event log, it enters the pipeline and gets a verdict.
capturedEvery failure is sorted before anything is retried, so a bad record never loops forever. The eConnectException error code is resolved against taErrorCode and the Node Identifier Parameters name the offending field, so the class is a fact and not a guess.
A dropped agent link, a SQL timeout, or a Shopify 429 against the 1,000-point-per-second bucket backs off with exponential retry. Nothing is lost while it waits: inbound orders sit in the MSMQ queue.
A validation rejection routes straight to the dead-letter queue for review. This matters more on GP than anywhere else: eConnect does not roll back across documents, so a half-written import is a real state and compensation is the middleware's job, not the ERP's.
held for reviewFix the cause, replay from the queue. The SOPNUMBE is derived deterministically from the Shopify order, so a replay collides on the key rather than writing a second order. A daily reconciliation pass catches anything the live path missed.
replayed · reconciledDynamics GP to Shopify integrations break at predictable points. Every prebuilt connector and iPaaS template handles the happy path and skips these, because these are the parts that need a decision rather than a mapping.
eConnect creates transactions in work batches and cannot post them. There is no feature to programmatically post a batch in GP. So "order synced ✓" really means the order is sitting in an unposted batch in SOP10100 while GL, inventory relief and AR wait on a human.
→ posting status tracked as a first-class state, not write successAvailable is On Hand minus Allocated, per LOCNCODE, out of IV00102. But a Shopify order not yet exported and allocated in GP is already in Shopify's committed. Push GP available naively and you oversell by exactly the in-flight amount.
→ publish on-hand and let Shopify net it, or publish available only once open orders are allocatedNo GP API returns the price a specific customer would actually pay. GetPricingByKey takes item, price level, currency and unit of measure: no customer, no quantity, no date. Price Trace Inquiry, the thing that does resolve, is a client window and not a service.
→ resolve from the synced cube for display, let GP re-price on ingest with DEFPRICINGA company runs standard pricing or extended pricing, never both. Extended pricing's date-effective price sheets, price books and free-item promotions are not exposed by the read API at all. A template connector silently prices these merchants wrong.
→ SQL-level extraction plus order-time IncludePromo, scoped as its own workstreamGP's built-in user-defined fields auto-flow: customer USERDEF1 and USERDEF2, item USCATVLS_1 to 6 are first-class eConnect elements. Extender data does not. It lives in EXT00100, not on the host record, so it is absent inbound and outbound, and Web Services never auto-flows a custom field at all.
→ read over SQL, write through custom eConnect nodes in the same transactioneConnect has no idempotency-key mechanism. Nothing in the schema reference provides a dedupe token, and eConnect does not roll back across documents. Replay a create with a fresh document number and you get a second order in the ledger.
→ deterministic SOPNUMBE, so a replay collides instead of duplicatingEvery reality below is verified against a primary Microsoft or Shopify source, or a named vendor document. Four of them rest on what the documentation does not contain, which is exactly the point being made. This is the difference between a team that read the marketing and a team that shipped against the documentation.
Custom middleware vs a prebuilt connector is the question everyone asks, and the framing is usually wrong. All three routes below write through eConnect. Even SmartConnect converts its destination into eConnect XML. The choice is not about the write path. It is about who owns the mapping, the recovery, and the code.
Option 01
A packaged product with fixed field mappings over eConnect. Fast to stand up, and rigid by design.
Right for vanilla GP installs with standard fields, standard pricing, and no ISV modules in the order path.
Option 02
Flexible tooling on a shared platform, with a permanent fee. You still configure the GP side, and the agent still lives on your LAN.
Right for standard multi-system sync where the B2B logic fits a fixed-mapping template and the meter is acceptable.
Option 03 · our build
Built on eConnect around your exact order flow, pricing engine and customizations. Owned by you, operated with a support agreement.
Right for customized GP environments: B2B price levels into Shopify catalogs, extended pricing, multi-company, Extender and ISV tables, and any merchant who intends to still be selling after the migration.
Timeline and pricing on GP are driven by two answers we get in the first week: standard pricing or extended, and one company database or several. A build lands in one of three bands. We do not publish week counts we have not earned on a GP install.
Band 01 · foundation
single company · standard pricing · vanilla items
Band 02 · B2B
Shopify Plus B2B · the price cube
Band 03 · multi-entity + customization
multi-company routing · extended pricing · ISV tables
We price a Dynamics GP integration as an engineering engagement: a build with a support agreement, not a per-record meter or a platform seat that renews forever. For context, enterprise iPaaS commonly runs $30,000 to $100,000+ a year before the work begins. That is the market's number, not ours. Ours comes out of your discovery, and we will not quote a band before we have seen your pricing engine.
GP has no modern credential to give Shopify, and Shopify has no Windows identity to give GP. The middleware is the mandatory trust boundary, and neither credential ever crosses it.
The agent initiates every connection outbound to the middleware over TLS. No GP endpoint is published to the internet, no inbound firewall rule, no VPN into the ERP network. This is the same shape the working commercial connectors use, because the surface leaves no other option.
One dedicated non-interactive domain account, for example svc-econnect-shopify, vaulted and never shared with a human. Its SQL login joins DYNGRP only on the in-scope company databases. Never sysadmin, never domain admin. Reads use narrow GRANT SELECT where possible; writes go through eConnect procedures only. TLS is forced on the SQL connection, because GP encrypts only the pre-login exchange by default.
Every Shopify webhook is HMAC-verified against X-Shopify-Hmac-SHA256 before it is trusted, then deduplicated on X-Shopify-Webhook-Id. The admin token is offline-mode with least-privilege scopes, held in a secrets manager and never in job config. Shopify tokens cannot be rotated in place, so a rotation runbook ships with the build.
Credentials are encrypted fields, isolated per tenant, rotatable without downtime, and never in plaintext. An append-only, source-tagged audit trail logs every operation, so you can prove what happened during month-end close, including which documents were written and which batches were still open.
The details that separate a team that read the docs from a team that shipped against them.
Every ERP sits behind the same contract: connect, fetch companies, fetch products, fetch inventory, create the order. The sync engine, mapping layer, error handling and Shopify integration never change when a new system plugs in.
GP support ends in 2029. Integrate now, or migrate first? That is the question the VAR answers with "wait" and the connector vendor does not answer at all. It is the wrong question. A migration runs 9 to 18 months from decision to go-live and ecommerce revenue cannot wait for it, so the real question is whether the storefront survives the move.
The store integrates to the middleware, not to GP. A packaged connector is a rebuild in 2029. A middleware layer is an adapter swap.
Read this part carefully, because it is where most pages cheat. We have no Dynamics GP deployment to point at. The outcome below is a NetSuite build. It is here as pattern proof that we integrate Shopify Plus with enterprise ERPs and take manual entry out of the middle, and for no other reason. The five numbers beside it are platform claims about the middleware itself, counted in the repository, not telemetry from a GP install.
Clarius · a NetSuite outcome, not a GP oneWe 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 three enterprise systems. Combined with Shopify Flow automation feeding order data into NetSuite, it eliminated manual order entry and reduced operational costs by over $100,000 a year. Different ERP, same pattern: the store integrates to the layer, and nobody re-keys an order.
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 GP install, your pricing engine, and what happens to the storefront when you move to Business Central.