No prioritization
~400 KPIs, all treated as equal. That hides the ten things that move decisions. We add an honest value-vs-effort ranking.
The current dashboard answers what happened. The next version answers what happened, why, how confident we are, what to do, and what the AI should remember next time — venue by venue, market by market.
The strategic review you received gets the instincts right — same-weekday benchmarking, calendar-weighting, variance decomposition, venue-specific reading, disciplined AI confidence. Four gaps stop it short of buildable. This document closes them.
~400 KPIs, all treated as equal. That hides the ten things that move decisions. We add an honest value-vs-effort ranking.
It says "import X" repeatedly without fixing how data arrives. Messy exports + free-text notes are the real bottleneck. No feature beats the data contract underneath it.
Weather is daily and cheap. Tourism data is monthly and lagged — context, not a signal. Food-cost, labor, CRM each need infrastructure you don't yet have.
It lists a hypothesis tracker but nothing checks whether a call was right. An AI never told it was wrong never improves. We close the loop.
Fix the data contract → add cheap statistical upgrades (bands + variance bridge + calendar-adjusted forecast) → make the AI a narration layer over deterministic metrics, with memory and an evaluation loop → then selectively layer in weather, calendar, and the SoBo 20 fee engine. Defer the food-cost, labor, CRM, marketing-attribution, and predictive clusters until their data sources exist.
A month is a weighted calendar, not a smooth block. July 2026 opens on a Wednesday and carries five Wednesdays, five Thursdays, and five Fridays. For Dubai venues, where the weekend socially runs Thursday night onward, that is two of the three premium nights landing five times. For SoBo 20 in Mumbai, the Saturday count matters more.
"Premium day" must be defined per market and per venue, not with one generic weekend rule. The same month is a tailwind for a Dubai fire-grill and roughly neutral for a Mumbai hotel restaurant — and the forecast has to say so before anyone reads into the numbers.
These are cheap to build, run on data you already have, and carry the largest interpretive lift. Each replaces a blunt number with a decision.
For every venue × weekday × daypart, compute a robust centre (median) and dispersion over the trailing comparable days. Replace the single expected number with a normal band, and classify each posting by how far outside it falls.
Pure math on existing data. The single highest-ROI change — it stops the dashboard flagging normal variance and stops it burying real problems.
Decompose the gap between expected and actual net into additive drivers that reconcile. The AI then narrates a bridge it did not have to compute.
Turns every "−13%" into a diagnosis. Covers-down vs check-down are opposite problems with opposite fixes — the bridge makes the AI say which one.
Replace target × days_elapsed ÷ days_in_month with the sum of each day's own expected value. Early-month "behind" is often just a weekday-heavy opening, not a problem.
This is the direct answer to how longer and weekend-heavy months move revenue: the month's shape is priced in, so a slow weekday opening no longer triggers a false alarm.
The language model should never compute variance or decide significance — it drifts. Code does the numbers; the model narrates, remembers, and proposes. Then a loop checks whether it was right.
Trust is earned, not assumed. "This model's Inja cancellation calls are right 8 of 10 times" is a sentence you can only write once the loop exists.
Every item placed by decision-impact and build cost. Hover any point for detail. The top-left is where to start: high value, low effort.
If the dashboard currently holds only a few days of data, Sprint 1 is backfill and foundations — not forward features. Baselines need history before anything reads them.
The review's per-venue lists repeated themselves. Here is what actually differs: the one economic question, the primary signal, the main risk, and the lens the AI should load into each summary.
The keystone is one canonical record every view and the AI read from. Expand each spec below.
One object per venue per day. Ingested → enriched → computed → generated, as separate testable stages. Everything downstream reads this, never the raw files.
venue_day { meta: { venue_id, name, city, currency, ownership_model, date, weekday, seats, open_hours, service_periods, filed_at, source_files[], data_quality_flags[] } # ingested sales: { gross, net, covers, apc, by_daypart{}, by_channel{ dine_in, delivery, events }, by_party_size{} } demand: { reservations_booked, walk_ins, waitlist, no_shows, cancellations{ same_day, prior }, forward_book_next_14d_covers } leakage: { total, by_reason{ marketing, vip_comp, staff, platform_funded, recovery, error }, voids, wastage } beverage: { attach_rate, net } guests: { new_vs_repeat, nationality_mix{}, vip_notes[] } menu: { top_sellers[], eighty_sixed[], stockouts[] } service: [ { type, severity, revenue_impact, root_cause, action, follow_up, repeat? } ] # parsed from free-text notes service_pace: { wait_to_seat_min, time_to_first_order_min, ticket_time_min, time_to_check_min, late_arrivals, fast_service_score } # V4 delivery_economics: { orders, aov, commission, packaging, refunds, contribution_margin_per_order, app_rank, cuisine_search_rank, delivery_radius } # V4 context: { weather{}, holidays[], events[], payday_flag, visibility, extreme_heat_alert, exam_season_flag } # enriched benchmark: { expected_net, band_low, band_high, z_score, classification } # computed variance: { vs_expected_net, bridge{ covers, apc, daypart_mix, channel_mix, reservation_no_show, menu_availability, leakage, delivery, external_context, residual } } # computed ai: { facts, interpretation, context, actions[], confidence, hypotheses[] } # generated }
Robust to outliers (median + MAD, not mean + SD), with a small-sample fallback hierarchy so new venues don't produce nonsense.
for each (venue, weekday, daypart): samples = trailing comparable days # target 8–12, min 6 center = median(samples) sigma = 1.4826 × MAD(samples) # robust std-dev band = [center − 1.5σ, center + 1.5σ] z = (actual − center) / sigma class = |z|<1 Normal | 1–2 Watch | >2 Alert (+ direction) if len(samples) < 6: low_confidence = true; widen band fallback: venue same-weekday → venue any-day scaled → analog venue → manual target
Per-day expected value, summed. Factors begin neutral and are learned from history — presented as estimates with priors, never asserted as truth.
Expected_day(d) = weekday_daypart_baseline(d)
× month_seasonality_factor
× holiday_factor(d) × event_factor(d)
× weather_factor(d) # only if forecast exists
× forward_book_adjustment(d) # reservation-led venues
Forecast_month_end = Σ actual(elapsed) + Σ expected(remaining)
Pace = Σ actual(elapsed) / Σ expected(elapsed)
# Calendar Quality Score counts MARKET-CORRECT premium days:
# Dubai → Thu/Fri/Sat · Mumbai → Fri/Sat + social calendar
Venue gross is nearly a vanity metric for a managed asset. Encode the contract and show two distinct lenses so a "−71%" venue day isn't misread as an owned-venue emergency.
# Encode the actual agreement, e.g.: atelier_fee = base_fixed + pct_of_gross × venue_gross + incentive_rate × max(0, GOP − threshold) # Dashboard shows both: OPERATING CONCERN → venue health (client relationship, reputation) ECONOMIC EXPOSURE → Atelier fee income (what hits AHH's P&L) # A soft sales day may be near-neutral to Atelier if the fee is # largely fixed. Track PR / celebrity value as a SEPARATE signal.
Free-text manager notes are your biggest source of mush — and a perfect bounded extraction task for an LLM (note in, typed fields out). Reconcile everything and surface trust, not just a "6/6 filed" count.
NORMALISE each venue export → sales/demand/leakage block EXTRACT manager note → structured service[] records (LLM) RECONCILE sales vs service report · covers vs res+walk-ins · currency sanity · duplicate upload · nulls EMIT data_quality_flags[] → Data-Trust page: who filed · who's late · what didn't reconcile · estimated vs final · which source produced each metric
Everything else the review surfaced, organised and tagged by what it depends on. These are future outputs, not omissions — each one is gated on a data source coming online. Filter by type.
Nothing else starts cleanly until this one record exists and every source maps to it.
Recover as many clean same-weekday samples per venue as possible — baselines need ≥6, ideally 8–12.
Normal / Watch / Alert. The fastest visible gain in credibility the dashboard can make.
Facts / Interpretation / Context / Actions / Confidence. Nearly free, and it kills false confidence immediately.
Grow the "6/6 filed" seed into reconciliation, late-feed and estimated-vs-final flags.
So ownership stops reading a managed venue like an owned one, starting today.
The cockpit is only as sharp as what it's fed. This is the supply chain behind it — who reports each number, at what cadence, to what quality bar, and what to refuse to collect until it can be trusted.
The first draft named the data. This version makes it dependable: a confidence tier on every field, a source-of-truth order so two teams never contradict each other, a freshness bar, and a request loop the AI can pull when something it needs is missing.
Every field is measured, derived, declared, or estimated. Only the first two are ever allowed to raise an alert.
When two teams report the same fact, a fixed precedence decides which wins — no silent contradictions in the record.
Each lane has a filing deadline. A late or missing feed shows as low trust, never as a real change in the business.
When the AI needs a field it doesn't have, it raises a data request back to the owning team instead of guessing.
Collect a field only if a named owner can report it the same way every period and its movement changes a decision. Everything else is a rumour with a number attached — and estimated data is worse than none, because the model will build a story on it.
A number counted at the till and a number a manager guessed after service are not the same kind of fact, and must never be treated as one. The tier a field carries decides whether it may move a forecast or trip an alert.
Covers, net sales, labour hours, cancellations. The ground truth.
APC, prime-cost %, z-score, RevPASH. Only as sound as its inputs.
Seats, ownership model, venue location, tourist reliance.
Guest origin from a hunch, "felt busy", mood reads.
Staff-estimated guest demographics are the classic error: generalized, unrepeatable, and worse than silence, because the model will narrate on them. Capture origin only where it is structural — a reservation's country code, a hotel-guest flag, a loyalty profile — mark it low-confidence, and never let it raise a flag. Otherwise, leave it out.
The mistake is forcing everything onto the daily dashboard. Inputs split cleanly into two cadences with two jobs — and keeping them apart is what stops the dashboard lying about a venue because finance hasn't closed the month.
Each lane carries a filing deadline — Lane A by late morning after service, Lane B by the second working day after period close. Miss it and the trust layer marks the value estimated / stale, so a missing feed never masquerades as a real change.
Eight functions, each with a bounded reporting job. Value and effort are on the cockpit's 1–5 scale; the lane and cadence tell you which pipeline it belongs to and how often it lands.
External and platform data should not all be treated equally. Weather and bookings can alter daily operating expectation; tourism is a slow prior; marketing attribution needs a source pipeline and holdout discipline before it becomes decision-grade.
Measured system feeds can move baselines. Slow public data modifies context. Manually estimated context only explains uncertainty. This prevents a tourism headline, a social impression, or a late aggregator report from triggering false daily alerts.
Today a comp is one undifferentiated figure buried in leakage — hiding both an operational loss to fix and a marketing investment to measure. The data already exists; someone comped the table on purpose. It just needs an owner and a code. This is the first thing I'd request.
It is nearly free — the information already exists — and it directly upgrades the leakage reason-codes (A5) while seeding the Marketing view. Highest leverage per unit of effort in the whole data programme.
Covers show up in the POS, in the reservation system, and in the GM's report — and they won't always match. Rather than average them or let the last upload win, fix a golden-record order per field. Disagreements then become a data-quality flag, not a silent error.
Every value in the record carries its source, its confidence tier, and a reconciliation status. The trust layer (F3) can always show what is measured, what is estimated, and what two feeds disagree on — so no one debates whose number is right in the morning meeting.
Minimum-viable field sets — start smaller, not larger; a team fills five fields forever and abandons twenty in a week. Each maps to a path in the daily fact record. Amounts always carry the venue's own currency and are never summed across markets. Expand any template for its schema.
Ask each team for a handful of fields, not a data project. The first phase needs no new systems and immediately sharpens the bands, the variance bridge, and RevPASH.
New Operations Economics and Marketing views (weekly, clearly cadence-labelled); finance and marketing figures injected as context into the daily narrative; and the static profile becomes the venue personality the AI loads before reading any day. Nothing here is new architecture — it is the same fact record, filled from more owners.
SevenRooms / OpenTable / Zomato / none — decides whether the reservation template is an export or a manual form.
Does it break out item-level sales and daypart revenue? Decides menu engineering, dayparts, and RevPASH.
Any recipe-costing or inventory software? Decides theoretical food cost and true item margin.
Does finance close weekly or monthly? Weekly makes Lane B dramatically more useful.
This view is the bridge between raw restaurant reporting and intelligent action. It ranks the highest-quality data, explains what each metric proves or does not prove, shows how calendar shape changes expected revenue, and gives AI agents a repeatable summary contract.
Restaurant data has a hierarchy. A POS cover count, a reservation cancellation, and a manager's impression of guest mood should not carry the same weight. This view makes those distinctions explicit so the dashboard can be trusted by operators, owners, and AI agents.
Measured and reconciled fields drive alerts. Estimated or qualitative fields add context but cannot trigger panic.
Every metric should answer a management question: demand, check quality, conversion, leakage, execution, or external drag.
A number that does not change staffing, reservations, marketing, menu, service, or ownership decisions belongs below the fold.
The AI should write what it learned, test whether it was right, and retire weak hypotheses instead of accumulating noise.
Measured, derived, declared, or estimated. The confidence tier determines how much the value can influence the summary.
Was the variance covers, APC, mix, leakage, reservations, menu availability, service, calendar, weather, or city context?
Route the insight to the correct owner: GM, reservations, kitchen, marketing, finance, ownership, or the data-quality owner.
Save the interpretation, confidence, missing fields, action, and hypothesis so tomorrow's summary can improve.
These are ranked by reliability, explanatory power, actionability, and strategic value. The top rows are not always the most exciting, but they are the hardest to argue with and the most useful for daily decisions.
A restaurant dashboard should never stop at the number. Each metric should say what it tells us, what it does not prove, and what action it should trigger. Filter the dictionary by decision area.
Month-to-date is useful, but restaurants are not linear. The cockpit should help management move between operating exceptions, weekly patterns, calendar-adjusted ownership reads, and forward revenue risk.
Do not judge a month by simple days-elapsed pace. Judge it by the expected value of each elapsed and remaining trading day, adjusted for venue, market, premium nights, holidays, events, weather, tourism, mobility, and reservation book.
expected_day_revenue = same_weekday_daypart_baseline
× market_premium_day_factor
× holiday_or_long_weekend_factor
× weather_and_mobility_factor
× event_and_tourism_factor
× forward_reservation_book_factor
× venue_specific_modifier
calendar_adjusted_MTD = Σ expected value of elapsed days
forecast_month_end = Σ actual elapsed + Σ expected remaining
Never read AED and INR as one operating total.
Never treat a managed venue's gross sales as Atelier's economic exposure.
The global metric dictionary is not enough. Each venue needs its own signal map, trigger logic, data requirements, and AI interpretation rule. This closes the largest coverage gap: metrics existed globally, but not mapped deeply enough to each restaurant.
For Mohalla Cloud and Mohalla d3, gross delivery revenue can hide weak contribution after commissions, packaging, refunds, prep-time failures, and ranking loss. The cockpit should read delivery as a funnel and a unit-economics waterfall.
Do not celebrate delivery sales until true contribution is known. Orders, AOV, app visibility, prep reliability, refunds, packaging and platform commission should sit beside revenue for every delivery-led brand.
Speed is not about rushing luxury service. It is about knowing whether the guest was seated, greeted, ordered, served, and closed at the right pace for the venue and occasion. This is especially important for Tezukuri's busy downtown guests and for RevPASH-driven capacity management.
When sales miss, service pace helps distinguish weak demand from slow throughput. A full room with slow checks and poor table resets is a capacity problem; empty tables with clean service pace is a demand problem.
The existing canonical record is strong. These additions make the variance bridge more complete and give delivery, service pace, local demand, and managed-venue compliance a place to live.
Named sources prevent vague integration requests. They also force the cockpit to distinguish daily operating signals from slow macro context and experimental attribution feeds.
This is the next-generation opportunity map: not more tiles, but a sequence of domains that move from descriptive reporting toward prescriptive and eventually human-supervised autonomous decisions.
What happened: sales, covers, APC, leakage, bookings.
Why it happened: bridge, context, service, menu and reservation drivers.
What is likely: forward book, demand, prep, labour, cancellation risk.
What to do: reconfirm, staff, prep, market, price, fix, follow up.
Low-risk routines executed with human supervision and scored hit-rate.
Not every restaurant needs every frontier at once. Sequence investment by the economic question each brand lives or dies on.
More data can make the cockpit worse when the source is weak, the cadence is wrong, or the metric encourages false confidence. These items should be gated, not placed on the daily dashboard.
The AI should narrate deterministic metrics, not invent them. It should separate fact, interpretation, context, action, confidence, missing data, and memory. It should also track whether yesterday's explanation was later confirmed.
Facts: - net sales, covers, APC, channel/daypart mix, leakage, classification Interpretation: - primary driver: covers / APC / mix / leakage / reservation / menu / service / context Context: - weekday, calendar shape, weather, holiday/event, booking book, venue lens Actions: - 1 to 3 owner-routed actions with urgency Confidence: - high / medium / low, with missing data named Memory write: - what was learned, what hypothesis changed, what should be checked next time
daily_memory = {
venue_id,
date,
classification,
primary_variance_driver,
calendar_context,
external_context,
service_or_menu_notes,
actions_recommended,
missing_data,
confidence,
hypotheses_created_or_updated,
next_check_date
}
This is the long-form backlog of broad, micro, macro, and governance ideas. Keep it visible, but gate each item on whether the underlying data source exists and whether the metric would change a real decision.