Shopify + SYSPRO Integration
Stock and pricing flow out of SYSPRO into Shopify. Orders and customers flow back in as sales orders and AR accounts. SYSPRO stays the system of record for inventory and finance; Shopify never writes to your GL.
- mode:
- Bidirectional
- latency:
- Near real-time
- maturity:
- Production-tested
what syncs
What syncs, which way, and how fast
Every row is a real data flow with a real trigger. The frequency column is what you should expect in production, not a best case.
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.
architecture
How it actually works
SYSPRO is an on-premise ERP, so there is no public API to call from the cloud. Everything hinges on the e.net Solutions layer and a broker that can reach 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.
failure modes
What breaks, and what happens when it does
Every integration fails eventually. The difference between a good one and a bad one is whether it fails safely and tells you.
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.
field mapping
A real slice of the mapping
This is an abridged Order → SYSPRO SalesOrder mapping, shown so you can sanity-check it against your own 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.
implementation
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
questions
Questions buyers actually ask
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.
shopify + syspro
Get a SYSPRO integration scope, not a sales call
Send us your SYSPRO version, warehouse count, and order volume. We will come back with the sync matrix for your setup and a fixed price.