ml-connector
OdooShipBob

Odoo and ShipBob integration

Odoo manages your accounting, purchasing, and inventory. ShipBob runs your fulfillment centers and handles warehouse operations. When you connect the two, products and purchase orders flow from Odoo into ShipBob so merchandise moves to fulfillment without manual data entry, and shipment tracking flows back to Odoo so your inventory records reflect what was actually shipped. ml-connector bridges the very different APIs on each side and keeps both systems in sync on a schedule you define.

How Odoo works

Odoo exposes purchase orders, products, inventory, and accounting through XML-RPC or JSON-2 APIs depending on the Odoo version. Authentication uses an API key paired with a username login, and the base URL is customer-specific (Odoo Online at https://<subdomain>.odoo.com, self-hosted at https://<domain>). Odoo webhooks are available only in Enterprise with Studio and are not production-grade, so polling with a high-water-mark timestamp on write_date is the recommended approach. External API access requires a Custom pricing plan or developer access.

How ShipBob works

ShipBob exposes orders, shipments, products, inventory, receiving, returns, and billing through REST APIs with JSON payloads. Authentication uses OAuth2 with a 1-hour access token lifetime and 30-day refresh token, or a personal access token for single-merchant integrations. Every API call requires an Authorization Bearer header and a shipbob_channel_id header to identify the channel context. ShipBob pushes events via webhooks for order shipments, tracking updates, warehouse receiving, and returns, with HMAC-SHA256 signature verification using v1 envelope headers.

What moves between them

Purchase orders and products flow from Odoo into ShipBob's fulfillment centers so inventory is ready for fulfillment. Shipment tracking updates and warehouse receiving confirmations flow back to Odoo, updated in real time via webhook when ShipBob creates shipments or completes warehouse receiving operations. Returns and billing events are also captured and can be reflected in Odoo's purchasing and inventory accounts.

How ml-connector handles it

ml-connector stores the Odoo API key and OAuth2 credentials encrypted, and polls Odoo purchase orders and products on a schedule you control, using the write_date field with a high-water-mark timestamp to fetch only new and changed records. On the ShipBob side, ml-connector registers a webhook endpoint that receives order shipments, tracking updates, warehouse receiving completions, and returns. The webhook handler validates the HMAC-SHA256 signature using the webhook secret, refreshes the ShipBob OAuth2 token if it is close to expiry, and verifies the shipbob_channel_id header matches your registered channel before processing. Products are mapped by SKU or barcode, and purchase orders are matched to ShipBob receiving orders by reference number. All transformations are idempotent and can be replayed if a downstream write fails.

A real-world example

A mid-sized e-commerce brand sells through multiple online channels and uses Odoo to manage accounting, purchasing, and inventory across suppliers. Before integrating with ShipBob, purchase orders were typed into ShipBob by hand, and shipment updates were downloaded manually and re-entered into Odoo, creating reconciliation gaps at month end. With Odoo and ShipBob connected, purchase orders created in Odoo automatically appear as receiving orders in ShipBob's fulfillment centers, and when ShipBob completes a shipment, the tracking details and warehouse picking location flow back to Odoo automatically, so inventory records always reflect actual shipped quantity.

What you can do

  • Sync products from Odoo into ShipBob so inventory is ready for fulfillment without manual entry.
  • Send purchase orders from Odoo to ShipBob as warehouse receiving orders, matched by supplier and reference number.
  • Receive shipment tracking and delivery updates from ShipBob via webhook and update Odoo inventory with shipped quantity.
  • Handle OAuth2 token refresh on ShipBob and API key rotation on Odoo, with retries on rate limits and a full audit trail.
  • Validate ShipBob webhook signatures with HMAC-SHA256 and verify channel context on every inbound event.

Questions

Which direction does data move between Odoo and ShipBob?
Products and purchase orders flow from Odoo to ShipBob for fulfillment. Shipment tracking, warehouse receiving confirmations, and return events flow back to Odoo from ShipBob via webhook. Returns and billing events can also be captured and reflected in Odoo's purchasing accounts.
How does ml-connector handle Odoo's polling and ShipBob's webhooks?
ml-connector polls Odoo purchase orders and products on a schedule you define, using the write_date field with a high-water-mark timestamp to fetch only new and changed records. On ShipBob, ml-connector receives push events via webhook whenever a shipment is created or an order is delivered, and validates every webhook signature with HMAC-SHA256 before processing.
What happens if the OAuth2 token expires or the channel ID is invalid on ShipBob?
ml-connector monitors the ShipBob OAuth2 token lifetime and refreshes it automatically before expiry. On every API call, ml-connector verifies the shipbob_channel_id header matches your registered channel context, and rejects any call that does not. If a refresh fails or the channel context is missing, the error is logged with full context for investigation.

Related integrations

Connect Odoo and ShipBob

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

Get started