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.