{
 "notes": "Night 3 confirmed the Studio Vrij story with real operational data: their placed-to-delivered time spiked to 9.3 days avg and 70.1% of shipments took over 7 days in May 2025 alone (vs 0-20% other months, platform average stayed 3-5%) - a genuine single-merchant fulfillment breakdown that explains the ticket spike, not a support-side or platform-wide issue. Useful side-finding: platform-wide % of shipments over 7 days creeps up in Nov/Dec 2025 (7-12% vs ~3-5% normally) alongside a real volume surge (1600→2600+ shipments/month) - that's consistent with capacity-constrained holiday fulfillment driving the recurring Nov/Dec ticket spikes seen across all three years, which is the platform-level theme Daniel asked about. The returns-by-merchant report is reassuring: resolve time (~7.5-8.5 days) and rejection rates are consistent across merchants regardless of return-rate level (which mostly tracks vertical - apparel/footwear naturally higher, food/beauty lower) - a clean contrast to how much support-speed varies by merchant. CSAT is noisy but its worst months (Dec-23, Dec-24/Jan-25, Jun-25, Dec-25) line up exactly with the ticket volume/slowness spikes already identified, suggesting speed drives satisfaction. This is the last night, so I'm using the 3 slots to: (1) get CSAT by merchant so Daniel can see which merchants are the weakest satisfaction spots (mirroring the support-speed and returns peer reports already in hand), (2) directly quantify the CSAT-vs-resolution-speed relationship platform-wide to turn \"slow support hurts satisfaction\" from a visual coincidence into a measured one - this is the single clearest \"fix this and it moves the needle broadly\" argument for the memo, and (3) a first look at product review ratings (priority #5) since there's room, to see if it echoes the CSAT dips or reveals a blind spot in ticket data.",
 "requests": [
  {
   "title": "Shopper satisfaction (CSAT) by merchant, 2025",
   "question": "Which merchants have the weakest shopper satisfaction, and how much does it vary across the platform?",
   "grain": "one row per tenant (merchant), among tenants with at least 10 CSAT responses in 2025",
   "columns": [
    "merchant name",
    "CSAT responses, 2025",
    "avg score (1-5)",
    "median score (1-5)",
    "% satisfied (score >= 4)",
    "% dissatisfied (score <= 2)"
   ],
   "details": "Source: csat_responses joined to tenants (for name). Window: submitted_at in 2025-01-01 through 2025-12-31. Only include tenants with >=10 CSAT responses in 2025 to avoid noisy small samples. avg/median score over csat_responses.score. '% satisfied' = score>=4 count / total responses that tenant-year, percentage rounded to 1 decimal; '% dissatisfied' = score<=2 count / total, percentage rounded to 1 decimal. Round avg score to 2 decimals, median to 1 decimal. Order by avg score ascending (worst first, so the weakest spots surface at the top), tie-break by merchant name ascending. Cap at 50 printed rows per house standard; note total qualifying tenant count in the footer. I will cross-reference merchant names against the existing 'Response & resolution times by merchant, 2025' report rather than re-querying resolution time here, to keep this report single-purpose.",
   "builds_on": [
    "Shopper satisfaction (CSAT) trend, monthly",
    "Response & resolution times by merchant, 2025"
   ]
  },
  {
   "title": "CSAT score by ticket resolution-time bucket",
   "question": "Does a slower ticket resolution actually translate into a lower satisfaction score?",
   "grain": "one row per resolution-time bucket, platform-wide, across all tickets 2023-2025 that have both a resolution and a CSAT response",
   "columns": [
    "resolution time bucket",
    "tickets (count)",
    "avg CSAT score (1-5)",
    "% satisfied (score >= 4)",
    "% dissatisfied (score <= 2)"
   ],
   "details": "Source: tickets joined to csat_responses on tickets.id = csat_responses.ticket_id. Only include tickets with resolved_at not null and a matching csat_responses row. resolution_hours = extract(epoch from resolved_at - created_at)/3600. Bucket into: '<4h', '4-24h', '1-3 days' (24-72h), '3-7 days' (72-168h), '>7 days' (168h+). Window: tickets.created_at 2023-01-01 through 2025-12-31 (full history, to get a reliable sample size per bucket). avg score over csat_responses.score for tickets in that bucket, rounded to 2 decimals. '% satisfied'/'% dissatisfied' as in the other CSAT reports, rounded to 1 decimal. Order by the bucket's natural time order (use a numeric sort key for the lower bound of each bucket, e.g. 0, 4, 24, 72, 168), not alphabetically. Expect exactly 5 rows.",
   "builds_on": [
    "Shopper satisfaction (CSAT) trend, monthly",
    "Support response & resolution time trend, monthly"
   ]
  },
  {
   "title": "Product review ratings trend, monthly",
   "question": "What are shoppers' product review ratings telling us, and does the pattern echo the dips we see in support CSAT?",
   "grain": "one calendar month, platform-wide",
   "columns": [
    "month (YYYY-MM)",
    "reviews submitted",
    "avg rating (1-5)",
    "median rating (1-5)",
    "% low rating (1-2 stars)",
    "% high rating (4-5 stars)",
    "% verified purchase"
   ],
   "details": "Source: product_reviews. Grain the month on created_at. Window: 2023-01-01 through 2025-12-31 (36 months). Only include is_approved = true reviews (published ones actually shown to shoppers). avg/median rating over product_reviews.rating. '% low rating' = rating in (1,2) count / total reviews that month, percentage rounded to 1 decimal; '% high rating' = rating in (4,5) count / total, percentage rounded to 1 decimal. '% verified purchase' = is_verified_purchase=true count / total reviews that month, percentage rounded to 1 decimal. Round avg rating to 2 decimals, median to 1 decimal. Order by month ascending.",
   "builds_on": [
    "Shopper satisfaction (CSAT) trend, monthly"
   ]
  }
 ]
}