Growth is real, and more of it now comes from people who have bought before: returning customers were 21.3% of revenue in 2025 and 30.5% so far in 2026. But that is mostly the customer base getting bigger. The rate at which each new cohort comes back has not moved, and it depends heavily on where customers first came from.
31.9% of customers first acquired through Email order again within 90 days, against 10.9% for Marketplace. They are also worth $191.50 each so far, against $132.15.
Every quarterly cohort with a full window repeats at 24.1% to 26.5% within 180 days. Nothing in the last 18 months has changed how likely a new customer is to come back.
482 customers have bought two or more times but not in the last 180 days. They account for 24.7% of all revenue ($126,672).
75.2% of customers have a single order. 1,733 of them last bought more than 180 days ago.
Monthly net revenue from first orders (navy) and repeat orders (teal). The peak month was 2026-08 at $30,938.

| Channel | Customers | 90-day repeat | Revenue / cust. |
|---|---|---|---|
| 404 | 31.9% | $191.50 | |
| Referral | 369 | 25.2% | $174.03 |
| Search | 1,025 | 19.7% | $157.21 |
| Social | 785 | 12.7% | $134.00 |
| Marketplace | 330 | 10.9% | $132.15 |
Customers acquired by 1 July 2026, so each has a full 90-day window. Revenue per customer is all net revenue to date.
Reading this: Email and Referral customers arrive already warm and come back. Marketplace and Social bring volume at first purchase, but fewer of those buyers return, so their true cost per retained customer is higher than first-order figures suggest.

| Cohort | Customers | 90 days | 180 days |
|---|---|---|---|
| 2025Q1 | 453 | 18.1% | 24.1% |
| 2025Q2 | 449 | 19.1% | 26.5% |
| 2025Q3 | 447 | 19.5% | 25.9% |
| 2025Q4 | 536 | 19.2% | 24.2% |
| 2026Q1 | 502 | 19.9% | 25.7% |
| 2026Q2 | 520 | 19.6% | n/a |
| 2026Q3 | 505 | n/a | n/a |
n/a: the cohort has not yet had the full window.

| Segment | Customers | Revenue | Share |
|---|---|---|---|
| Champions | 97 | $36,571 | 7.1% |
| Loyal | 268 | $64,185 | 12.5% |
| At risk | 482 | $126,672 | 24.7% |
| New | 314 | $35,124 | 6.9% |
| Single order, recent | 518 | $57,960 | 11.3% |
| Lapsed one-off | 1,733 | $191,826 | 37.4% |
Segment rules: Champions 3+ orders and last order within 120 days; Loyal 2+ orders within 180 days; At risk 2+ orders, none in 180 days; New 1 order within 60 days; Single order, recent 1 order 61–180 days ago; Lapsed one-off 1 order over 180 days ago.
| Step | Rows |
|---|---|
| Rows in the raw export | 4,996 |
| Channel values standardised (case, spaces) | 144 |
| Test orders removed | 12 |
| Duplicate order rows removed | 85 |
| Blank regions set to Unknown | 60 |
| Refunded orders excluded from revenue | 220 |
| Paid orders analysed | 4,679 |
Revenue: order value of paid orders. Refunded orders are excluded from revenue and order counts.
First channel: the channel of a customer's first paid order.
Repeat within N days: another paid order 1 to N days after the first. Only customers with a full window are counted.
Growth: Jan–Sep 2026 against Jan–Sep 2025.
A single Jupyter notebook (pandas, NumPy, Matplotlib) reads the raw export, logs each cleaning step, calculates every figure and chart in this report, and writes them to a metrics file and clean CSVs. The report is generated from those outputs, so re-running the notebook on a new export refreshes it with no hand-typed numbers.
A separate check script recalculates the headline figures from the raw export without pandas and confirms they match the notebook and this PDF.
| File | What it is |
|---|---|
| analysis.ipynb | The executed notebook, with outputs |
| data/orders_raw.csv | Raw order export |
| output/clean_orders.csv, customers.csv | Clean paid orders and one row per customer with segment |
| output/metrics.json | Every figure used in this report |