ml-connector
Sage 300ShipStation

Sage 300 and ShipStation integration

Sage 300 holds your order and inventory records. ShipStation manages shipping labels, carrier rates, and fulfillment tracking. Connecting them means orders created in Sage 300 flow to ShipStation automatically for label generation and carrier selection, and shipment status flows back into Sage 300 so your ERP knows which orders have shipped. No manual order entry into ShipStation, no spreadsheet reconciliation of ship dates against order records.

How Sage 300 works

Sage 300 is a Windows IIS-hosted ERP that exposes orders, customers, items, and inventory through REST and OData endpoints. Every request uses HTTP Basic Authentication with base64-encoded USERNAME:PASSWORD in the Authorization header, and both credentials must be uppercase. The API is polled only; there are no webhooks or push notifications. Sync uses OData filters on document dates and pagination to retrieve new or modified orders and inventory changes. The API requires an IIS-exposed HTTPS connection to your customer's server, and an API user must be created with the Web API security group assigned.

How ShipStation works

ShipStation is a cloud shipping platform accessed through REST APIs with API Key authentication. It aggregates orders from multiple sales channels, provides carrier rate shopping, generates shipping labels, and tracks shipment status. ShipStation V2 uses an API-Key header with no Bearer prefix, while V1 uses HTTP Basic Auth with base64-encoded apiKey:apiSecret. ShipStation supports webhooks for shipment events but webhook payloads are pointers only, requiring an authenticated follow-up GET call to fetch order and shipment details. Rate limits differ between V1 (40 requests/min) and V2 (200 requests/min).

What moves between them

Orders created in Sage 300 flow to ShipStation for fulfillment. When a shipment is marked as shipped in ShipStation, the shipment status and tracking information flow back into Sage 300 to update the order record and mark the goods as shipped. Inventory and customer data are synced from Sage 300 to ShipStation to keep product and customer records aligned. Reference data such as warehouses and shipping methods are aligned in both directions so orders route to the correct facility.

How ml-connector handles it

ml-connector stores Sage 300 credentials (username and password) encrypted and encodes them in base64 for every request to comply with HTTP Basic Auth. It stores the ShipStation API key encrypted and presents it in the API-Key header on every V2 call. Because Sage 300 has no webhooks, ml-connector polls Order Entry endpoints on a schedule you define, using OData date filters to find new and modified orders since the last sync. For shipment updates, ml-connector subscribes to ShipStation webhooks where they are enabled and falls back to polling for changes not caught by push. When a ShipStation webhook fires, ml-connector follows up with an authenticated GET to fetch full order and shipment details before writing status back to Sage 300. Rate limiting is observed on both sides: Sage 300 has no documented rate limits but can timeout under high request volume from IIS AppPool exhaustion, while ShipStation enforces per-minute request quotas with retry-after headers. Every record carries a full audit trail.

A real-world example

A mid-sized distributor runs Sage 300 for order entry, inventory, and accounting, and uses ShipStation to manage shipments across three warehouses and multiple carriers. Before the integration, warehouse staff entered orders into Sage 300, then manually logged into ShipStation to create shipments and select carriers, and at month-end the finance team matched ship dates from ShipStation back to order records in Sage 300 to verify revenue recognition. With Sage 300 and ShipStation connected, each order posted in Sage 300 automatically creates a shipment record in ShipStation so warehouse staff see all orders in one place, carrier rates are compared in ShipStation and the shipment status flows back to Sage 300 without re-entry, and revenue can be recognized as soon as an order is shipped because the two systems are synchronized.

What you can do

  • Send new orders from Sage 300 Order Entry to ShipStation for fulfillment, with customer and item detail pre-populated.
  • Receive shipment status and tracking information from ShipStation back into Sage 300 to mark orders as shipped.
  • Sync inventory levels from Sage 300 to ShipStation so stock quantities are accurate at order time.
  • Authenticate Sage 300 with HTTP Basic Auth and ShipStation with API Key, managing credentials encrypted at rest.
  • Poll Sage 300 on a schedule since it has no webhooks, and use ShipStation webhooks to catch shipment events in near real-time.

Questions

How does Sage 300 handle orders that are edited after they are sent to ShipStation?
Sage 300 has no webhooks, so ml-connector polls the Order Entry module on a schedule you set, using OData date filters to find orders modified since the last sync. If an order is edited in Sage 300 after it has already been sent to ShipStation, ml-connector will detect the change on the next poll and send an update to ShipStation if the order has not yet been shipped. Once an order is marked as shipped in ShipStation, it becomes immutable and cannot be updated via API, so changes in Sage 300 cannot be reflected downstream after that point.
Does ml-connector handle multiple warehouses and carriers in ShipStation?
Yes. Sage 300 and ShipStation both support multiple warehouses, and ShipStation automatically compares carrier rates and offers the best option. ml-connector syncs warehouse and carrier references from ShipStation back into Sage 300 so orders are routed to the correct fulfillment location. You control which warehouse receives which orders through ShipStation's rules and mapping.
What happens if ShipStation webhooks are not enabled?
ml-connector can operate without webhooks by polling ShipStation for shipment status on a schedule. Webhook mode provides faster notification when shipments are created or marked as shipped, but polling mode ensures no updates are missed. For large order volumes, a mix of both is recommended: webhooks catch most changes in near real-time, and a periodic poll catches any edge cases.

Related integrations

Connect Sage 300 and ShipStation

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

Get started