Product analytics case study · SQL · Python · Power BI

Where checkout breaks, and what it's worth to fix

Loading the analysis…

Hungrly is a fictional European food & grocery delivery app. The data is synthetic: 185,000 sessions and 833,000 events from 1 Apr to 30 Sep 2026, built to mirror real checkout behaviour. Every figure on this page is computed by the project's SQL and Python pipeline.

01 · Where users leave

One screen loses more users than any other step in checkout

Order Review is the first screen that shows the full price: delivery, service and small-order fees, and whether the promo code worked.

Checkout funnel

Sessions reaching each step. Right: share lost since the previous step.

Abandoned carts by exit screen

The screen users were on when they left.

02 · Who leaves

Mobile vs laptop is the wrong cut: app vs mobile web is the right one

Exit rate by screen

Share of users who left from each screen, of those who reached it.

Carts and abandonment by hour

After 23:00 delivery estimates jump and surge fees apply.

Payment exits by platform and method

Card payments on mobile web go through a 3-D Secure redirect and there is no Apple / Google Pay.

03 · Why they leave at Order Review

Fee shock and broken promo promises

Users decide on a basket, then see fees they didn't expect or learn their discount doesn't apply.

Below €15, exit climbs steeply

Order Review exit rate by basket subtotal (€1 bins, 95% CI band). Baskets under €15 pay a small-order fee of up to €4.

Exit rises with fees as a share of the basket

Order Review exit rate by total fees ÷ basket subtotal.

A failed promo code at the last screen

Order Review exit rate by promo-code outcome.

What drives the exit, controlling for everything else

Logistic regression on users who reached Order Review. Odds ratios with 95% CI; right of 1× means more likely to leave.

04 · What it's worth

Recoverable GMV per fix

(Problem segment exit rate − healthy benchmark) × users affected × downstream conversion × average order value, annualised.

30% is the planning case. 100% is the ceiling: problem users behave like the benchmark group.

All 5 fixes, per year—

05 · What to do

Recommendations for the product team

Ranked by value and effort. The first two share one root cause and one screen: users discover the real price at the last moment.

  1. Show the all-in price on the cart screen with a nudge: “Add €3.20 more to skip the small-order fee”. Fee shock · Medium effort
  2. Validate promo codes in the cart and show min-spend progress: “€4.20 more to unlock 20% off”. Failed promos · Low effort
  3. Turn on Apple Pay / Google Pay for mobile web, with inline 3-D Secure. Payment friction · Medium effort
  4. Show the delivery estimate on the store page; offer scheduled delivery late at night. Long ETAs · Low effort
  5. Guest checkout for new web users, creating the account after the order. Forced sign-up · Medium effort

Prove it: A/B test for fix #1

Primary metric
Cart → order conversion. It catches exits that just move to an earlier screen.
Secondary
Order Review exit rate, AOV, share of baskets just above €15
Guardrails
Fee revenue per order, Cart → Checkout Start rate, support contacts

How this was built

  1. DataPython generator: 185K sessions, 8-step funnel, fees, promos, ETAs
  2. SQLSQLite schema, an analysis view and 15 queries (CTEs, window functions)
  3. Pythonpandas, statsmodels: χ² and z-tests, logistic regression, power analysis
  4. Power BIStar schema, 34 DAX measures, field parameters, what-if slider
  5. WebThis page: static HTML + D3, data exported from the pipeline

Limitations: the data is synthetic and the analysis is observational. Sizing is in GMV, not profit; multiply by take rate for net revenue. The A/B test is how causality gets proven.