Shopify + SYSPRO Integration
Sync stock and pricing from SYSPRO to Shopify, and send orders and customer records back. SYSPRO manages inventory and finance; Shopify does not write to your general ledger.
- mode:
- Bidirectional
- latency:
- Near real-time
- maturity:
- Production-tested
What syncs and how often
See what data moves, what starts the sync and how often it should run in your live system.
Products
- dir:
- SYSPRO → Shopify
- frequency:
- Every 15 min
Stock code is the join key. Only items flagged as web-published are pushed, so your full SYSPRO catalogue does not leak into the storefront.
Inventory
- dir:
- SYSPRO → Shopify
- frequency:
- Every 5 min
Available-to-promise, not raw on-hand. Warehouse-to-location mapping is explicit, so allocated and quarantined stock never shows as sellable.
Pricing
- dir:
- SYSPRO → Shopify
- frequency:
- Every 15 min
Base price list to Shopify price, contract price lists to B2B catalogues. Promotional pricing stays in Shopify to avoid a two-system tug of war.
Orders
- dir:
- Shopify → SYSPRO
- frequency:
- Near real-time (webhook)
Creates a SYSPRO sales order. Shopify order name lands in the customer PO field so support can search either system by the same reference.
Customers
- dir:
- Bidirectional
- frequency:
- Near real-time
B2C checkouts post against a single generic web debtor. B2B accounts map one-to-one to AR customers with their terms and credit limit.
Fulfillment
- dir:
- SYSPRO → Shopify
- frequency:
- Near real-time
Dispatch note closes the Shopify fulfillment and pushes the tracking number, which triggers the shipping notification.
How it works
SYSPRO is an on-premise ERP, so there is no public API to call from the cloud. The connection uses e.net Solutions and middleware that reaches it without exposing SYSPRO to the internet.
Shopify Admin API + webhooks
Order, customer, and fulfillment events fire webhooks. We verify the HMAC signature and drop the payload straight into a queue rather than processing inline, so a slow ERP can never cause Shopify to mark the endpoint as failing.
Queue + idempotency store
Every message carries the Shopify event id. Processed ids are recorded, so redelivery of the same webhook cannot create a duplicate sales order. This is the single most important component and the one most integrations omit.
Middleware worker
Where the mapping lives: stock code lookups, price list resolution, tax code translation, and warehouse selection. Hosted in your tenancy so business rules stay auditable and versioned.
SYSPRO e.net Solutions
The supported integration surface. We call the SORTOI business object for sales orders and INVQRY for stock queries rather than writing to SYSPRO tables directly, which would void support.
VPN or reverse tunnel
e.net stays inside your network. The worker reaches it over a site-to-site VPN or an outbound-only tunnel, so no inbound port is ever opened to the ERP host.
How we handle sync issues
When a sync fails, you need a clear alert and a safe way to recover.
Shopify API rate limits during catalogue pushes
A bulk price update stalls halfway and half the catalogue shows yesterday’s prices.
handling
Writes go through the GraphQL bulk operations endpoint instead of per-item REST calls, with a token-bucket limiter and exponential backoff on 429 and THROTTLED responses. Partial batches resume from the last acknowledged cursor rather than restarting.
Stock code and SKU drift
A product silently stops updating after someone renames a SKU in Shopify.
handling
The stock code is the immutable key and lives in a Shopify metafield, not the SKU field. Unmatched codes go to a reconciliation queue that emails a digest rather than failing silently. Nothing is auto-created in SYSPRO.
Tax treatment mismatch
Shopify order totals and SYSPRO invoice totals differ by cents, and finance refuses to sign off.
handling
Shopify is treated as authoritative for tax charged at checkout. We pass the calculated tax through to explicit SYSPRO tax codes instead of letting the ERP recalculate, then reconcile rounding at the line level so the invoice ties to the payout.
Multi-location inventory oversell
Two customers buy the last unit within the same sync window.
handling
A configurable buffer on fast-moving lines, plus location-level mapping so each Shopify location draws from one SYSPRO warehouse. Oversells are reduced, not eliminated: any polling integration has a window, and we tell clients that up front rather than promising zero.
Partial fulfillments and backorders
A customer gets a "shipped" email for the whole order when only two of three lines went out.
handling
Each dispatch note creates its own Shopify fulfillment against the specific line items, leaving the balance open. Backordered lines stay unfulfilled with an expected date, so the notification matches what is physically in the box.
ERP downtime during month-end
SYSPRO is locked for period close and every order sync fails at once.
handling
Failures are expected, not exceptional. Messages stay queued with a dead-letter path and replay in order once e.net answers again. Nothing is dropped and no order needs re-keying.
How your data fields connect
Compare this sample Order → SYSPRO SalesOrder mapping with the fields in your system.
Order → SYSPRO SalesOrder
shopify → syspro
order.nameSalesOrder.CustomerPoNumberSearchable in both systems
order.idSalesOrder.SpecialInstrsNumeric id for support lookups
line_item.skuSoDetail.MStockCodeline_item.quantitySoDetail.MOrderQtyline_item.priceSoDetail.MPriceTax-exclusive
shipping_addressSalesOrder.ShipAddress1-5customer.emailArCustomer.Emailtotal_taxSoDetail.TaxCodePassed through, not recalculated
Representative defaults from live builds. Your mapping will differ: custom SYSPRO fields and B2B price lists are decided during the audit.
Timeline and cost
typical duration
6 to 10 weeks
included in scope
- Discovery and field-level mapping document
- Six objects bidirectional with the matrix above
- Idempotent queue, retry, and dead-letter handling
- Monitoring dashboard and failure alerting
- Two weeks of hypercare after go-live
- Runbook and handover for your internal team
what moves it up
- Multiple SYSPRO companies or more than three warehouses
- B2B contract pricing with customer-specific catalogues
- Historical order and customer backfill
- Custom SYSPRO business objects or heavily modified install
- Additional endpoints such as a 3PL or marketplace
Common questions
Does SYSPRO have a native Shopify connector?
No. SYSPRO ships no first-party Shopify connector, and there is no reliable app-store option that covers bidirectional order and inventory sync. Every production Shopify SYSPRO integration is built on e.net Solutions with a middleware layer in between. Treat any vendor claiming a one-click SYSPRO connector with suspicion.
Can SYSPRO run on-premise and still sync with Shopify?
Yes, and most SYSPRO installs are on-premise. The middleware reaches e.net over a site-to-site VPN or an outbound-only reverse tunnel, so you never open an inbound port to the ERP host. Your IT team keeps SYSPRO behind the firewall and only the broker holds credentials.
How close to real-time is the inventory sync?
Inventory polls every five minutes by default, and order and fulfillment events are near real-time because they are webhook-driven. Truly instant inventory is not achievable with e.net polling, so on fast-moving lines we set a small availability buffer instead of pretending the window does not exist.
What happens to orders if SYSPRO goes down?
Shopify keeps taking orders. Each order webhook lands in a durable queue, and if e.net is unreachable the messages wait and replay in order once it recovers. This matters most at month-end when SYSPRO is locked for period close. Nothing is lost and nobody re-keys orders by hand.
Will this integration write to our general ledger?
No. Shopify creates sales orders and AR customer records, and your existing SYSPRO posting rules handle the GL exactly as they do for orders taken by phone. We deliberately avoid writing directly to financial tables, both because it voids SYSPRO support and because finance needs one posting path to audit.
How do you handle B2B customers with contract pricing?
Contract price lists stay in SYSPRO and map to Shopify B2B catalogues per company. A logged-in wholesale buyer sees their negotiated price because it was resolved from their AR account, not from a discount code. This needs Shopify Plus for the B2B objects, and it is the main thing that extends the scope and timeline of a SYSPRO project.
Plan your SYSPRO integration
Share your SYSPRO version, warehouse count, and order volume. Get a sync plan and fixed price.
