Queries · q361 · Head of Pricing and Promotions · week 2, night 1
“Is the Welcome10 instance's outsized refund total concentrated in particular product categories, and does the time between order and return look like a fit/expectation-mismatch problem (fast returns) or something else?”
Fictional people at a fictional company, each played by a language-model agent. Who they are and what they are told
Week 1; shared with Tobias Lindqvist, Chief Financial Officer
Finance questions the cost of discounts. Which promotions and coupons brought additional sales, which only gave away margin, and is anything being misused?
The manager, at the start of week 2
Subject: Good work — here's where I want to go next
Oliver,
This is exactly the kind of memo I needed — it separates real findings from artifacts, which is rarer than it should be. A few reactions and where I want to push next week.
The lapsed-subscriber giveaway (~€57k) is now the headline for Tobias, not the promo/coupon story — good catch pulling it out. Before I take that number upstairs, I want it airtight. And the Welcome10 broad refund pattern is the one piece of "margin erosion" I think is genuinely actionable rather than a sample-size illusion, so I want to go a layer deeper there before we talk about capping anything.
On incrementality — I accept we may never get a clean causal answer here, but I'd like one more honest attempt before I write it off as "probably just bigger carts clear the threshold anyway."
Questions for this week:
No need to re-litigate the B2B volume-tier outlier — just keep it excluded as you planned. Let's talk Wednesday before the last batch so I can steer based on what the orphan-subscription check turns up.
Thanks, Marco
The analyst · week 2, night 1, request 3 of 3
Marco wants the €57k lapsed-subscriber number airtight before it goes to Tobias, wants Welcome10's refund pattern explained one layer deeper, wants an honest size-matched incrementality attempt, and wants the leakage trend over time — four questions, three slots tonight, so I'm sequencing by what's blocking the Wednesday sync.
Priority tonight is the subscription-leakage story since Marco explicitly wants it checked before taking it upstairs, so two of three slots go there:
Third slot goes to digging one layer into Welcome10's refund pattern (which category of products it clusters in, and whether return timing looks like fit/expectation mismatch vs. quick-flip behavior) — the one piece Marco called out as worth a deeper look before any capping conversation. I'm holding the harder, size-matched incrementality re-cut for night 2, since it needs more careful design and isn't needed before Wednesday's sync, whereas the subscription-leakage number is.
Also noting for context (not acting on tonight): Growth Marketing's company-wide finding that discounted orders return 5-7pts more with no basket-size boost in apparel/electronics lines up with our Welcome10 finding — useful external corroboration, not a new data pull.
The engineer · 1 dry run on the empty schema, then the submission
WITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off' ), t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id ), t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260 ), t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' ), t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id ), t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4 ), t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id ), t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date) ), t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, t7.refund_amount / NULLIF(t7.eur_rate, 0) AS refund_amount_eur, CAST(t7.requested_at AS date) - CAST(t4.order_placed_at AS date) AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id ), t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id ), t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(t8.days_to_return) AS avg_days_to_return FROM t8 GROUP BY t8.category_id ), t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8 ) SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, ROUND( 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0), 1 ) AS return_rate_pct, ROUND(COALESCE(t10.total_refund_eur, 0), 2) AS total_refund_eur, ROUND( 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0), 1 ) AS share_of_instance_refund_pct, ROUND(t10.avg_days_to_return, 1) AS avg_days_order_to_return FROM t5 LEFT JOIN t9 ON t9.category_id = t5.category_id LEFT JOIN t10 ON t10.category_id = t5.category_id CROSS JOIN t11 ORDER BY total_refund_eur DESC, category_name ASC
“The query compiles and returns the expected 8 columns at the category grain. Submitting.”
“Submitted. Summary of what the report does:
- Re-identifies the discount instance: finds the discounts row named "Welcome 10% off" whose 2025 non-cancelled orders (via order_discounts) total exactly 260, matching last week's finding.
- Grain: one row per product category (via products.primary_category_id -> categories), covering all order items sold under that discount instance.
- Measures: items sold, distinct orders, items returned, return rate %, total refund in EUR, share of the instance's total refund %, and average days between order placement and return request — to help distinguish fast "fit/expectation mismatch" returns from slower, other-cause returns.
- Conversion: refund amounts (from return_items.refund_amount) converted to EUR using the exchange rate as of the return's requested_at (falling back to refunded_at).
One caveat flagged to the analyst: all return_items are included regardless of the return's status (no filter on order_returns.status), since the request didn't specify restricting to e.g. "refunded" only — this may include a few returns still in progress.”
As Oliver Grant saw it, from the small dataset the agents worked on
category_name | order_items_sold | distinct_orders | items_returned | return_rate_pct | total_refund_eur | share_of_instance_refund_pct | avg_days_order_to_return ---------------+------------------+-----------------+----------------+-----------------+------------------+------------------------------+------------------------- Outerwear | 42 | 32 | 11 | 26.2 | 2534.23 | 19.4 | 14.1 Boots | 44 | 35 | 13 | 29.5 | 2452.5 | 18.8 | 17.2 Sneakers | 48 | 32 | 12 | 25.0 | 1745.81 | 13.4 | 9.3 Outerwear | 30 | 27 | 8 | 26.7 | 874.26 | 6.7 | 16.5 Trousers | 44 | 37 | 11 | 25.0 | 815.39 | 6.2 | 13.4 Sandals | 35 | 24 | 10 | 28.6 | 674.14 | 5.2 | 13.0 Dresses | 32 | 22 | 7 | 21.9 | 630.07 | 4.8 | 10.6 Tops | 51 | 40 | 12 | 23.5 | 549.49 | 4.2 | 12.4 Knitwear | 28 | 21 | 8 | 28.6 | 521.81 | 4.0 | 14.3 Trousers | 42 | 33 | 6 | 14.3 | 461.67 | 3.5 | 15.0 Loungewear | 20 | 17 | 4 | 20.0 | 413.36 | 3.2 | 15.0 Loungewear | 21 | 16 | 7 | 33.3 | 387.82 | 3.0 | 16.0 Scarves & Hats | 82 | 53 | 7 | 8.5 | 307.8 | 2.4 | 15.4 Knitwear | 14 | 14 | 3 | 21.4 | 210.5 | 1.6 | 18.7 Socks | 45 | 33 | 14 | 31.1 | 201.02 | 1.5 | 14.3 Tops | 18 | 15 | 6 | 33.3 | 104.07 | 0.8 | 13.5 Shirts | 9 | 8 | 2 | 22.2 | 97.77 | 0.7 | 16.5 Tops | 66 | 34 | 7 | 10.6 | 89.84 | 0.7 | 10.3 (18 rows)
The memo and the queries that followed; links found by title, so inferred
It builds on:
Changed only where the benchmark needs the same result on every system
WITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id SELECT d.id AS discount_id, d.tenant_id AS tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off'),t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id),t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260),t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01'),t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id),t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4),t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id),t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date)),t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, t7.refund_amount / NULLIF(t7.eur_rate, 0) AS refund_amount_eur, CAST(t7.requested_at AS date) - CAST(t4.order_placed_at AS date) AS days_to_return CAST(t7.refund_amount / NULLIF(t7.eur_rate, 0) AS NUMERIC(18,6)) AS refund_amount_eur, {{date_diff_days(t4.order_placed_at, t7.requested_at)}} AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id),t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id),t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(t8.days_to_return) AS avg_days_to_return AVG(CAST(t8.days_to_return AS NUMERIC(18,6))) AS avg_days_to_return FROM t8 GROUP BY t8.category_id),t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8)SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, ROUND( 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0), 1 ) AS return_rate_pct, ROUND(COALESCE(t10.total_refund_eur, 0), 2) AS total_refund_eur, ROUND( 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0), 1 ) AS share_of_instance_refund_pct, ROUND(t10.avg_days_to_return, 1) AS avg_days_order_to_return 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0) AS return_rate_pct, COALESCE(t10.total_refund_eur, 0) AS total_refund_eur, 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0) AS share_of_instance_refund_pct, t10.avg_days_to_return AS avg_days_order_to_returnFROM t5LEFT JOIN t9 ON t9.category_id = t5.category_idLEFT JOIN t10 ON t10.category_id = t5.category_idCROSS JOIN t11ORDER BY total_refund_eur DESC, category_name ASCORDER BY total_refund_eur DESC NULLS FIRST, category_name ASC NULLS LAST, t5.category_id NULLS LAST
WITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id AS tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off' ), t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id ), t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260 ), t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' ), t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id ), t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4 ), t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id ), t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date) ), t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, CAST(t7.refund_amount / NULLIF(t7.eur_rate, 0) AS NUMERIC(18,6)) AS refund_amount_eur, DATE_DIFF('day', t4.order_placed_at, t7.requested_at) AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id ), t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id ), t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(CAST(t8.days_to_return AS NUMERIC(18,6))) AS avg_days_to_return FROM t8 GROUP BY t8.category_id ), t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8 ) SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0) AS return_rate_pct, COALESCE(t10.total_refund_eur, 0) AS total_refund_eur, 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0) AS share_of_instance_refund_pct, t10.avg_days_to_return AS avg_days_order_to_return FROM t5 LEFT JOIN t9 ON t9.category_id = t5.category_id LEFT JOIN t10 ON t10.category_id = t5.category_id CROSS JOIN t11 ORDER BY total_refund_eur DESC NULLS FIRST, category_name ASC NULLS LAST, t5.category_id NULLS LAST
WITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id AS tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off' ), t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id ), t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260 ), t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' ), t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id ), t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4 ), t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id ), t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date) ), t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, CAST(t7.refund_amount / NULLIF(t7.eur_rate, 0) AS NUMERIC(18,6)) AS refund_amount_eur, (CAST(t7.requested_at AS DATE) - CAST(t4.order_placed_at AS DATE)) AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id ), t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id ), t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(CAST(t8.days_to_return AS NUMERIC(18,6))) AS avg_days_to_return FROM t8 GROUP BY t8.category_id ), t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8 ) SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0) AS return_rate_pct, COALESCE(t10.total_refund_eur, 0) AS total_refund_eur, 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0) AS share_of_instance_refund_pct, t10.avg_days_to_return AS avg_days_order_to_return FROM t5 LEFT JOIN t9 ON t9.category_id = t5.category_id LEFT JOIN t10 ON t10.category_id = t5.category_id CROSS JOIN t11 ORDER BY total_refund_eur DESC NULLS FIRST, category_name ASC NULLS LAST, t5.category_id NULLS LAST
WITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id AS tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off' ), t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id ), t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260 ), t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' ), t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id ), t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4 ), t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id ), t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date) ), t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, CAST(t7.refund_amount / NULLIF(t7.eur_rate, 0) AS NUMERIC(18,6)) AS refund_amount_eur, dateDiff('day', t4.order_placed_at, t7.requested_at) AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id ), t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id ), t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(CAST(t8.days_to_return AS NUMERIC(18,6))) AS avg_days_to_return FROM t8 GROUP BY t8.category_id ), t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8 ) SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0) AS return_rate_pct, COALESCE(t10.total_refund_eur, 0) AS total_refund_eur, 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0) AS share_of_instance_refund_pct, t10.avg_days_to_return AS avg_days_order_to_return FROM t5 LEFT JOIN t9 ON t9.category_id = t5.category_id LEFT JOIN t10 ON t10.category_id = t5.category_id CROSS JOIN t11 ORDER BY total_refund_eur DESC NULLS FIRST, category_name ASC NULLS LAST, t5.category_id NULLS LAST
The agents' own records, as the role play wrote them; only the personal data of the person who ran it is redacted
Report request from Oliver Grant (analyst for the Head of Pricing and Promotions): Title: What's driving Welcome10's elevated refund pattern: category concentration and return timing Question: Is the Welcome10 instance's outsized refund total concentrated in particular product categories, and does the time between order and return look like a fit/expectation-mismatch problem (fast returns) or something else? Grain: one row per product category, restricted to the single Welcome10 discount instance with 260 orders (coupon_code='WELCOME10') identified in last week's report Columns: - category name (products.primary_category_id -> categories.name) - order_item count sold under this discount instance - distinct orders - items returned (return_items count) - return rate (% of items sold that were returned) - total refund amount for this category (EUR) - this category's share of the instance's total refund amount (%) - avg days between order placed_at and the return's requested_at (for returned items) Details: Source: re-identify the same discount_id as last week by discounts.name='Welcome 10% off' whose 2025 non-cancelled order count via order_discounts equals exactly 260. For those 260 orders, join order_items (quantity, product_variant_id) -> product_variants -> products (primary_category_id) -> categories (name); join return_items (via order_item_id) -> order_returns (status, requested_at, refund_amount or order_returns.refund_total apportioned) for returns tied to those order_items. Convert refund amounts to EUR via exchange_rates (base_code='EUR', quote_code=currency_code, as_of=order_returns.requested_at or refunded_at). Order by total refund amount (EUR) descending, category name as tie-break. Print all categories. Check your query with the warehouse's dry_run tool, then hand it in with submit.
dry_runWITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off' ), t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id ), t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260 ), t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' ), t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id ), t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4 ), t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id ), t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date) ), t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, t7.refund_amount / NULLIF(t7.eur_rate, 0) AS refund_amount_eur, CAST(t7.requested_at AS date) - CAST(t4.order_placed_at AS date) AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id ), t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id ), t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(t8.days_to_return) AS avg_days_to_return FROM t8 GROUP BY t8.category_id ), t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8 ) SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, ROUND( 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0), 1 ) AS return_rate_pct, ROUND(COALESCE(t10.total_refund_eur, 0), 2) AS total_refund_eur, ROUND( 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0), 1 ) AS share_of_instance_refund_pct, ROUND(t10.avg_days_to_return, 1) AS avg_days_order_to_return FROM t5 LEFT JOIN t9 ON t9.category_id = t5.category_id LEFT JOIN t10 ON t10.category_id = t5.category_id CROSS JOIN t11 ORDER BY total_refund_eur DESC, category_name ASC
STATUS: COMPILES (dry run on the empty schema, no data read) COLUMNS: category_name, order_items_sold, distinct_orders, items_returned, return_rate_pct, total_refund_eur, share_of_instance_refund_pct, avg_days_order_to_return
submitWITH t0 AS ( SELECT d.id AS discount_id, d.tenant_id FROM discounts d WHERE d.name = 'Welcome 10% off' ), t1 AS ( SELECT t0.discount_id AS discount_id, COUNT(DISTINCT o.id) AS order_count_2025 FROM t0 JOIN order_discounts od ON od.discount_id = t0.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' GROUP BY t0.discount_id ), t2 AS ( SELECT t1.discount_id AS discount_id FROM t1 WHERE t1.order_count_2025 = 260 ), t3 AS ( SELECT DISTINCT o.id AS order_id, o.placed_at AS order_placed_at FROM order_discounts od JOIN t2 ON t2.discount_id = od.discount_id JOIN orders o ON o.id = od.order_id WHERE o.status <> 'cancelled' AND o.placed_at >= DATE '2025-01-01' AND o.placed_at < DATE '2026-01-01' ), t4 AS ( SELECT oi.id AS order_item_id, oi.order_id AS order_id, t3.order_placed_at AS order_placed_at, COALESCE(cat.id, -1) AS category_id, COALESCE(cat.name, 'Uncategorized') AS category_name FROM order_items oi JOIN t3 ON t3.order_id = oi.order_id JOIN product_variants pv ON pv.id = oi.product_variant_id JOIN products p ON p.id = pv.product_id LEFT JOIN categories cat ON cat.id = p.primary_category_id ), t5 AS ( SELECT DISTINCT t4.category_id AS category_id, t4.category_name AS category_name FROM t4 ), t6 AS ( SELECT ri.id AS return_item_id, ri.order_item_id AS order_item_id, ri.refund_amount AS refund_amount, ri.currency_code AS currency_code, ret.requested_at AS requested_at, ret.refunded_at AS refunded_at FROM return_items ri JOIN order_returns ret ON ret.id = ri.return_id JOIN t4 ON t4.order_item_id = ri.order_item_id ), t7 AS ( SELECT t6.return_item_id AS return_item_id, t6.order_item_id AS order_item_id, t6.refund_amount AS refund_amount, t6.requested_at AS requested_at, er.rate AS eur_rate FROM t6 LEFT JOIN exchange_rates er ON er.base_code = 'EUR' AND er.quote_code = t6.currency_code AND er.as_of = CAST(COALESCE(t6.requested_at, t6.refunded_at) AS date) ), t8 AS ( SELECT t4.category_id AS category_id, t7.return_item_id AS return_item_id, t7.refund_amount / NULLIF(t7.eur_rate, 0) AS refund_amount_eur, CAST(t7.requested_at AS date) - CAST(t4.order_placed_at AS date) AS days_to_return FROM t7 JOIN t4 ON t4.order_item_id = t7.order_item_id ), t9 AS ( SELECT t4.category_id AS category_id, COUNT(*) AS items_sold, COUNT(DISTINCT t4.order_id) AS distinct_orders FROM t4 GROUP BY t4.category_id ), t10 AS ( SELECT t8.category_id AS category_id, COUNT(*) AS items_returned, SUM(t8.refund_amount_eur) AS total_refund_eur, AVG(t8.days_to_return) AS avg_days_to_return FROM t8 GROUP BY t8.category_id ), t11 AS ( SELECT SUM(t8.refund_amount_eur) AS grand_total_refund_eur FROM t8 ) SELECT t5.category_name AS category_name, COALESCE(t9.items_sold, 0) AS order_items_sold, COALESCE(t9.distinct_orders, 0) AS distinct_orders, COALESCE(t10.items_returned, 0) AS items_returned, ROUND( 100.0 * COALESCE(t10.items_returned, 0) / NULLIF(COALESCE(t9.items_sold, 0), 0), 1 ) AS return_rate_pct, ROUND(COALESCE(t10.total_refund_eur, 0), 2) AS total_refund_eur, ROUND( 100.0 * COALESCE(t10.total_refund_eur, 0) / NULLIF(t11.grand_total_refund_eur, 0), 1 ) AS share_of_instance_refund_pct, ROUND(t10.avg_days_to_return, 1) AS avg_days_order_to_return FROM t5 LEFT JOIN t9 ON t9.category_id = t5.category_id LEFT JOIN t10 ON t10.category_id = t5.category_id CROSS JOIN t11 ORDER BY total_refund_eur DESC, category_name ASC
Submitted to tonight's batch. Your work on this request is done.