ml-connector
SYSPROShipStation

SYSPRO and ShipStation integration

SYSPRO runs your manufacturing and distribution, holding customers, orders, items, and inventory. ShipStation handles your shipping and e-commerce order aggregation. Connecting them keeps your fulfillment in sync with your ERP: customer orders created in SYSPRO flow to ShipStation for label generation and tracking, shipment confirmations and carrier updates post back into SYSPRO inventory, and your fulfillment history stays auditable in both systems.

How SYSPRO works

SYSPRO Adaptive ERP exposes customers, sales orders, purchase orders, inventory, and financial records through two main REST/SOAP interfaces: OData (GET-only read via HTTP Basic Auth with SQL credentials, recommended for polling) and e.net Business Objects (read-write REST/SOAP with session tokens, higher complexity but required for writes). SYSPRO has no public webhook system for outbound events, so all data extraction relies on polling OData with timestamp-based filters on fields like InvoiceDate and PostDate. The API requires a customer-supplied server URL and operator credentials; there is no universal SaaS base address. Session tokens expire on logoff, and large XML payloads are better sent via SOAP/NetTcp than REST due to URL length constraints.

How ShipStation works

ShipStation is a cloud shipping platform that aggregates orders from e-commerce channels (Shopify, WooCommerce, Amazon, etc.), generates carrier-specific shipping labels, manages tracking, and handles inventory across multiple warehouses. It exposes orders, customers, products, shipments, and warehouses through REST APIs (V1 with HTTP Basic Auth for order management, V2 with API-Key header for label and inventory operations, both requiring HTTPS). ShipStation publishes webhook events for new orders, shipments, and fulfillment (ORDER_NOTIFY, SHIP_NOTIFY, FULFILLMENT_SHIPPED) but payloads contain only pointers, requiring authenticated follow-up GET calls. Order edits and new orders require polling because webhook events do not capture all changes.

What moves between them

Orders flow from SYSPRO into ShipStation. When a sales order is created or modified in SYSPRO, ml-connector polls the OData ArInvoice table on a schedule, maps each order to ShipStation's order structure, and creates or updates orders in ShipStation so they appear in the fulfillment queue. After ShipStation generates a shipping label and the carrier confirms pickup, ml-connector reads the SHIP_NOTIFY webhook (or polls shipments), extracts the tracking number and carrier code, and writes a shipment record back into SYSPRO for inventory allocation and fulfillment audit. Financial GL postings for freight charges can also be written back from ShipStation into SYSPRO's GenMaster table if configured.

How ml-connector handles it

ml-connector stores SYSPRO session credentials and ShipStation API keys encrypted and handles the different authentication paths: for SYSPRO it logs in via Utilities/Logon to obtain a session token, then passes the UserId on all OData requests; for ShipStation it passes the API key in the header (V1) or as HTTP Basic Auth (V2 legacy), and backs off when rate limits return HTTP 429. Because SYSPRO polls only (no webhooks), ml-connector polls the ArInvoice table every 5-15 minutes using OData filters on LastModifiedDate to detect new and changed orders. ShipStation webhooks notify on new orders and shipments, but the payload is a pointer, so ml-connector makes an authenticated follow-up GET to fetch the full order or shipment data. When a shipment is confirmed in ShipStation, ml-connector extracts the orderKey, tracking number, and carrier, converts the timestamp from ShipStation's PST/PDT zone to UTC, and writes the shipment confirmation into SYSPRO's InvMaster.InvWarehouse table to allocate inventory and close the fulfillment cycle. All records carry a full audit trail, timestamps, and error state so failed shipment writes can be replayed when SYSPRO is reachable.

A real-world example

A mid-sized discrete manufacturer with a direct-to-customer e-commerce channel uses SYSPRO to manage production, inventory, and AR, and ShipStation to aggregate orders from Shopify, Amazon, and their own website. Before the integration, the fulfillment team manually exported orders from each channel into a spreadsheet, entered them into SYSPRO sales orders by hand, then checked ShipStation for tracking numbers and manually updated SYSPRO shipments with the tracking data. This process created delays (orders waited in limbo), duplicate orders (operator entry errors), and month-end reconciliation pain (inventory accounts and fulfillment counts did not match). With SYSPRO and ShipStation connected, each e-commerce order is automatically created in SYSPRO as a sales order, flows to ShipStation's label queue without manual intervention, and when the carrier picks up the package, the tracking number posts back into SYSPRO inventory automatically. The fulfillment team now focuses on exceptions, and inventory and AR both reconcile cleanly at month-end.

What you can do

  • Create and update SYSPRO sales orders in ShipStation as orders so they flow into your fulfillment queue without manual entry.
  • Sync shipment confirmations and tracking numbers from ShipStation back into SYSPRO inventory records for fulfillment audit and GL allocation.
  • Map SYSPRO customer records to ShipStation so order history, customer notes, and addresses stay synchronized across both systems.
  • Handle SYSPRO's session token authentication and OData polling, and ShipStation's API key and webhook pointer model, including timezone conversion from PST/PDT to UTC.
  • Retry failed shipment writes to SYSPRO on a configurable cadence and maintain a full audit trail of every order and shipment record transferred.

Questions

How does ml-connector handle SYSPRO's session token expiry and polling-only model?
ml-connector logs into SYSPRO via Utilities/Logon at the start of each sync cycle and obtains a fresh session token, storing the UserId and passing it on all OData requests. Because SYSPRO does not push webhooks, ml-connector polls the ArInvoice and InvMaster tables every 5-15 minutes using OData filters on LastModifiedDate so it detects only new and changed records, reducing API load and latency.
Why does ml-connector need to follow up on ShipStation webhooks with a GET request?
ShipStation's webhook payloads contain only a resource_url pointer and resource_type, not the full order or shipment data. ml-connector makes an authenticated GET call to that URL within a tight time window to fetch the complete order, shipment, and tracking information before writing it back into SYSPRO. This design prevents duplicate processing and ensures accuracy.
What timezone conversion does ml-connector perform when syncing shipments?
ShipStation's V1 API datetime fields (ship date, label generation time, tracking events) are in PST/PDT, but SYSPRO expects timestamps in UTC for consistent audit logging and global inventory management. ml-connector converts ShipStation timestamps to UTC on ingest and handles daylight saving time boundaries automatically so month-end closing and inventory snapshots are auditable across time zones.

Related integrations

Connect SYSPRO and ShipStation

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started