net_return_cost = refund_amount + gift_card_amount - upsell_amount. A positive value represents a net cost to the brand. All three components are coalesced to zero when null.
is_child_order_return = TRUE (EXC- order names) does not mean the return has an exchange outcome — use has_exchange instead. Multiple returns per order are common; when counting Return Orders, use COUNT(DISTINCT sm_order_key) rather than counting rows.
When to use this table
Use fct_returns when you need Loop Returns data at the return-event grain. It is best for return outcomes, return timing, refund/store-credit/upsell economics, and order-level return counts after deduplicating by sm_order_key.
Common questions this table can answer:
- What share of valid orders had at least one return?
- How much net return cost is tied to each channel or campaign?
- Are customers choosing refunds, exchanges, store credit, or upsells?
- How long after purchase do returns usually start?
Recommended filters
For return analysis tied to known Shopify orders, start with:
Use COUNT(DISTINCT sm_order_key) for returned-order counts. Use COUNT(*) only when you intentionally want return-event counts.
Common joins
- Join to
obt_orders on sm_order_key when you need the full valid-order denominator for return-rate calculations.
- Join to
obt_order_lines on sm_order_key for product-level analysis of orders that had returns.
- Join to
dim_customers on sm_customer_key for customer-level return behavior.
For ready-to-run templates, see the Orders & Revenue SQL Query Library.