ml-connector
VismaShipStation

Visma and ShipStation integration

Visma.net ERP runs accounting, procurement, and inventory for mid-sized companies across the Nordic region. ShipStation manages fulfillment and shipping for e-commerce operations, aggregating orders from multiple sales channels and coordinating carrier shipments. When the two are connected, purchase orders created in Visma flow to ShipStation for fulfillment tracking, and shipment status flows back so procurement and finance have visibility into delivery timing without manual intervention.

How Visma works

Visma.net ERP is a cloud-based platform covering financial management, accounts payable, purchasing, inventory, payroll, and project accounting. It exposes suppliers, purchase orders, purchase receipts, customer invoices, accounts, dimensions, employees, and transactions through REST APIs with JSON payloads over HTTPS. Authentication is OAuth 2.0 via Visma Connect with client credentials grant; each API call requires an ipp-company-id header identifying the tenant company. Visma publishes events via webhooks with one-time delivery (no automatic retry) and supports polling using lastModifiedDateTime parameters on list endpoints. Test clients are rate-limited to 500 calls per hour per company, and updates to existing records require ETag headers for optimistic locking.

How ShipStation works

ShipStation is a cloud-based shipping and order management platform that aggregates orders from multiple e-commerce channels, provides carrier rate comparison, generates shipping labels, and tracks fulfillment. It exposes orders, customers, products, shipments, warehouses, and purchase orders through REST APIs in JSON format. Authentication uses API keys passed as headers (V2) or HTTP Basic Auth (V1); no OAuth flows are supported. ShipStation publishes webhook notifications for new orders and shipments, but the webhook payload contains only a pointer to the resource URL, requiring a follow-up authenticated GET call to retrieve actual data. Order edits and changes not caught by webhooks require polling via the modifyDate filter. V1 API calls are rate-limited to 40 requests per minute; V2 supports 200 per minute. Orders are immutable once marked shipped or cancelled, and all V1 timestamps are in PST/PDT, not UTC.

What moves between them

Purchase orders created in Visma flow into ShipStation to initiate fulfillment. As ShipStation tracks shipments through each carrier, ml-connector polls for status updates and syncs the shipment dates and tracking information back into Visma as purchase receipt records, tied to the original purchase order line items. Customer invoices in Visma can also be cross-referenced with ShipStation orders for revenue recognition when goods ship. The flow is primarily Visma-to-ShipStation for order initiation and ShipStation-to-Visma for fulfillment confirmation, running on a schedule aligned with order processing and daily shipment updates.

How ml-connector handles it

ml-connector obtains an OAuth 2.0 bearer token from Visma Connect using stored client credentials and includes the ipp-company-id header on every Visma API call. For ShipStation, it stores the API key encrypted and passes it in the Authorization header for V1 calls or the API-Key header for V2 calls. When a new purchase order is created in Visma, ml-connector reads it via the purchase order list endpoint and posts it to ShipStation as an order initiation. ShipStation webhooks notify ml-connector of shipment status changes, but since webhooks provide only resource pointers, ml-connector performs authenticated GET requests to retrieve full shipment details. To catch order edits not signaled by webhooks, ml-connector polls ShipStation's order endpoint with the modifyDate filter on a daily schedule. Because Visma does not issue refresh tokens to service applications, ml-connector obtains a fresh token on each expiry window by re-authenticating with client credentials. ShipStation's rate limits are respected with request queuing, and the PST/PDT timezone used by V1 timestamps is converted to UTC for consistent storage. Every synced record carries an audit trail with the original ShipStation order key and Visma purchase order number for traceability.

A real-world example

A Nordic-based kitchenware distributor uses Visma.net ERP for procurement, inventory, and accounting, and ships orders through ShipStation to multiple e-commerce marketplaces and direct retailers. Before the integration, procurement staff created purchase orders in Visma, then checked ShipStation manually to see when orders shipped, and had to re-enter shipment dates into Visma at month-end to match invoice dates with actual delivery dates. With ShipStation connected to Visma, each purchase order automatically initiates a fulfillment task in ShipStation, and once the order ships, the tracking information and delivery date flow back into Visma as a purchase receipt. The accounting team can now match invoices to actual shipments without manual checking, and procurement has real-time visibility into which orders are in transit or delayed.

What you can do

  • Sync purchase orders from Visma into ShipStation to initiate fulfillment without manual re-entry.
  • Track shipment status from ShipStation and post receipt dates back into Visma as purchase receipt records.
  • Map ShipStation order identifiers to Visma purchase order line items so fulfillment updates reach the correct procurement records.
  • Handle Visma's token refresh requirement and ShipStation's webhook pointer payloads by fetching full shipment details on each notification.
  • Poll ShipStation daily for order edits and status changes not caught by webhooks, maintaining consistency across both systems.

Questions

Which direction does data move between Visma and ShipStation?
Purchase orders flow from Visma into ShipStation to initiate fulfillment. Shipment status, delivery dates, and tracking information flow back from ShipStation into Visma as purchase receipt records tied to the original purchase order. Customer invoices in Visma can reference ShipStation orders for revenue recognition at shipment time.
How does ml-connector handle ShipStation's webhook pointer-only payloads?
ShipStation webhooks contain only a pointer to the resource URL, not the full shipment data. ml-connector responds immediately to the webhook notification, then performs an authenticated GET request to ShipStation to retrieve the complete shipment details, ensuring no data is lost if the resource is modified between webhook receipt and the follow-up call.
Why does ml-connector poll ShipStation if webhooks are available?
ShipStation webhooks notify on new orders and shipments, but not on order edits. ml-connector polls the order endpoint daily with the modifyDate filter to catch changes such as quantity adjustments, address corrections, or fulfillment delays that webhooks do not signal, so Visma stays synchronized with the authoritative ShipStation state.

Related integrations

Connect Visma and ShipStation

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

Get started