ml-connector
Sage 100ShipStation

Sage 100 and ShipStation integration

Sage 100 runs accounting and order management on-premises. ShipStation runs order fulfillment and carrier management in the cloud. Connecting them keeps orders flowing from Sage 100 into ShipStation for packing and shipping, and brings shipment tracking back into Sage 100's sales orders and AR records. New sales orders in Sage 100 move to ShipStation within minutes, inventory levels stay aligned, and customers see accurate tracking data without re-keying.

How Sage 100 works

Sage 100 is on-premises and exposes AR customers, sales orders, sales order lines, items with inventory, AP vendors, GL accounts, and journal entries through SOAP web services (eBusiness Web Services) or via a local Windows agent wrapping the COM (BOI) layer. SOAP covers sales orders and customers but not AP, GL, PO, or vendors. The full AP, GL, and PO data set requires the COM agent running on the customer's Sage 100 server. Sage 100 uses username and password authentication with no OAuth or token refresh, requires an explicit company code (three-character identifier) on every call, and has no webhooks - all data reads are polls on a schedule.

How ShipStation works

ShipStation is a cloud REST API with two active versions - V1 and V2 - both serving different purposes. V1 handles order CRUD, customer and product management, and warehouse operations with HTTP Basic Auth (base64-encoded apiKey and apiSecret). V2 handles label creation, batch operations, inventory management, and purchase orders with API Key header authentication. ShipStation supports webhooks for order and shipment events, but webhook payloads contain only a resource pointer and require an authenticated follow-up GET to retrieve actual data. Rate limits are 40 requests per minute on V1 and 200 requests per minute on V2. All V1 timestamps are in PST/PDT zone, not UTC. Orders once shipped or cancelled cannot be modified.

What moves between them

Sales orders and inventory flow from Sage 100 into ShipStation. Each new sales order in Sage 100 triggers a poll that reads the order, associated line items, and item master records, then creates a shipment record in ShipStation with the customer and line detail. Inventory levels from Sage 100 are synced to ShipStation warehouses on a schedule. Shipment tracking flows back to Sage 100 by polling ShipStation's order status and carrier tracking data; ml-connector updates the sales order header and AR invoice record with the tracking number and estimated delivery date.

How ml-connector handles it

ml-connector stores the Sage 100 SOAP endpoint URL, username, and password (encrypted), and the ShipStation V1 and V2 API keys (encrypted). For Sage 100, it passes the company code on every SOAP call and parses the COM response structure when using the local agent. For ShipStation, it constructs HTTP Basic Auth headers for V1 calls, manages rate limit backoff by reading the X-Rate-Limit-Remaining header, and converts all V1 timestamps from PST/PDT to UTC on ingest. When a webhook arrives from ShipStation with a shipment event pointer, ml-connector immediately fetches the full shipment record using the authenticated GET, extracts carrier and tracking number, and then queries Sage 100 for the matching sales order to update it. For outbound syncs, ml-connector polls Sage 100's sales orders table (by DateCreated or DateLastUpdated), reads the order header and lines, looks up item master records for pricing and GL account mappings, and posts the order to ShipStation as a new fulfillment request. High-frequency polls (orders every 15 minutes, shipments every 5 minutes) require connection pooling and backoff on Sage 100's COM locking behavior; ml-connector retries with exponential backoff. Every record carries a full audit trail.

A real-world example

A mid-sized wholesale distributor runs Sage 100 on-premises for AP, AR, GL, inventory, and order management, and uses ShipStation to consolidate orders from three e-commerce channels and automate carrier selection and label printing. Before the integration, warehouse staff printed orders from Sage 100 by hand, entered them manually into ShipStation, then monitored ShipStation for tracking numbers and re-entered them back into Sage 100's AR records. With Sage 100 and ShipStation connected, each order in Sage 100 moves to ShipStation automatically within minutes, warehouse staff scan barcodes and print labels from ShipStation's picking lists, and shipment tracking flows back into the AR invoice, so the customer-facing portal shows accurate status. Inventory adjustments in Sage 100 sync to ShipStation warehouses so overselling and stockouts are prevented.

What you can do

  • Sync sales orders and line items from Sage 100 to ShipStation for fulfillment as soon as they are created.
  • Keep inventory levels aligned between Sage 100 item masters and ShipStation warehouses on a configurable schedule.
  • Capture shipment tracking numbers and carrier information from ShipStation and update the Sage 100 sales order and AR invoice record with delivery date and tracking.
  • Handle Sage 100's company code requirement, SOAP authentication, COM record locking, and ShipStation's rate limits, timezone conversion, and API Key rotation.
  • Store all API credentials encrypted and provide a full audit trail of every sync, with manual replay capability if a downstream update fails.

Questions

Does ml-connector connect to Sage 100 over the network or on the customer server?
ml-connector connects over HTTPS to the Sage 100 SOAP endpoint, which runs on the customer's on-premises IIS server. For AP, GL, and PO data that SOAP does not expose, ml-connector requires a local Windows agent running on the customer's Sage 100 server that wraps the COM (BOI) layer and exposes it as a secured local API. The agent authenticates with Windows service credentials plus an API key or mTLS certificate.
What happens when ShipStation returns a webhook event?
ShipStation webhook payloads contain only a resource pointer (a URL) and resource type (order or shipment), not the full data. ml-connector immediately fetches the full record by making an authenticated GET call to the resource URL, extracts the tracking number and carrier, and then updates the matching Sage 100 sales order and AR invoice record. This is done within a tight time window before the shipment state can change again.
How does ml-connector handle Sage 100's lack of webhooks and ShipStation's rate limits?
ml-connector polls Sage 100 on a fixed schedule (typically every 15 minutes for orders, hourly for inventory) because Sage 100 has no webhooks. For ShipStation, ml-connector reads the rate limit response headers on every request, backs off with exponential jitter if approaching the limit, and resumes once the reset window passes. Both systems are monitored for failures, and ml-connector provides a replay mechanism so a failed sync can be restarted from the audit log.

Related integrations

Connect Sage 100 and ShipStation

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

Get started