Shopify logo
SYSPRO logo

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.CustomerPoNumber

    Searchable in both systems

  • order.idSalesOrder.SpecialInstrs

    Numeric id for support lookups

  • line_item.skuSoDetail.MStockCode
  • line_item.quantitySoDetail.MOrderQty
  • line_item.priceSoDetail.MPrice

    Tax-exclusive

  • shipping_addressSalesOrder.ShipAddress1-5
  • customer.emailArCustomer.Email
  • total_taxSoDetail.TaxCode

    Passed 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.