ml-connector
VismaShipBob

Visma and ShipBob integration

Visma runs financial management and inventory for Nordic distributors and manufacturers. ShipBob handles the fulfillment and warehouse operations. Connecting the two keeps your inventory counts aligned across systems and automates the recording of shipments and receiving events into your Visma GL. New purchase receipts arrive at ShipBob fulfillment centers, and ml-connector records them in Visma. Shipments leave ShipBob, and the tracking and financial impact flow back into your Visma purchasing ledger without manual re-entry.

How Visma works

Visma.net ERP is a cloud accounting and financial management platform serving the Nordic region. It exposes suppliers, purchase orders, purchase receipts, customer invoices, inventory accounts, dimensions, and journal transactions through REST APIs over HTTPS, authenticated with OAuth 2.0 client credentials and a tenant_id. Visma supports both webhooks (one-time delivery, no automatic retry) and polling via lastModifiedDateTime query parameters on list endpoints. All API calls require the ipp-company-id header. Webhook events must be explicitly enabled in company settings, and test clients are rate-limited to 500 calls per hour per company.

How ShipBob works

ShipBob is a fulfillment and warehouse management platform where merchants store and ship inventory from distributed fulfillment centers. It exposes orders, shipments, products, inventory levels, warehouse receiving orders, returns, and billing through REST APIs, authenticated with OAuth 2.0 access tokens or Personal Access Tokens with a shipbob_channel_id header. ShipBob communicates exclusively through webhooks with event topics covering order.shipped, order.shipment.tracking.updated, order.shipment.delivered, return.created, wro.created, and billing.charge.created. Webhook signatures are verified with HMAC-SHA256; OAuth tokens expire after one hour and refresh tokens after 30 days.

What moves between them

The main data flow runs bidirectionally. ShipBob sends inbound warehouse receiving orders, shipments, and tracking events via webhooks; ml-connector records these in Visma as purchase receipts and updates inventory transaction records. Outbound from Visma, ml-connector reads purchase orders and sends them to ShipBob as inbound receiving orders to the correct fulfillment center. Inventory levels synced from ShipBob are reconciled against Visma's perpetual inventory accounts. Returns initiated in ShipBob flow back to Visma as credit memos or purchase receipt adjustments.

How ml-connector handles it

ml-connector stores OAuth credentials encrypted and refreshes the Visma token on expiry by posting to Visma Connect's /connect/token endpoint with client_id, client_secret, and tenant_id. Every ShipBob webhook is verified with HMAC-SHA256 using the webhook-signature header; invalid signatures are rejected with a 401 response to stop further delivery attempts. On receipt of a ShipBob wro.completed event, ml-connector maps the fulfillment center location to a Visma warehouse dimension and posts a purchase receipt transaction with the correct GL account and inventory subaccount. Shipment tracking updates are written to Visma as journal entries tagged with the original purchase order reference. Inventory weights from ShipBob are converted from ounces to Visma's unit system. Because Visma webhooks lack automatic retry, ml-connector polls lastModifiedDateTime on purchase orders every 15 minutes as a fallback. Every transaction is audited with source event IDs so replay is possible if a downstream write fails.

A real-world example

A Nordic e-commerce distributor uses Visma ERP for purchasing, AP, and inventory accounting, and uses ShipBob for fulfillment across three northern European fulfillment centers. Before integration, the operations team received purchase orders in Visma, manually created warehouse receiving orders in ShipBob, and then waited for ShipBob to email a shipment manifest before manually recording the received inventory and shipment cost in Visma. Month-end inventory close required comparing Visma's perpetual counts against ShipBob's actual on-hand balances by hand. With Visma and ShipBob connected, each inbound shipment to ShipBob creates a purchase receipt in Visma automatically, inventory levels stay synchronized, and outbound shipments are recorded in Visma the moment ShipBob ships, eliminating the manual reconciliation step and freeing month-end to focus on GL analysis instead of data entry.

What you can do

  • Record ShipBob warehouse receiving orders as purchase receipts in Visma with correct GL accounts and inventory subaccounts.
  • Sync ShipBob shipment tracking and delivered events as journal entries in Visma tied to the original purchase order.
  • Keep Visma inventory balances aligned with ShipBob fulfillment center on-hand counts and reconcile differences automatically.
  • Verify ShipBob HMAC-SHA256 webhook signatures on every inbound event and refresh Visma OAuth tokens before expiry.
  • Map ShipBob fulfillment center locations to Visma warehouse dimensions and convert inventory units from ounces to Visma system of measure.

Questions

How does ml-connector handle ShipBob webhook signature verification?
Every ShipBob webhook includes webhook-id, webhook-timestamp, and webhook-signature headers. ml-connector verifies the HMAC-SHA256 signature using your ShipBob secret key; if the signature does not match, it rejects the webhook with a 401 response to prevent further delivery attempts. This ensures only authentic ShipBob events are processed.
What happens if a Visma OAuth token expires during a transaction write?
ml-connector detects a 401 response from Visma and proactively refreshes the token by posting to Visma Connect with your client credentials and tenant_id. The transaction is then retried with the new token. If the token cannot be refreshed, the transaction is queued for replay when connectivity is restored.
How are ShipBob fulfillment center locations mapped to Visma inventory accounts?
Each ShipBob location is mapped to a Visma warehouse dimension and inventory subaccount configured per customer. When ml-connector records a warehouse receiving order from ShipBob, it posts the transaction to the mapped Visma account so inventory balances reflect which fulfillment center holds the stock.

Related integrations

Connect Visma and ShipBob

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

Get started