Everything you need to connect the LataSys 3PL Connector to ShipBob:
prerequisites, connection setup, mappings, capabilities and
provider-specific behaviour. ShipBob's Developer API is versioned
REST/JSON (this adapter speaks the 2026-07 version).
| Flow | Supported |
|---|---|
| Order push and despatch write-back | Yes - with ShipBob's tracking-delta checkpoint |
| Order amendment | Yes - best-effort per shipment (see below) |
| Order cancellation | Yes - until a shipment is labelled |
| Holds | No - ShipBob places shipments on hold itself; there is no merchant hold API |
| Inventory sync | Yes - account-wide fulfillable quantity, with lot detail on lot-tracked instances |
| Product push | Yes - create and update (products with variants) |
| Product match | Yes - the variant catalogue with SKUs and barcodes |
| Supplier push | No - ShipBob has no vendor master |
| Returns (registration and polling) | Yes - no return label is generated (see below) |
| ASNs / GRNs | Yes - as Warehouse Receiving Orders with received-quantity read-back |
| Warehouse list fetch | Yes - ShipBob's fulfillment centers |
| Carrier list fetch | No - the carrier arrives with the despatch |
| Service option fetch | Yes - the Ship Option Mapping names |
| Proof of delivery | No - delivery events arrive via webhooks/status only |
| Webhooks | Yes - six topics, HMAC-signed deliveries |
sandbox-api.shipbob.com).Install the LataSys 3PL Connector: ShipBob Adapter module. The provider then appears in the provider list when creating a 3PL instance, along with its provider card (API operations reference) under Configuration - Providers.
sandbox-api.shipbob.com (sandbox
accounts have their own tokens), Production targets
api.shipbob.com.GET /channel, validates the token
and auto-fills the Channel ID on the ShipBob Options tab
(preferring a channel with orders_write scope). The channel id
is sent as the shipbob_channel_id header on every write and
scopes reads to this integration's own orders.location_id),
receiving orders and returns. Note that ShipBob reports stock
account-wide across its network - map ONE Odoo warehouse per
instance so quantities are not double-counted.GET /shipping-method, then map your requested-delivery-method
values onto them. The mapping wins; the raw requested value and the
carrier mapping's service code are the fallbacks; the instance's
Default Shipping Method (Standard) is the last resort. A name
ShipBob does not recognise is created on their side and defaults to
Standard.Completed,
LabeledCreated and Fulfilled count as despatched (a labelled
shipment already carries tracking); OnHold and Exception
surface as Hold; Cancelled/CleanSweeped follow your
remote-cancel policy.| Field | What it does |
|---|---|
| Channel ID | The shipbob_channel_id header value. Auto-filled by Test Connection; only set manually if the token carries several channels |
| Default Shipping Method | shipping_method sent when no mapping resolves one - should match a Ship Option Mapping name |
| Mark Tracking Uploaded | After each despatch write-back, flag the shipments as tracking-uploaded at ShipBob (the checkpoint of the tracking-delta poll). Disable only if another system owns that flag |
reference_id (and the Odoo order name as the
display order_number); ShipBob's numeric order id becomes the
remote reference. Orders split into one or more shipments, each
with its own status, tracking and lot detail - multi-parcel orders
write back every tracking number.HasTracking=true&IsTrackingUploaded=false filter, and after each
despatch write-back the shipments are flagged via
POST /shipment:batchUpdateTrackingUpload so nothing is processed
twice. The flagging is best-effort - a failed checkpoint never
breaks the write-back; the order simply reappears next poll.:updateAddress); line items are a FULL
replacement keyed on ShipBob inventory ids and are only pushed
when the order has exactly one open shipment (replaying the order's
lines onto each shipment of a split order would duplicate them).
Both endpoints answer HTTP 200 with an is_success flag - the
adapter checks it and only errors when no shipment accepted
anything. The shipping method cannot be changed after creation.GET /product) on demand.EverythingInOneBox), the receipt's lines as box items and the
receipt's scheduled date as the expected arrival. ShipBob
requires a tracking number per box: the receipt's Tracking
Reference is used, falling back to the ASN reference (which then
doubles as the box label identifier). The WRO response carries a
box_labels_uri packing slip - include it in each box. GRNs read
the WRO's received quantities (no lot breakdown on the read side).order.shipped, order.shipment.tracking.updated,
order.shipment.delivered, order.shipment.cancelled,
return.updated, wro.completed) to the instance webhook URL, one
subscription per topic so a missing scope fails only its own topic.
Deliveries are HMAC-SHA256 signed (webhook-signature header) and
retried with exponential backoff for 24 hours; polling remains the
safety net.| Symptom | Likely cause |
|---|---|
| "credentials missing" on every flow | The PAT is not in the API Key field |
| "ShipBob returned no channel for this token" | The token has no channel - recreate it under Integrations > API Tokens and re-run Test Connection |
| HTTP 401 on writes only | Missing/wrong Channel ID - clear it and re-run Test Connection |
| "Product ... has no Internal Reference (SKU)" | ShipBob identifies products by reference id - set the Internal Reference to the ShipBob SKU |
| "SKU ... is not in the ShipBob catalogue" | Push or match the product first so an inventory id exists |
| "ShipBob fulfillment center ids are numeric..." | The warehouse mapping's remote code is not a ShipBob FC id - use Fetch Warehouses |
| Amendment reports "not editable" | Every shipment is already labelled, completed or cancelled |
| Order ships with the wrong service | The shipping_method name did not match a Ship Option Mapping entry - ShipBob created it and defaulted to Standard |
See also: ShipBob adapter - process maps for the end-to-end flow diagrams.
ShipBob is a trademark of its respective owner; the name is used solely to identify the service this module interoperates with.