Returns Centre — Staff Portal
Email
Password
Dashboard
Customer Portal ↗
Total Returns
All time
New
Awaiting action
In Progress
Review → Received
Resolved
Completed
Rejected
Declined
Recent Activity
RefOrderCustomerTypeStatusSubmitted
By Type
By Reason
Status Breakdown
This Month vs Last
Key Metrics
Total Returns
Resolution Rate
Avg Days to Resolve
Refunds / Exchanges
Top Return Reasons
Return Types
Status Distribution
Returns by Month
Resolved Returns — Full History
RefOrderCustomerTypeReasonSubmittedResolvedDays
Total
All time
Pending
Need action
In Progress
Being handled
Shipped
In transit
Completed
Last 30 days
Replacement Requests
Customer Order SKU Issue Resolution Status Logged
Returns Centre Playbook
How returns and replacements work end-to-end
When a customer requests a return
1. Customer goes to returns.rachelbloom.com
2. Selects bag (cascading dropdowns: style, colour, GPS) or accessory
3. Picks reason and adds detail
4. Submits the request
5. A row lands in this dashboard's All Returns → New view within seconds
6. Customer gets a confirmation email with their reference number (RET-XXXX)
7. saul@ and rachel@ get notified by email
The return workflow stages
New → just submitted, needs first review
Under Review → you are investigating, asking for photos, etc.
Approved → return is approved, customer to ship item back at their cost
Label Sent → label was issued (rare; we usually require the customer to ship at their own cost)
Item Received → physical item is back at warehouse
Resolved → refund / replacement / store credit issued, case closed
Rejected → return declined (out of policy, damage from misuse, etc.)
Replacements vs Returns
These are two different things on this dashboard.

Returns are customer-initiated requests to send something BACK to us (refund, exchange, store credit). They live in the All Returns / New / Under Review / Approved / Label Sent / Received / Resolved / Rejected queues.

Replacements are records of replacement items we are sending OUT to customers — usually for damaged-on-arrival, defective, or wrong-item situations. They live in the Replacements tab. Replacements can be created from a CS ticket (cs.rachelbloom.com), manually via "+ New Replacement" here, or auto-created from an unmatched Shopify fulfillment.
Shopify integration (auto-tracking sync)
When you ship a replacement from Shopify, tracking flows back into this dashboard automatically. You don't need to copy-paste tracking numbers anywhere.

Workflow:
1. Log the replacement in this dashboard FIRST (or via a CS ticket)
2. Open the Shopify order, click Edit order
3. Add a custom item (e.g. "Replace Belt Bag in Tan", $0.00)
4. Save the order edit
5. Buy a shipping label and fulfill the new line
6. Within 30 seconds, this dashboard auto-updates: status moves to "shipped", tracking number appears, internal note logs the Shopify fulfillment ID

If you fulfilled BEFORE logging the replacement here:
A red banner appears at the top of the Replacements tab saying "X Shopify fulfillments need linking". Click "Review now", then either link to an existing replacement or create a new one (everything pre-fills from the Shopify data). saul@ and rachel@ also get an email.

When a Shopify refund is processed:
Any open replacement matching that order is automatically marked resolved with the refund amount logged.
Email templates and auto-status
When you open a return drawer, you can send templated emails (Acknowledge, Approve, Send Label, Item Received, Refund Issued, Decline, Custom). Sending a templated email auto-moves the return to the matching status — for example, sending the "Approve return" template moves status to Approved and logs an internal note explaining the auto-move.

The Reject button still exists for situations where you want to reject WITHOUT sending an email (rare).
Where everything lives
returns.rachelbloom.com — customer-facing return portal
admin.returns.rachelbloom.com — this dashboard
cs.rachelbloom.com — CS dashboard, also shows replacements
ops.rachelbloom.com — Operations dashboard, includes Returns Insights merged view

All four read from the same Supabase tables — when one updates, all auto-refresh within 30 seconds.
Hard rules
- Customer pays return shipping unless the issue is our fault (defect, wrong item, damage in transit)
- 30-day return window from delivery date — anything outside is rejected unless escalated
- Bags showing wear, damage from misuse, or missing original packaging are NOT eligible — reject with photos as evidence
- Refunds processed within 5-7 business days of receiving the item back
- Replacements ship the moment they are approved, before the original item is back
- Never edit a customer's email address on a return record once submitted — create a new return if needed
- Never delete a return — reject it instead, so the audit trail is preserved
If something breaks
Returns not appearing: check returns.rachelbloom.com is up, then check Supabase RLS on the returns table.
Tracking not auto-syncing: check the Shopify webhooks at admin.shopify.com → Settings → Notifications → Webhooks. Both "Fulfillment creation" and "Refund create" should point to shopify-replacement-sync. Check edge function logs in Supabase.
Pending fulfillment links banner stuck: the queue is real — review and link/dismiss each one.
Email not sending: Resend status at status.resend.com. Edge function: send-return-email-rb.
Return
Pipeline — click to move status
Actions
Return Details
Reference
Order Number
Customer Email
Return Type
Reason
Bag Style
Colour
GPS
Item
Quantity
Wants Instead
Customer Notes
Submitted
Last Updated
Email Customer
Internal Notes