The external API supports the whole transfer order lifecycle. These endpoints are also available under the PickFlow path prefix.
1. Create a draft
POST /transfer-orders needs these fields: status, date, source_warehouse_id, destination_warehouse_id, shipping_cost, arrival_date, and items (each with product_id, quantity and ordered_uom_id). number, shipping_method and extra_costs are optional. If you send number, it must be unique. If you leave out shipping_method, it defaults to Standard.
Fulfillment Source: send channel_id to set it. It must be an existing channel ID. If your account requires a Fulfillment Source on transfer orders, channel_id is mandatory. A transfer order saved without one can't be fulfilled, so set it on create.
2. Update a draft
PUT /transfer-orders/{id} takes the same body as create. Only draft transfer orders can be updated. Anything else returns 422. Auto-receive, auto-ship, shipment type and supplier are left unchanged.
3. Post it
POST /transfer-orders/{id}/post. Optional body fields:
push_to_wms(boolean): also pushes to your WMS.tracking_number(string).
Only drafts can be posted. If the WMS push fails, the transfer order stays posted. When you sent push_to_wms: true, the response includes a wms_push object with success and message, so you can retry the push without trying to post again.
4. Push to WMS
POST /transfer-orders/{id}/push-inbound-shipment pushes a posted transfer order to the WMS as an inbound shipment. If SKUs aren't mapped in the integration, the call returns a validation error listing the unmapped SKUs.
The transfer order must be posted first. Otherwise the call returns 422.