ml-connector
Wave AccountingShipBob

Wave Accounting and ShipBob integration

Wave Accounting tracks your financials. ShipBob manages your e-commerce fulfillment and storage. Connecting them ensures your books reflect the true cost of fulfillment. Shipment events and billing charges from ShipBob flow into Wave so your accounts payable stays current with what you owe ShipBob for storage and fulfillment services. Order and shipment data syncs so Wave knows which customers ordered what and when it shipped.

How Wave Accounting works

Wave Accounting exposes invoices, customers, products, accounts, transactions, and vendors through a GraphQL single-endpoint API at https://gql.waveapps.com/graphql/public, authenticated via OAuth2 Authorization Code flow with 2-hour access tokens and longer-lived refresh tokens requiring the offline_access scope. The connected business must maintain an active Wave Pro subscription. Wave supports webhooks for invoice and transaction events, with 5-minute replay window protection via HMAC-SHA256 signature verification, and retries failed deliveries until it receives an HTTP 200.

How ShipBob works

ShipBob exposes orders, shipments, products, inventory, warehouse receiving orders, returns, and billing through REST APIs at https://api.shipbob.com with a 2026-01 versioned path prefix, authenticated via OAuth2 Authorization Code flow (1-hour access token, 30-day refresh token) or personal access tokens. Every call requires the shipbob_channel_id header to identify which application channel is acting, and writes are only permitted on behalf of your own channel. ShipBob uses webhook-only sync for order, shipment, receiving, return, and billing events, with HMAC-SHA256 v1 envelope signature verification.

What moves between them

Billing and shipment data flows from ShipBob into Wave Accounting. When ShipBob creates a fulfillment charge or refund, ml-connector reads the billing details and creates or updates a corresponding transaction in Wave, matched to the Wave customer and account that corresponds to ShipBob's channel and order reference. Shipment events (shipped, delivered, tracking updated) flow to Wave as transaction notes or memo fields so Wave invoices tie to actual fulfillment status. Wave customer and invoice data is read-only in this direction; ShipBob does not write back to Wave.

How ml-connector handles it

ml-connector stores both Wave refresh tokens and ShipBob OAuth credentials encrypted. On the Wave side, it refreshes the OAuth token when calls return 401 and maps the business ID from Wave's GraphQL response to identify which Wave business owns each integration. On the ShipBob side, it includes the shipbob_channel_id header on every request (the channel ID is stored per integration and provided at setup), refreshes the ShipBob access token on 401, and verifies incoming webhook signatures using the HMAC-SHA256 v1 envelope with the webhook-id and webhook-timestamp headers. Billing charges and refunds from ShipBob are mapped to Wave accounts based on transaction type (fulfillment fee, storage, returns processing), and each shipment event updates a Wave transaction memo or creates a linked transaction record for audit. ShipBob's 1-hour access token is cached to avoid refresh churn across webhook batches, and failed Wave transaction creates are retried with exponential backoff since Wave accepts no idempotency key for transactions.

A real-world example

A small e-commerce business ships inventory through ShipBob's fulfillment centers and uses Wave Accounting to manage its books. Before the integration, the finance team received ShipBob invoices monthly, manually categorized storage and fulfillment fees by product line, and entered them into Wave as expense transactions. Reconciling ShipBob charges took hours and often missed returns credits. With Wave Accounting and ShipBob connected, each billing event from ShipBob creates a Wave transaction automatically, mapped to the correct expense account, and shipment notifications update order status in Wave so the finance team can see which invoices have shipped and when.

What you can do

  • Sync ShipBob billing charges and refunds into Wave Accounting transactions, mapped to the correct customer and account.
  • Capture shipment events from ShipBob (shipped, delivered, tracking updated) and link them to Wave invoices for fulfillment visibility.
  • Authenticate Wave with OAuth2 refresh tokens and ShipBob with OAuth2 or personal access tokens, managing the required shipbob_channel_id header on every call.
  • Verify webhook signatures for both systems using HMAC-SHA256 and protect against replay attacks.
  • Reconcile fulfillment costs by matching ShipBob billing events to Wave expense accounts, with full audit trail and error replay on failed syncs.

Questions

Which direction does data flow between Wave and ShipBob?
Billing and shipment data flow from ShipBob into Wave Accounting. Fulfillment charges, refunds, and shipment events create or update Wave transactions so your books reflect what you owe ShipBob and which orders have shipped. Wave customer and invoice data is read-only; ml-connector does not write orders or invoices back to ShipBob.
How does ml-connector handle ShipBob's channel_id requirement and signature verification?
ml-connector stores the shipbob_channel_id per integration and includes it on every ShipBob API call, since writes are only permitted on behalf of your own channel. For webhooks, it verifies the HMAC-SHA256 v1 envelope signature using the webhook-id and webhook-timestamp headers, protecting against replay and tampering.
How are ShipBob billing charges mapped to Wave accounts?
ShipBob charges are categorized by type (fulfillment fee, storage, returns processing) and mapped to the Wave accounts you designate during setup. Each charge becomes a Wave transaction linked to the corresponding customer and ShipBob order, so your expense accounts stay current and you can drill into fulfillment costs by order or date range.

Related integrations

Connect Wave Accounting and ShipBob

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

Get started