All tools

See how many first-time customers come back, with the uncertainty beside the number.

or drop it hereCSV

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%

100%50%0%
0147294

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.

SlotsVisitsSold out
Mon 11340
Mon 14430
Mon 17350
Mon 18580
Mon 20180
Tue 111170
Tue 141260
Tue 17670
Tue 181230
Tue 20640
Wed 11990
Wed 14440
Wed 17460
Wed 18680
Wed 201730
Thu 11490
Thu 14370
Thu 17660
Thu 18850
Thu 20340
Fri 111130
Fri 14340
Fri 17740
Fri 18790
Fri 20200
Sat 11750
Sat 14530
Sat 17620
Sat 1831136
Sat 20960
Sun 11460
Sun 141170
Sun 17810
Sun 18190
Sun 20400
Reorder radar
ProductCustomersMedian gap, daysOverdue now
Private hire51216
Sauna session46219
Ten-pack40212
Cold plunge37217
Adjust the model assumptions
2
15
45
95
4
8
1.25
2
10
3
540

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.