hose Demo data with a pulse

A claim about Overwater

Seven in ten carts are abandoned at checkout.

Checkout abandonment between 62% and 78% of carts, excluding the last two days, which may still convert. After recovery emails, about two carts in three still never become an order.

holds on the current window

as of 422 days ago

Checkout abandonment

SELECT COUNT(*)                                            AS carts,
       SUM(o.id IS NULL)                                   AS abandoned_at_checkout,
       ROUND(100.0 * SUM(o.id IS NULL) / COUNT(*), 1)      AS checkout_abandonment_pct
FROM carts c
LEFT JOIN orders o ON o.cart_id = c.id
                  AND datetime(o.ordered_at) <= datetime(c.created_at, '+2 hours')
WHERE datetime(c.created_at) < datetime((SELECT MAX(created_at) FROM carts), '-2 days');
carts
49678
abandoned_at_checkout
37050
checkout_abandonment_pct
74.6

holds on the current window

Never ordered after recovery

SELECT COUNT(*)                                            AS carts,
       SUM(o.id IS NULL)                                   AS never_ordered,
       ROUND(100.0 * SUM(o.id IS NULL) / COUNT(*), 1)      AS never_ordered_pct
FROM carts c
LEFT JOIN orders o ON o.cart_id = c.id
WHERE datetime(c.created_at) < datetime((SELECT MAX(created_at) FROM carts), '-2 days');
carts
49678
never_ordered
32513
never_ordered_pct
65.4

holds on the current window

The Baymard Institute’s running average for cart abandonment is just over 70 percent, and it is one of the few e-commerce numbers an audience will check you against. Overwater stores carts as rows and orders that reference them. Abandonment is a join you can run. Baymard counts checkout abandonment, a cart with no order within two hours. Some of those carts come back later through a recovery email, so the share that never becomes an order is lower. Carts from the last two days are excluded because a recovery email can still convert them.

Timestamps in the file are ISO 8601 text with a T separator. SQLite’s datetime() writes a space. Every comparison below normalizes both sides with datetime().

What you should see

The first query returns one row near 70 percent. The second returns a lower figure, in the mid sixties, and the gap between them is the recovery email doing its work. Add strftime('%Y-%m', c.created_at) to either query’s GROUP BY and the monthly rate wobbles by a few points without leaving the band, because the checkout outcome is drawn per cart, not per month.

Run it yourself

More on Overwater