Skip to main content

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.
Claim types are damaged, missing, wrong_item and other out of the box, and a store can add its own.

Processing a return

Receiving takes the quantities the warehouse actually counted, because partial and damaged returns are normal rather than exceptional. A customer says three items are coming; two arrive; one of those can’t be sold again. Only resellable goods go back into stock. Leave 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 a returns_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.
Customers download the label from the storefront, so a return request can end with “print this and drop it off” rather than an email exchange. See shipping labels for how postage records work in general.

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.
A replacement creates a new fulfillment on the original order, so the customer doesn’t have to place a second one.

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 eventreturn.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.