Release 2026.09-R5
Released September 14, 2026.
Fulfill a fulfillment order without listing its items
line_items is now optional on POST /orders/{orderReference}/fulfillment-orders/{fulfillmentOrderReference}/fulfill. Leave it out and Carriyo fulfills every pending item of the fulfillment order. You can also send the request with no body at all. A request without a Content-Type header is read as JSON.
An empty line_items list is rejected with a 400 error. To fulfill only some items, list them with their id and quantity as before.
MCP: in the Fulfillment orders tools, fulfill_fulfillment_order no longer requires line_items and follows the same rule.
Most deliverable quantity in delivery options
With inventory_check on, fulfillable_quantity on an item marked FULL is now the most that one of the option's fulfillment locations can deliver. Before, it was capped at the quantity you requested. A storefront can use it to let a shopper raise the quantity without a new call for each step.
For example, a cart asks for 2 units and the best location in the option holds 10. fulfillable_quantity was 2 and is now 10. Other cart lines for the same product are deducted first.
POST /storefront/delivery-optionsreturns it on each item under a delivery option.POST /storefront/product-delivery-optionsreturns it on each delivery option entry.
availability is still judged against the requested quantity. PARTIAL, NONE and UNKNOWN items keep their previous values. Which options and locations come back, and in what order, is unchanged. A changed cart still needs a new call, because fees and options depend on the cart.
Allocated order milestone
An order's key_milestones now also records allocated: the first time the order reached Allocated. It joins the existing cancelled, fulfilled and closed dates, and like them it is never overwritten. Orders allocated before this release don't carry it.
Returns Portal prefill in plain text
The Returns Portal now reads the email_or_phone query parameter as plain text. Before, it had to be base64-encoded. A link such as https://example.com/return?order_ref=26532&email_or_phone=test.user@example.com skips the first page when both values match the order. Base64 values are no longer decoded, so links that encode the email or phone need updating.
DHL Express consolidated child shipments
For DHL Express consolidated shipping, each child shipment's packages now carry the parent shipment's piece ID. This lets DHL pass the parent's tracking checkpoints down to the child shipments. Child shipments are also billed to the shipper account number, for both the shipper and payer. A payer account number set for the parent booking no longer applies to them.
Fixes
- Shipping rules with all merchants: in some rule sets, selecting every merchant in a rule's merchant condition saved the rule so it matched no merchants. Shipments it should have routed got no carrier. The Forward Shipping Rules, Reverse Shipping Rules and Service Level Rules editors under Settings > Shipping Automation now save the condition as all merchants. Via the API: a shipping rule or service level rule whose merchant condition lists no merchants is now rejected. Send
_ANYfor all merchants. A rule with no merchant condition in a rule set scoped to specific merchants now saves instead of failing. - Fulfillment App orders without payment details: the Orders list, order details and customer pages no longer break when an order was created without a
paymentblock. - Fulfillment App packs: a completed or cancelled pack now shows all its shipments, including cancelled ones. Cancel Shipment appears only while the shipment can still be cancelled:
draft,error,bookedorready_to_ship.