ml-connector
MYOBShipStation

MYOB and ShipStation integration

E-commerce merchants using ShipStation for order fulfillment and MYOB for accounting need their order and shipment data in sync. ShipStation captures orders from multiple sales channels with rates and tracking, while MYOB holds the financial record. Connecting the two ensures each order that ships creates an invoice in MYOB without manual re-entry, shipment tracking updates the corresponding invoice line items, and your GL accounts always reflect what actually left the warehouse.

How MYOB works

ShipStation exposes orders, customers, products, shipments, and warehouse inventory through REST APIs. The V1 API supports order CRUD, customer and product management, and warehouse configuration with 40 requests/minute rate limit and HTTP Basic Auth using an API key and secret. Webhooks push notifications for ORDER_NOTIFY and SHIP_NOTIFY events, but the payloads contain only pointers to the actual resources, requiring an authenticated follow-up GET to retrieve full order and shipment details. Once an order ships or is cancelled, it becomes immutable and cannot be updated via API. V2 API serves label creation, batch operations, and inventory but does not provide general order listing; full order management requires V1.

How ShipStation works

MYOB AccountRight Live API exposes contacts, purchase and sales orders, invoices, general ledger accounts, items, and journals through REST with OData v3 query parameters. OAuth2 Authorization Code flow generates 20-minute access tokens (1-week refresh tokens), and every API call requires two additional headers: the API Key and a Base64-encoded company file username/password pair. MYOB does not support webhooks or push notifications, so changes are detected by polling with OData $filter on LastModified timestamps. MYOB enforces a rate limit of 8 requests/second and 1,000,000 requests/day per API key, and all dates must be ISO 8601 format. Write operations require the RowVersion field; a stale RowVersion returns a 409 conflict.

What moves between them

Orders flow from ShipStation into MYOB as sales invoices. When a new order is received in ShipStation, ml-connector creates a matching invoice in MYOB under the same customer contact with line items matching the order items and quantities. When the order ships, ml-connector polls ShipStation for shipment status and updates the corresponding invoice in MYOB to mark items as fulfilled. Customer records are created in MYOB on first invoice if the customer does not already exist, mapped from ShipStation's customer data.

How ml-connector handles it

ml-connector stores ShipStation API Key and secret, and MYOB OAuth token plus company file username/password, with the latter encrypted in the credential store. On authentication, it presents ShipStation API Key via the Authorization header (no Bearer prefix) and MYOB credentials as both the OAuth Bearer token and the Base64-encoded CF credentials pair in the x-myobapi-cftoken header. Since ShipStation's ORDER_NOTIFY webhook returns only a pointer, ml-connector immediately retrieves the full order with a GET to ShipStation. Because MYOB has no native webhook system, ml-connector polls ShipStation and MYOB's LastModified field on a user-defined schedule to detect shipment updates. Idempotence is achieved by storing the ShipStation orderKey and checking for existing MYOB invoices before creating duplicates. MYOB's RowVersion field is read before any PATCH and included in the update to prevent conflicts from concurrent edits. Rate limiting is handled by respecting ShipStation's 40 req/min (V1) and MYOB's 8 req/sec, backing off on HTTP 429, and retrying with exponential jitter.

A real-world example

A mid-sized e-commerce merchant processes orders from multiple sales channels through ShipStation (website, marketplace, wholesale). The operations team picks and packs orders in ShipStation, generates labels and tracking, and ships them daily. Before the integration, the finance team downloaded a daily order report from ShipStation and manually re-entered each order as an invoice in MYOB to track revenue. With ShipStation and MYOB connected, each new order automatically creates an invoice in MYOB under the correct customer, and daily shipment batch updates mark invoices as fulfilled. Month-end revenue reconciliation is now automatic, and the re-entry step is eliminated.

What you can do

  • Create MYOB sales invoices from new ShipStation orders, matched to customer and line item details.
  • Update invoice line items in MYOB when orders ship in ShipStation, marking fulfillment status without re-keying.
  • Map ShipStation customers to MYOB contacts, creating contact records on first order if they do not exist.
  • Authenticate ShipStation with API Key and MYOB with dual OAuth plus company file credentials, both bridged in one flow.
  • Poll ShipStation and MYOB on a user-defined cadence to detect order and shipment updates, with idempotent deduplication on order key.

Questions

Do new orders in ShipStation automatically create invoices in MYOB?
Yes. When ml-connector receives an ORDER_NOTIFY webhook from ShipStation or detects a new order via polling, it creates a matching sales invoice in MYOB under the same customer contact with line items matching the ShipStation order items and quantities. If the customer does not exist in MYOB, ml-connector creates the contact record first.
How does ml-connector handle MYOB's dual authentication requirement?
MYOB requires both an OAuth2 access token and a company file username/password pair (sent as Base64 in the x-myobapi-cftoken header) on every API call. ml-connector stores both credentials encrypted, refreshes the OAuth token when a call returns 401, and includes the CF credentials on every request without additional round-trips.
Why does ml-connector poll instead of relying only on ShipStation webhooks?
ShipStation's SHIP_NOTIFY webhook payload contains only a pointer to the shipment resource, not the full data. ml-connector must authenticate and GET the actual shipment details, which can be rate-limited. MYOB has no webhooks at all, so ml-connector polls both systems on a schedule you define to detect all changes reliably and reduce the risk of missing updates.

Related integrations

Connect MYOB and ShipStation

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

Get started