Guest intelligence
Your best guest
is a stranger
to your POS.
A point-of-sale records what was ordered, not who ordered it, so the regular who came in twice a week for a year and then stopped looks exactly like a first-timer. Habitu keeps a behavioural record for every member behind the loyalty programme, and turns it into audiences an operator can build without writing a query.


A captured order writes a visit, so a guest counts as seen whether or not anyone scanned anything.
Sixteen behavioural signals per member, recomputed overnight: recency, frequency, timing.
Segments are stored as criteria, not lists, and compiled against current signals when you open them.
A saved segment carries into the campaign builder with its audience already attached.
What is customer segmentation for restaurants?
Customer segmentation groups the guests of a restaurant by how they behave: how recently they visited, how often, when in the day, what they order. A brand can then treat a lapsing regular differently from a first-timer. In practice it needs two things a till does not provide: a guest record that outlives a single transaction, and a way to turn that record into an audience without a data team.
- Behavioural signal
- A computed fact about one member, held per brand: visits in the last thirty days, days since the last visit, preferred daypart. Habitu stores sixteen.
- Segment
- A saved set of criteria, not a saved list of people. It is compiled against current signals every time it is opened or sent to.
- Activity state
- Where a guest sits on the recency ladder, derived from the date of their last visit: active, cooling, lapsing, dormant, lost.
- Audience count
- How many guests match a set of filters right now. Habitu computes it in the database while you edit, before anything is saved or sent.
Signal store
A till records the order. It does not remember the guest.
Point-of-sale reporting is organised around transactions: what sold, when, at which site. It holds no opinion about the person, because it has no reason to keep one. Habitu keeps a row per member per brand and recomputes it on a schedule, so behaviour is something you can ask questions of rather than something you infer from a receipt.
Sixteen signals per member
Visits in the last thirty days and the thirty before that, days since their last visit, days since joining, preferred daypart and day of week, weekend-only, preferred location.
A recency ladder, not a guess
Every member lands in one of five states: active within seven days, cooling within thirty, lapsing within sixty, dormant within ninety, lost beyond that.
Purchases count as visits
Capturing an order writes the visit, so a guest who orders and never scans anything still reads as active. A refund or a cancellation reverses it, so the record stays honest.
Recomputed every night
A scheduled job refreshes signals for every brand at 02:00 UTC. One brand failing is logged and skipped; it does not take the rest of the batch down with it.
Sixteen signals per member, per brand. The visit behind them lands the moment an order is captured; the derived signals are recomputed for every brand overnight at 02:00 UTC.
Guest records
Every count resolves to a person you can open.
A dashboard tile you cannot click is a dead end: it tells you a number of guests are slipping and gives you no way to look at one of them. The guest list is that same data at member resolution, and every row opens the person behind it.
Four states, one rule each
New at fourteen days or less since joining, active within thirty days of a visit, at risk between thirty and sixty, churned beyond that or never seen.
Filter the way you think
Search by name, phone or email, and narrow by status or by VIP tier. The tier list is built from the tiers guests actually hold, not from a config file.
One guest, one page
Their join date, recent visits with the site and date, recent redemptions, and badges for what they currently qualify for.
A feed with no invented rows
The activity timeline is derived from persisted tables: visits with the points they earned, redemptions, and new enrolments. Nothing is synthesised, so an empty brand shows an empty feed.
Every guest carries one of these states. The list can be narrowed to New or At Risk, and to a VIP tier. A row opens that guest's own page.
Segments
A segment is a question, not a list.
Export a spreadsheet of lapsed guests and it is wrong by the weekend: some of them came back, and the ones who should be on it were not there when you pressed the button. Habitu stores a segment as its criteria and compiles it against the current signal store every time you open the board.
Criteria, not a snapshot
Opening the segments board recompiles each one from live signals. There is no exported list sitting in a folder going quietly out of date.
Named in English, not in SQL
When you attach a saved group to a campaign, its rule is written out in plain English on the picker, so you never send to an audience whose definition you have to take on trust.
An honest em-dash
A card whose data a brand has not connected yet shows an em-dash and says what is missing, instead of a zero that would read as a brand with nothing wrong.
Coverage, not just counts
The board also shows how many of your guests fall into no segment at all, which is usually the more useful number to look at first.
COVERAGE 243 of 410 guests sit in at least one segment. The last card cannot be computed from connected data, so it shows an em-dash and says what is missing, rather than a zero.
Audience builder
Build any audience you can describe.
Every brand has the same handful of obvious questions. The builder is for the one only you have. Pick a field, pick an operator, set a value, and combine conditions with AND and OR, including groups, so 'lapsing regulars who order coffee, or anyone who has never ordered from the new site' is one audience rather than three exports.
Behaviour, profile and order history
Activity and timing signals, engagement patterns, and profile fields like language or birthday month, plus conditions on what someone has actually ordered.
Ordered it, or never has
Match on a product, a category or a location, over an optional time window: has ordered, with an optional measure such as number of orders or distinct order days, or has never ordered.
The count comes from the database
Not from a sample in the browser. Every edit runs a distinct-member count server-side, so the count is computed over your whole guest base, not a page of it.
Fail closed, not fail confident
The compiler only accepts fields on a server-side whitelist. An unknown field or an unsupported operator resolves to an empty audience rather than a query that quietly matches the wrong people.
Only whitelisted fields compile, so anything else resolves to an empty audience rather than the wrong guests.
Questions operators ask.
How do I find guests who have stopped coming in?
Filter on days since last visit, or on the activity state Habitu assigns every member: active within seven days, cooling within thirty, lapsing within sixty, dormant within ninety, lost beyond that. Because a captured order writes a visit record, that clock reflects purchases rather than whether someone remembered to scan a loyalty card at the counter.
Do I need SQL or an analyst to build a customer segment?
No. The audience builder is a picker: choose a field, choose an operator, set a value, add another. Conditions combine with AND and OR, and can be nested into groups. The matching guest count is computed by the database as you edit, and nothing is saved or sent until you say so. The cost of trying an idea is a few clicks.
How current is the guest data behind a segment?
Behavioural signals are recomputed for every brand nightly at 02:00 UTC, and one brand failing does not abort the batch. Segments are not stored as lists. They are criteria, compiled against the current signal store each time you open the board, so a segment saved months ago still means what it said. Order-history conditions read the orders tables directly.
Can I build an audience from what people actually ordered?
Yes. An order-history condition matches on a product, a product category or a location, in either direction, has ordered or has never ordered, over an optional time window. The has-ordered direction can also carry a measure: number of orders or distinct order days, and item quantity on a product or category filter. Only captured, uncancelled orders count; a refunded order still counts, because the guest did order it.
Can I send a campaign to a segment?
A saved segment carries into the campaign builder with its audience attached, and an audience you built here is resolved at send time by the same server-side compiler that produced the count you saw. In-app inbox and email are the live channels today; push and SMS can be composed and previewed, but do not dispatch yet. Guests who fall inside your frequency cap are skipped and reported back, and email respects a guest's marketing opt-out. The in-app inbox is the guest's own account feed, so it always delivers.
What happens to a segment that needs data a brand has not connected yet?
The count shows an em-dash and the card names what is missing, rather than a zero, because a zero would read as a healthy brand with nobody lapsing, which is the one answer you must not get wrong.
Who can see guest data?
Only staff attached to that brand. The signal table has row-level security enabled with the anonymous role revoked outright, and every read is gated on brand membership. The compile function runs with elevated rights so it can do the set maths in one statement, but it checks the caller's brand membership itself. A request for another brand's audience is rejected, not answered.
Does this work across several locations?
Signals are held per brand, so one guest is one guest whichever site they walk into. Location shows up in two places: an order-history condition can be scoped to a single location, and each location has its own view of top regulars, recent visitors and recent redemptions.
Find the guests you are losing.
Thirty minutes, configured to your brand. Not a slide deck.
Book a demo →