Overview
Three things can happen after a customer receives an order, and Spree models each on its own:
Keeping them separate matters most for claims. Without a record for “it arrived smashed”, merchants end up either creating a manual order or opening a return they immediately mark received — which records the wrong thing and makes damage reporting impossible.
Statuses
Each step is its own API call, because each one needs information the last one didn’t have — what actually turned up, how much to refund, what to send instead.
Customer self-service
Customers can open a return or a claim on their own order and follow its progress. Approving, receiving and refunding stay with the merchant.damaged, missing, wrong_item and other out of the box, and a store can add its own.
Processing a return
items out to receive everything as requested. Refunds default to whatever the return is still owed, and can go back to the original payment method or to store credit.
Where the goods come back to
A return is received at a stock location. By default that is wherever the goods shipped from, which is right until a merchant inspects and restocks returns at one processing centre — so locations carry areturns_enabled flag, and a
return routes to one that accepts them: the seller’s for a seller’s goods, the
operator’s own otherwise. Pass stock_location_id when opening the return to
choose explicitly.
Prepaid return labels
A return can carry its own postage. The label is bought against the same carrier account the outbound parcel shipped on, and the shipment is booked in reverse — from the customer’s address back to the return’s stock location. Buying one mints a delivery on the return, so the inbound parcel is tracked the same way an outbound one is. A delivery reporting arrival never receives the return: arrival is not inspection, and what actually turned up is still counted by hand.Resolving a claim
What to do about a claim is decided when you resolve it, not when the customer opens it — merchants usually decide once they’ve seen the photos.Exchanges
An exchange works like a return, but ends by sending different items instead of refunding:Reporting
Because each one is its own record, you can query them directly:Return policy
Spree ships no built-in return window. Whether a customer may open a return is store policy, and it’s checked when the return is created — so you can hold customers to a 30-day window while letting staff make an exception for a good customer, and vary the rule by market where local law requires it. Set the return window per market, or express a more specific rule in your own application. See Configuration and Services & Workflows.Events
Each step publishes an event —return.received, return.refunded, exchange.fulfilled, claim.resolved — which also reach webhooks.
Returns and claims also update the order’s payment status, so a refunded order reflects it without any manual bookkeeping.
Related
- Orders — payment status after refunds
- Fulfillments — replacement deliveries
- Inventory — putting returned goods back in stock

