See how many first-time customers come back, with the uncertainty beside the number.
A CSV from your booking system, your till or your shop. One row per booking or order. Your file never leaves this tab.
Example report from invented customers
28.4%
Estimated share of first-time customers who return, by day 90.
95% interval: 24.6% to 32.8%
Days after the first visit
- Customers
- 477
- Attended visits
- 2,606
- Came back
- 174
The figure a dashboard would show you: 36.5%
That second number counts somebody who first came last week as a customer who never returned. On a growing business it gets worse the faster you grow.
Half of those who return do so within: not reached inside this file
Your file says nothing about marketing consent, so the ranking assumes you may contact everybody in it. The model in production refuses to guess and scores an unreachable customer at zero.
Your file does not carry your costs, so the margin behind every winnability figure is the order value itself. Treat those numbers as an upper bound.
Where your customers stand
These groups describe the booking patterns in your file. They are model estimates, not predictions checked against future visits.
- LapsedWell past their own window with no reason found.
- 207
- RepeatComing back, and inside their own window.
- 88
- LoyalTen visits or more and inside their own window.
- 79
- At riskPast their own window with no reason found.
- 76
- First timeOne visit, and not yet late by their own clock.
- 20
- Was always visitingToo far away and too little history to call this a habit that broke. Chasing them costs goodwill.
- 3
- Paid and not comingThey hold credits or a membership and have gone quiet. The cheapest and the most urgent list here.
- 2
- Shut outTheir usual slot kept selling out after they stopped coming. The fix is the timetable, not a discount.
- 2
Slots
Counted from your own bookings, so a slot nobody booked is not in the file and is not in this grid. The sold-out share below is the share of the slots that had at least one booking.
| Slots | Visits | Sold out |
|---|---|---|
| Mon 11 | 34 | 0 |
| Mon 14 | 43 | 0 |
| Mon 17 | 35 | 0 |
| Mon 18 | 58 | 0 |
| Mon 20 | 18 | 0 |
| Tue 11 | 117 | 0 |
| Tue 14 | 126 | 0 |
| Tue 17 | 67 | 0 |
| Tue 18 | 123 | 0 |
| Tue 20 | 64 | 0 |
| Wed 11 | 99 | 0 |
| Wed 14 | 44 | 0 |
| Wed 17 | 46 | 0 |
| Wed 18 | 68 | 0 |
| Wed 20 | 173 | 0 |
| Thu 11 | 49 | 0 |
| Thu 14 | 37 | 0 |
| Thu 17 | 66 | 0 |
| Thu 18 | 85 | 0 |
| Thu 20 | 34 | 0 |
| Fri 11 | 113 | 0 |
| Fri 14 | 34 | 0 |
| Fri 17 | 74 | 0 |
| Fri 18 | 79 | 0 |
| Fri 20 | 20 | 0 |
| Sat 11 | 75 | 0 |
| Sat 14 | 53 | 0 |
| Sat 17 | 62 | 0 |
| Sat 18 | 311 | 36 |
| Sat 20 | 96 | 0 |
| Sun 11 | 46 | 0 |
| Sun 14 | 117 | 0 |
| Sun 17 | 81 | 0 |
| Sun 18 | 19 | 0 |
| Sun 20 | 40 | 0 |
Reorder radar
| Product | Customers | Median gap, days | Overdue now |
|---|---|---|---|
| Private hire | 51 | 21 | 6 |
| Sauna session | 46 | 21 | 9 |
| Ten-pack | 40 | 21 | 2 |
| Cold plunge | 37 | 21 | 7 |
Adjust the model assumptions
Choose your next action
One HTML file with the numbers in it. It opens in any browser with no internet connection and no scripts. It contains your customers' identifiers, so treat it like the export it came from.
Review the file and column mapping
Runs in your browser. What you put in never leaves this tab.
How it works, and what it can't see
Your file never leaves this tab. It is read and modelled in your own browser, and the page names whether that happened in a background worker or on the main thread. The file is not uploaded, stored or sent anywhere. The forget command has nothing to wipe here, because this tool writes nothing to your machine at all.
The distance bands were drawn for a rural Irish sauna. Fifteen kilometres is habit range, ninety-five is the point where Dublin stops being a catchment and starts being a day out. For your business those numbers may be nonsense, which is why every one of them is a slider.
The priors are stated assumptions rather than fitted parameters, and the people who wrote them say so in the code. One venue and eighteen months is not enough history to fit five coefficients without overfitting, so somebody wrote down what they believed and left it arguable.
The model has never been scored against what customers went on to do. Nobody has taken a list of people it called lapsed and checked how many were. It reorganises the dates you already have, which is worth doing, and it is a different thing from knowing what happens next.
The model is Tigh Sauna's, a booking system for Irish saunas. It was ported from the SQL that runs in that product's database, and a test in this repository checks the port against that SQL, row for row, on every pull request. Tigh Sauna
Can't see
- Why anyone left. Every verdict here is a shape in your own dates. Somebody who moved house and somebody who had a bad time look identical from the outside, and nothing in this tool can tell them apart.
- Anyone whose town is not in the table, and anyone with no town at all. Distance is worked out from town centroids, so a row with no match gets no distance and is judged on behaviour alone. That is deliberate: not knowing where somebody lives is a gap in your records, and it must not be charged to the customer as suspicion.
- Your summer, if your file covers fewer than twelve months. The season factor is switched off below that and the page says so. One winter is no evidence at all about your summer.
- The difference between a no-show and a completed visit, unless your export has a status column and you map it. Without one, every row that is not cancelled counts as a visit, which is a slightly kinder reading than the model uses in production.
- Anything that is not in the file. No addresses, no marketing consent, no memberships or prepaid credits unless a column carries them, and nothing at all about people who have never booked.
- Whether any of the verdicts are right. The model has never been scored against what customers went on to do. It reorganises what your dates already say, which is useful, and it is not the same thing as being correct.