Operator dashboard
Monthly reports are
a post-mortem.
By the time a month-end report lands, the month is already over. Habitu scores your programme's health every time you open it: one number from 0 to 100, five sub-scores that say which part is weakest, and every location ranked against your own brand average.
One number from 0 to 100, weighted across revenue, retention, growth, engagement and redemptions.
Five sub-scores sit under it, so a low number tells you which part is holding it down.
Every site is ranked against your own brand average, the one that needs you at the top.
A flagged site carries one sentence to act on and opens the campaign builder already set up for it.
What is a restaurant loyalty dashboard?
A restaurant loyalty dashboard is the operator's view of a loyalty programme: who is enrolled, how often they come back, what they redeem, and which sites are drifting. A useful one does more than list those numbers. It scores them, so an owner with eight locations can tell in a second whether anything needs their attention today.
- Pulse score
- A 0-100 composite of five weighted dimensions: revenue at 0.30, retention 0.25, growth 0.20, engagement 0.15, redemptions 0.10.
- Sub-score
- One of those five dimensions, scored 0-100 on its own, so the headline number can be taken apart instead of argued with.
- Member signal
- A pre-computed row per guest, refreshed every night: churn risk, engagement, value tier, recency, points to the next reward.
- Location signal
- The single highest-priority thing that is true about one site this month, measured against your brand's own averages.
Pulse score
One number, and it is not a vanity metric.
Pulse blends five dimensions into a single 0-100 score, weighted the way an operator would weight them: revenue counts for 0.30, retention 0.25, growth 0.20, engagement 0.15, redemptions 0.10. It is computed from your own data every time the home screen loads. There is no benchmark against other brands inside it. Each dimension is scored against a fixed scale rather than a moving baseline. Redemptions at a quarter of your member base reads 100, growth at a fifth reads 100, so the same inputs always produce the same number, on day one and on day four hundred.
Weighted, not averaged
Revenue at 0.30 and redemptions at 0.10 is a deliberate ordering. The things that pay the rent move the score most.
Green at 70, amber at 40
The same two thresholds colour the ring and every sub-score, so the screen reads correctly from across the room.
Blended on load
Members, visits, rewards and campaigns are read live and blended in the browser, alongside the guest signal store as last night's recompute left it. The score itself is never a figure someone cut in advance.
A heartbeat, not a gauge
The line behind the ring beats at an amplitude keyed to the score, and holds a still baseline for anyone who has reduced motion switched on.
Example configuration. The composite is computed from the five sub-scores at the weights shown, never typed in. Green from 70, amber from 40, red below, the same thresholds the product uses on the ring and on every sub-score.
Guest intelligence
The score knows why, because every guest has a file.
Underneath the Pulse sits a signal store: one row per guest per brand, sixteen fields deep. Churn risk and engagement are each scored 0 to 100, value is a quintile inside your own base, and recency is a bucket that runs from active through cooling, lapsing and dormant to lost. The whole store is rebuilt nightly.
Sixteen signals per guest
Visit frequency now and prior, average ticket, days since the last visit, preferred location, preferred daypart and day of week, points to the next reward.
Risk is scored, not guessed
Churn risk weights days since the last visit, recent visit frequency, tier and redemption history into one number between 0 and 100.
At risk means your best guests
The at-risk group is not everyone who went quiet. It is top-tier members who have not visited in 30 days, which is a different and much shorter list.
A queue, not a report
When a group is big enough to be worth acting on, a recommendation appears with the signal that fired it and its own expiry date, so a stale suggestion drops off rather than lingering.
The visit itself lands the moment an order is captured. The sixteen derived fields above (churn risk, engagement, recency, value tier) are rebuilt for every brand nightly at 02:00 UTC, so they read as the overnight run left them. One brand failing does not stop the batch.
The visit itself lands the moment an order is captured. The sixteen derived fields above (churn risk, engagement, recency, value tier) are rebuilt for every brand nightly at 02:00 UTC, so they read as the overnight run left them. One brand failing does not stop the batch.
Location insights
Which site needs you this week.
Every location is measured against your own brand averages rather than an industry figure: redemption rate, points earned per visit, and how many of its visitors are joining the programme at all. The list sorts critical first, so the site that needs a phone call is at the top before you have read a single number.
One signal per site
Each location gets the single highest-priority thing that is true about it, from a fixed set of eight: no visits, visits down, low redemptions, low earn rate, weak enrolment, top performer, visits up, or healthy.
Compared with you, not an average restaurant
The thresholds are ratios of your own brand: below 70 per cent of your redemption rate is a gap, below 80 per cent of your earn rate is a flag.
Quiet sites do not cry wolf
A rate signal needs at least three visits in the window and a trend signal needs three in the prior month, so a slow week at a small site raises nothing.
The callout is the action
Each flagged site carries one sentence on what to do and a button that opens the campaign builder with the template matched to that signal already chosen.
Every rate is compared with your own brand average, not an industry figure. A site needs at least three visits in the window before a rate-based signal can fire.
Measurement
Numbers you can put in front of a franchisor.
Programme Performance measures the last 30 days against the 30 before them: what share of enrolled guests actually showed up, how many rewards burned per visit, and how many members sit in each tier. Campaigns are measured the same unflattering way: in visits, not in opens.
Return visits, not open rate
Each reached guest's first visit in the 14 days after delivery is credited to the campaign, carrying the amount of the order behind it.
Open rate is deliberately blank
We have no delivery-provider webhook to source it, so the field stays null instead of carrying a plausible-looking percentage.
A dash instead of a guess
The analytics KPI queries carry no fallback values. A failed read resolves to null, and null renders as an em dash.
Tier movement, plainly stated
Each tier shows its member count and the median time its current members have been with you, a proxy for how quickly the ladder is being climbed, described as one.
Illustrative figures. The window is anchored on when the message reached each guest, not when you pressed send, and only that guest’s first visit inside it is credited, carrying the order behind it. Open rate needs a delivery-provider webhook we do not have, so the field stays empty rather than estimated.
Questions operators ask.
What is a good loyalty program health score?
Habitu colours the Pulse green from 70, amber from 40 and red below that, and the same thresholds apply to each of the five sub-scores. There is no cross-brand benchmark inside it, and no moving baseline either: each dimension is scored against a fixed scale, so the same inputs always produce the same number. The reading that matters is which sub-score is holding the number down. Pulse reports today's level. It is recomputed on every load rather than stored, so there is no trend arrow on it yet.
How often does the dashboard update?
The Pulse and its five sub-scores are computed from live queries every time the home screen loads. The guest signal store underneath it (churn risk, engagement, recency, points to the next reward) is recomputed for every brand nightly at 02:00 UTC, so those fields read as the overnight run left them rather than live to the minute.
Can I see loyalty performance for each location?
Yes. Location Insights ranks every site critical-first and gives each one the single highest-priority signal that is true about it this month, drawn from a fixed set of eight: no visits, visits down, low redemptions, a low earn rate, weak enrolment, top performer, visits up, or simply healthy. Selecting a site shows its visits, revenue, redemption rate and average transaction, plus one sentence on what to do about it.
Do I need an analyst to read it?
No. The output is a score, a colour and a sentence. Where a location is flagged, the flag carries the recommended action and a button that opens the campaign builder with the template matched to that signal already chosen, so the distance between noticing something and doing something about it is one screen.
How do I know whether a campaign actually worked?
Habitu counts visits, not opens. For each guest the message actually reached, it credits the first visit they made in the 14 days after it reached them, counting from their own delivery time rather than the moment you pressed send, and carries the amount of the order behind that visit, summed from real transactions. Open rate is deliberately left blank: it needs a delivery-provider webhook we do not have, and an estimate would be a fabrication.
What happens when a number cannot be calculated?
The screen shows a dash. The KPI queries behind the analytics screen carry no mock fallbacks: a failed read resolves to null, and null renders as an em dash rather than a plausible-looking figure. A fabricated number is worse than a missing one, because you cannot tell it is wrong.
Which channels can Habitu actually send on?
In-app inbox and email are live end-to-end. Push and SMS can be composed and previewed, but dispatch on those two is not live yet. WhatsApp is preview-only. The builder can show you how a message would land as a chat bubble, but it is not a channel you can select or send on. Reach figures come from the send ledger itself rather than an assumed delivery rate, and a send whose delivery cannot be reconstructed from that ledger shows an em dash where the reach figure would be, rather than a number we cannot stand behind.
Does it work with my POS?
Square is live end-to-end, so visits and orders land in the same tables the dashboard reads. The Foodics adapter is post-pilot; Foodics operators run Habitu's own loyalty engine in the meantime, and the dashboard reads that engine either way, so the screens look identical from the operator's side.
Take your programme's pulse.
Thirty minutes on the screens an operator actually opens. Not a slide deck.
Book a demo →