Returns portal
The returns portal is where customers raise return requests. Customers typically arrive from an order-confirmation email or a help-center link. They look up their order, pick the items they want to return, pick a reason, and submit.
Behind the scenes, the portal calls the Returns API to create a return request. From there, the Return request model takes over: approval, reverse shipment booking, and the rest of the lifecycle.
The portal is part of Carriyo's Returns add-on. Your tenant must be subscribed for the portal to be active.
How customers reach the portal
The returns portal is a CX app like Tracking and Feedback. It
is served from a per-merchant URL on Carriyo's default domain,
or from a custom domain (for example, returns.brand.com). The
custom-domain setup mirrors branded tracking: two CNAMEs, one
to point at Carriyo and one for SSL validation. See
Post-purchase CX for the full
setup.
Order lookup
The customer enters their order reference plus one of:
- Email. Validated against
dropoff.contact_emailon the order's shipments. - Phone. Validated against
dropoff.contact_phone.
The merchant configures which methods are allowed via
orderLookupMethods in Returns Settings. Both can be enabled,
in which case the customer can use either.
Item selection and eligibility
Once the order is found, the portal shows the order's lines with per-line eligibility computed server-side:
- Already-returned check. Items already in an active return request are subtracted from the available quantity. The customer can't ask for four units back when they've already opened a return for two.
- Delivered-only filter (optional). If
allowUndeliveredItemsis false in Returns Settings, only items onDELIVEREDshipments are eligible. This is the most common configuration. - SKU-level non-returnable flag. If a product SKU is marked non-returnable in its product metadata, the portal disables the line.
- Return window.
allowedDaysForReturnis read from Returns Settings and enforced when the page renders.
Lines that fail eligibility are still shown (but disabled), with the reason explained inline.
Reason, comment, and photo
For each item, the customer picks a reason from the merchant's configured list. Each reason can require additional input:
requireComments. The customer must enter a free-text comment.requireImages. The customer must upload at least one photo (JPG, PNG, or WebP, up to 5 MB each).requireItemCondition. The customer must describe the condition from the merchant's configured condition codes.
These three flags are set per reason in Returns Settings, so defective might require a photo while changed mind doesn't.
Submission and outcome
When the customer submits, the portal creates a return request via the Returns API. The auto-approve flag on the chosen reasons determines what happens next:
- If every item's reason is auto-approve, the request is approved immediately. The portal then shows the next step: return instructions, drop-off info, or the label.
- If any item's reason isn't auto-approve, the request stays
pendingand the customer is told the request is under review. The merchant decides in the Dashboard.
Branding and theming
The portal inherits the merchant's brand theme (logo, colors, typography) and can override any part of it. Configured at CX Apps → Returns Portal. Per-locale content is supported for all customer-facing strings (order-number placeholder, success message, terms and conditions, shipping instructions, footer).
Iframe embedding
The returns portal supports iframe embedding (for example, "My Account → Returns"). The setup mirrors branded tracking:
- Enable iframe mode on the returns app.
- Allowed parent origins. A comma-separated list. Carriyo
enforces via
Content-Security-Policy: frame-ancestors.
How it fits with other modules
- Return request model. What the portal creates.
- Reverse shipments. What the portal triggers booking of, on approval.
- Post-purchase CX. The portal is a CX app and inherits the merchant's theme.
- Account model. Portal config is per-merchant.