Reverse shipments
A reverse shipment is a Shipment with
entity_type=REVERSE. It moves a parcel from the customer
back to the merchant. Common use cases include product
returns, warranty swaps, recalls, and B2B returns of unsold
stock.
The same Shipment object models forward and reverse. From the carrier's perspective they're symmetrical: pickup at one address, dropoff at another. The difference is purely directional: forward means merchant → customer; reverse means customer → merchant.
When this is the right tool
Reverse shipments via the Shipping API are the right choice when:
- You're managing the return lifecycle yourself. Approval, refund logic, and customer communications are all handled in your system. You only want Carriyo to book and track the carrier.
- You don't need a return request record. No item-condition tracking, no quantity counters, no Carriyo-managed lifecycle. Just "book a return parcel".
- You're returning unsold stock. A B2B flow where products ship back from a retailer to the supplier. No return request needed, just shipping logistics.
If you want Carriyo to manage the return request lifecycle (approval, item conditions, refunds), use the Return request model instead.
How it differs from forward shipments
Almost nothing differs in the shipment fields:
- The pickup address is the customer's address (where the parcel is collected from).
- The dropoff address is the merchant's warehouse.
- The
entity_typefield is set toREVERSE. - Items describe what's being returned (often imported from the original forward shipment).
Some carrier-specific differences are common in practice:
- Some carriers offer return-specific service codes. See the carrier's connector page for the field reference.
- Pickup scheduling for returns is often simpler than forward scheduling. The customer leaves the parcel at the door or drops it at a location.
Routing rules for reverse traffic
Reverse traffic is routed via the same rule engines as forward traffic, with a direction filter:
- Shipping rule sets and service level rule sets carry
an
entity_typefield (FORWARDorREVERSE). Most merchants run separate rule sets per direction. The cheapest forward carrier isn't always the cheapest return carrier. - Capacity rules and Costing rules also carry an
entity_typefilter, so reverse traffic doesn't compete with forward capacity and can be costed independently.
Carrier accounts themselves are direction-agnostic: the same account can handle forward and reverse traffic. Direction-based routing is done via the rule sets, not at the account level.
How it relates to a return request
When Carriyo's full return request workflow is used, the request produces one or more reverse Shipments on approval. The linkage:
- Each return item carries a list of
reverse_shipments: the IDs of the Shipments carrying that item back. - The Shipment carries a
return_request_idreference back to the parent return request.
When a reverse Shipment reports DELIVERED, Carriyo increments
the returned_quantity on the matching return items and fires
a returned_update webhook. The return request status does
not auto-transition. Moving the request to completed or
recording receipt requires a Dashboard action or a call to the
/receive or /complete API endpoints.
How it fits with other modules
- Shipping. Reverse shipments use the same APIs and same lifecycle.
- Returns. The parent module.
- Return request model. When reverse shipments are produced by an approved Return Request.
- Carrier configuration.
Rule sets that filter on
entity_typefor direction-aware routing.