figma guide

Designing returns and refunds UI in Figma: wizard, labels, and handoff

Design return wizards, reason pickers, refund timelines, and label downloads in Figma with status badges, partial returns, and Dev Mode specs for post-purchase flows.

Published
Updated
Jun 20, 2026
Read time
8 min
Level
Beginner

Quick answer

Returns UI starts from order detail with a Start return CTA, then a stepped wizard: select items → choose reason → pick refund method → confirm → track return status with RMA ID, label download, and refund timeline. Build ReturnLineItem (selectable variant of order LineItem), ReasonPicker, ReturnMethodCard, and ReturnStatusTimeline parallel to shipment tracking. Model partial returns, exchange vs refund, restocking fees, and non-returnable items. Pair with progress steppers, modals, and badges. Start from the Figma guides hub.


Who this is for

  • Product designers shipping self-serve returns for DTC, marketplace, and omnichannel retail.
  • Design system teams aligning return states with order status and support tooling.
  • Engineers implementing RMA APIs, carrier label generation, refund webhooks, and inventory restock rules.

Return surfaces

SurfaceGoalKey components
Order detail entryStart returnStartReturnCTA, eligibility copy
Return wizardGuided flowReturnStep, stepper
Item selectionPartial returnsReturnLineItem with checkbox
Reason + notesOps dataReasonPicker, photo upload optional
Refund methodRefund vs exchangeReturnMethodCard
ConfirmationRMA issuedReturnConfirmation, label CTA
Return detail / trackPost-submit statusReturnStatusTimeline
Returns list (account)HistoryReturnRow in table

Verdict: treat returns as a mirror of outbound order tracking—same timeline mental model, different status enum and refund row in totals.


Eligibility and entry

ConditionUI treatment
Within return windowPrimary Start return button
Window expiredDisabled CTA + “Return by Jun 15” copy
Final sale / non-returnableBadge on line item; exclude from wizard
Already returnedLink to existing RMA
In transit (not delivered)Hide return; show tracking
Subscription / digitalSeparate policy page link
StartReturnCTA
├── Variant: state=eligible | expired | partial | disabled
├── Property: daysRemaining (number optional)
└── Layers:
    ├── PrimaryButton
    ├── PolicyLink ("Return policy")
    └── HelperText

Gate the wizard with a lightweight eligibility check screen if rules are complex (marketplace sellers, mixed fulfillment)—avoid dead-ends on step 3.


Return wizard steps

StepContentValidation
1. Select itemsReturnLineItem list, qty per lineAt least one item
2. ReasonReasonPicker + optional comment/photosReason required
3. ResolutionRefund to original payment, store credit, exchangeOne method
4. ReviewSummary + restocking fee disclosureConfirm checkbox if needed
5. ConfirmationRMA number, label download, next steps

Use horizontal progress stepper on desktop; compact step label on mobile (“Step 2 of 4”). Back navigation preserves selections—note in prototype and spec.


ReturnLineItem anatomy

PartPurposeSpec tip
CheckboxInclude in returnDisabled if non-returnable
ThumbnailProduct imageReuse order line item
Title + variantIdentity2-line clamp
Qty selectorPartial returnMax = purchased qty − already returned
Return statusIf prior partial”1 of 2 returned”
Non-returnable badgePolicyBadge + tooltip why
ReturnLineItem
├── Variant: state=selectable | selected | disabled | partial
├── Property: returnQty (number)
├── Property: maxReturnQty (number)
└── Layers:
    ├── Checkbox
    ├── ProductBlock (thumb + title + variant)
    ├── QtySelector
    └── PolicyBadge (optional)

Exchange flow: after reason step, show Replace with variant picker (dropdown or mini PDP modal) instead of refund method cards.


ReasonPicker

PartPurposeSpec tip
Reason listRadio or segmented”Wrong size”, “Defective”, “Changed mind”
Sub-reasonOptional drill-downDepends on parent reason
Comment fieldFree textMax length note
Photo uploadDamage claimsReuse file upload compact
Return policy linkLegalOpens modal or new tab
Reason categoryOps routingUX note
Defective / damagedPriority queueEncourage photos
Wrong item sentFull refund + keep optionalClear apology copy
Changed mindRestocking fee may applyShow fee on review step
Fit / sizeSuggest exchange firstPre-select exchange method

ReturnMethodCard

MethodCard contentWhen to offer
Refund to original payment”Refund to Visa •••• 4242”Default
Store credit”+10% bonus credit” optional promoRetention play
ExchangeShip replacement when receivedApparel, sizing
Keep item / partial refundRare promo resolutionSupport-only—hide from self-serve if not supported
ReturnMethodCard
├── Variant: state=default | selected | disabled
├── Property: method (refund | credit | exchange)
└── Layers:
    ├── RadioIndicator
    ├── Title + Description
    ├── ETA copy ("Refund in 5–10 days")
    └── PromoBadge (optional)

Show refund amount estimate on review step using price tokens—subtotal returned, restocking fee, shipping non-refundable lines.


Return status timeline

StatusBadge tokenUser copyActions
RequestedneutralReturn requestedCancel request (if allowed)
ApprovedinfoReturn approvedDownload label
Label createdinfoShip by [date]Print label, drop-off locator
In transitwarningOn the way backTrack package
ReceivedinfoWarehouse received
InspectingneutralQuality check
Refund issuedsuccessRefunded $XView order
RejectederrorReturn declinedContact support
Exchange shippedsuccessReplacement on the wayTrack new shipment
ReturnStatusTimeline
├── Variant: orientation=vertical | horizontal
├── Property: currentStep (enum)
└── Layers:
    ├── StepList (icon + label + timestamp)
    ├── RMABlock (RMA # + copy)
    └── ActionRow (label, tracking, support)

Reuse shipment timeline layout from order tracking—designers and users already understand the pattern.


Labels and drop-off

ElementPurposeSpec
Download label buttonPDF / PNGPrimary CTA post-approval
Print instructionsFirst-time usersCollapsible steps
QR code (carrier)Mobile drop-offStatic placeholder in Figma
Drop-off locator linkFind storeExternal link icon
Packaging notePolicy”Include RMA slip in box”

Show loading state while label generates; error alert with retry if carrier API fails.


Refund display on order detail

After refund completes, update order detail:

RowDisplay
Returned itemsStruck through or moved to “Returned” section
Refund amountRefundRow −$X.XX green or neutral
Refund destination”Refunded to Visa •••• 4242”
Date”Refunded Jun 18, 2026”
Link”View return #RMA-8821”

Keep financial parity with email receipt and support dashboard—same field list as order history handoff.


Responsive behavior

BreakpointWizardTimeline
MobileFull-screen steps; sticky ContinueVertical
TabletCentered card max-width 640pxVertical
DesktopTwo-column review (items left, summary right)Horizontal on wide detail

Sticky Download label on mobile when status is label-created—same pattern as Track package on orders.


Handoff checklist

ItemDev Mode annotation
Return window rulesDays from delivery per category
Non-returnable SKU listBadge logic
RMA ID formatRMA-{orderId}-{seq}
Label API asyncPolling vs webhook UI states
Partial qty maxpurchased - already_returned
Refund timing copyPer payment method
Exchange inventoryOOS handling → refund fallback
Restocking feeWhen applied, display on review
Analyticsstart_return, submit_return, download_label
Support escalationLink from rejected state

Use Dev Mode checklist and link wizard steps to checkout line-item props.


Common mistakes

MistakeWhy it hurtsFix
Return only from help centerLow self-serve rateCTA on every eligible order detail
No partial return qtyOver-return disputesQty selector per line
Timeline without refund step”Where is my money?”Explicit Refund issued step
Different line item layoutVisual driftExtend order LineItem
No cancel return windowWarehouse chaosCancel CTA before label scan
Exchange OOS dead-endAbandoned flowOffer refund fallback modal

  1. Define return policy matrix (window, fees, methods) with PM/legal.
  2. Add Start return to order detail with eligibility states.
  3. Build wizard steps with ReturnLineItem and ReasonPicker.
  4. Create ReturnMethodCard and review summary with fee rows.
  5. Design confirmation + ReturnStatusTimeline mirroring outbound tracking.
  6. Add returns list in account area with pagination if volume is high.
  7. Prototype order detail → wizard → label download → refunded state.
  8. Spec email templates (RMA created, refund issued) aligned to UI copy.

FAQ

Separate returns page or modal wizard?

Dedicated wizard route (/orders/{id}/return) for multi-step flows—modals break on mobile and deep linking. Use modal only for confirm abandon.

Marketplace multi-seller returns?

Split by shipment group on item selection—one RMA per seller with separate labels. Show seller name on ReturnLineItem.

In-store returns with online orders?

Add Return in store method card with barcode screen; barcode is static mock + “Generated at register” note.

Instant refund before item received?

If business allows, show Refund initiated step before Received—timeline order must match finance policy.


Next steps

Share on X

§ Keep reading

Related guides.