ml-connector
Sage 50ShipStation

Sage 50 and ShipStation integration

Sage 50 handles accounting and inventory. ShipStation manages fulfillment and multi-channel orders. When you connect them, sales orders from ShipStation map into Sage 50, and shipment confirmations flow back to update inventory receipts and trigger customer invoicing. ml-connector runs on your Windows server where Sage 50 lives, speaks the local SDK, and pulls shipment data from ShipStation on a schedule aligned with your order rhythm.

How Sage 50 works

Sage 50 is a desktop accounting application available in US (Sage 50 US, formerly Peachtree) and UK (Sage 50 Accounts, formerly Sage Line 50) editions. It exposes customers, sales orders, purchase orders, sales invoices, inventory items, and general ledger accounts through a local .NET SDK (US) or Sage Data Objects COM/ActiveX interface (UK). Authentication uses local Windows username and password against the Sage 50 user database, and the SDK requires direct access to the company data files on the same machine or LAN. There are no webhooks or remote APIs; all reads are polling via LastModifiedDate or TransactionDate, and the minimum polling interval is 5 to 15 minutes for near real time sync.

How ShipStation works

ShipStation is a cloud shipping and order management platform that exposes orders, customers, shipments, and products through REST endpoints. The V2 API is the current platform (https://api.shipstation.com/v2) and uses header-based API Key authentication with no OAuth. Webhooks push notifications for order and shipment events like FULFILLMENT_SHIPPED, but webhook payloads contain only resource pointers, requiring authenticated follow-up GET calls to fetch the actual data. Order updates require polling via GET /orders with a modifyDate filter, since ORDER_NOTIFY fires only on new orders. Rate limits are 200 requests per minute for V2 and 40 requests per minute for V1, with limit headers returned on each response.

What moves between them

Orders and customer records flow from ShipStation into Sage 50. ml-connector polls ShipStation for new and modified orders at a configurable interval, maps customer names and address information into Sage 50's customer file, and creates or updates sales order records in Sage 50 with line items, quantities, and pricing from ShipStation. Shipment and fulfillment notifications flow the other direction: when ShipStation marks an order as shipped, ml-connector receives the webhook, fetches the full shipment details, and writes a goods receipt or fulfillment record into Sage 50's inventory ledger so your stock quantities and cost of goods sold postings stay in sync. Sales invoicing is then triggered from the receipt records.

How ml-connector handles it

ml-connector runs as a process on the Windows machine where Sage 50 is installed, so it can access the Sage 50 SDK directly and authenticate with the local Sage 50 user database. For ShipStation, it stores the API Key encrypted in Sage 50's own audit database or a local secure config, and presents it on every REST call to ShipStation. The polling cycle fetches orders from ShipStation with a modifyDate filter to find changes since the last run, and the webhook receiver listens for FULFILLMENT_SHIPPED events; when a webhook arrives, ml-connector fetches the full shipment payload and maps shipment quantities back to the corresponding sales order in Sage 50. ShipStation's rate limits are respected with exponential backoff on 429 responses. Because ShipStation customer records have no unique stable ID that maps to Sage 50 customers, ml-connector matches by email or name during the first sync and stores the pairing, then uses that mapping on all future orders. Sage 50's UK edition requires the DataPath full path to the company folder; the US edition requires the CompanyPath and ApplicationID. All timestamps from ShipStation are in PST/PDT and are converted to local time on ingestion. Each order and shipment record carries a full audit trail and can be replayed if a Sage 50 post fails.

A real-world example

A mid-sized ecommerce retailer uses Sage 50 for bookkeeping and inventory, and routes orders from their Shopify and Amazon storefronts through ShipStation for label printing and fulfillment tracking. Before the integration, the warehouse team printed packing slips from ShipStation, picked and shipped the orders, then the office staff manually entered each order into Sage 50 by hand to update inventory and trigger customer invoicing. With the integration in place, orders flow automatically into Sage 50 when they arrive in ShipStation, inventory quantities decrement when ShipStation marks the order as shipped, and the sales invoice is generated without re-keying, cutting manual entry by 20+ hours per week.

What you can do

  • Pull orders from ShipStation and create matching sales orders in Sage 50 with customer names, addresses, line items, and quantities.
  • Receive ShipStation shipment notifications via webhook and post goods receipts into Sage 50 inventory to keep stock quantities current.
  • Map ShipStation customers to Sage 50 customer records by email or business name and maintain the pairing across future syncs.
  • Respect ShipStation rate limits and retry failed API calls with exponential backoff so transient network issues do not stall the flow.
  • Run on your Windows machine where Sage 50 is installed, encrypting credentials and using the local SDK to write directly into your company data files.

Questions

Why does ml-connector need to run on the Windows machine where Sage 50 is installed?
Sage 50 is a desktop application with no remote API. The local .NET SDK or COM interface is the only way to read and write data, and the SDK requires direct file access on the same machine or LAN. ml-connector runs as a Windows process on that machine so it can authenticate with the local user database and communicate with Sage 50 directly.
How does ml-connector handle customer matching between ShipStation and Sage 50?
ShipStation and Sage 50 use different customer identity schemes, so ml-connector matches on email address first, then business name as a fallback. Once a match is confirmed, the pairing is stored in ml-connector's audit trail and reused on all future orders from that customer, eliminating duplicate matching overhead and preventing accidental customer record splits.
What happens if ShipStation receives an API rate limit response while syncing an order?
ml-connector detects the 429 HTTP response and backs off with exponential jitter before retrying, respecting ShipStation's 200-request-per-minute limit. If a transient network issue causes a Sage 50 write to fail, the order record is logged with full context and can be replayed manually or automatically once the issue is resolved.

Related integrations

Connect Sage 50 and ShipStation

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

Get started