Freelance Data & AI SolutionsSimulated project · Synthetic data

Restaurant Sales Intelligence Dashboard

Data Analytics · Business Intelligence · AI-Assisted Insights

A demonstration of how roughly three months of point-of-sale (POS) data from an independent restaurant can be cleaned, analysed and turned into an owner-friendly dashboard with clear, evidence-based recommendations.

Simulated portfolio project using synthetic data. This project does not represent a real client engagement. All profitability figures are based on assumed food-cost percentages and are labelled as estimates. Customer metrics apply only where a customer ID was recorded.

Business context

  • The Corner Table is a fictional independent South African restaurant with a diverse menu: tapas and share plates, mains, desserts and beverages.
  • The restaurant collects around three months of POS transaction data, but decisions about menu performance, staffing and promotions are still made largely on intuition.
  • The objective is to show how existing POS data — with all of its real-world imperfections — can be transformed into useful business intelligence.

The challenge

The business has valuable POS data but lacks a simple way to turn that information into actionable decisions. The export is messy: duplicated lines, inconsistent category and item names, mixed date formats, missing prices and missing customer identifiers.

Approach

Cleaned and structured the transactional data, analysed menu performance, demand patterns and customer behaviour, and presented the results through an interactive dashboard with plain-language findings and recommendations.

Interactive dashboard

The Corner Table · 1 June – 29 August 2026

Total revenue

R728 304

Orders

2 271

Average order value

R320,70

Est. gross profit

R472 349

Assumed food costs

Est. gross margin

64.9%

Estimate

Repeat customer rate

66.6%

713 identified customers

Revenue over time

Is trade growing, flat or seasonal?

Orders per week

How does order volume move week to week?

Revenue by menu category

Which parts of the menu carry the business?

Top 10 items by revenue

Which dishes bring in the most money?

Top 10 items by estimated gross profit

Which dishes contribute most to estimated profit?

Volume vs estimated margin

Which popular items earn the least per sale?

Demand by day of week

Which days are busiest and quietest?

Demand by hour

When is the kitchen under pressure?

Day × hour demand heatmap

Where in the week does revenue actually happen?

10111213141516171819202122
Mon
Tue
Wed
Thu
Fri
Sat
Sun

Identified orders

2 003

of 2 271 orders

Returning customers

475

More than one order in period

Orders from returning customers

88.1%

Of identified orders

Average visits (returning)

3.7

Where customer ID available

Customer figures cover only orders where a customer ID was recorded. Profit and margin figures are estimates based on assumed food-cost percentages, not actual recipe costing.

Data preparation

From messy export to usable data

6 092 raw rows were reduced to 5 915 clean order lines across 2 271 orders.

Duplicate detection and removal— show detail

148 exact duplicate order lines were identified and removed (6,092 raw rows → 5,944).

Why it matters: Duplicates inflate revenue and item counts, so every total downstream would be wrong.

Invalid quantities— show detail

29 lines with a quantity of zero were excluded.

Why it matters: Zero-quantity lines are usually voided or mis-keyed orders and distort average order value.

Missing-value handling— show detail

89 missing unit prices were filled from the menu price list; 116 missing payment methods were labelled 'Unrecorded'; 718 lines (12%) had no customer ID and were kept but excluded from customer-level analysis.

Why it matters: Filling from a known price list preserves revenue; labelling rather than deleting keeps the sales record complete; separating unidentified customers keeps the repeat-customer figures honest.

Standardisation of category and menu names— show detail

Variants such as 'Main', 'MAINS' and 'mains', or 'Drinks' and 'Beverage', were mapped to four canonical categories. Item names were trimmed and case-normalised.

Why it matters: Without this, the same product appears as several different products and every ranking is misleading.

Date and time formatting— show detail

A mix of ISO (2026-06-14) and South African (14/06/2026) date formats was parsed to a single date type; hour-of-day and day-of-week were derived.

Why it matters: Demand analysis by day and hour is impossible until dates are consistent.

Revenue, estimated food-cost and estimated gross-profit calculations— show detail

Revenue = quantity × unit price. Estimated food cost applies an assumed cost percentage per item. Estimated gross profit = revenue − estimated food cost.

Why it matters: POS data records sales, not profit. Making the cost assumption explicit keeps profitability figures clearly labelled as estimates.

Customer-level aggregation— show detail

Order lines were grouped into orders, then orders into customers, to derive order value, visit frequency and repeat behaviour.

Why it matters: Owners make decisions about orders and customers, not individual line items.

Executive insights

Five things the data says

01

Five of the 29 menu items generate about a third (32.6%) of estimated gross profit: Corner Table Burger, Peri-Peri Half Chicken, Ribeye, Patatas Bravas and Lamb Shank.

Why it matters: A small group of products is carrying a disproportionate share of the estimated profit. Their visibility and availability matter more than the rest of the menu combined.

Recommended action: Feature these items prominently on the menu and in promotions, and protect their supply and consistency before experimenting elsewhere.

02

Loaded Fries is the best-selling item by quantity (633 units) but has the lowest estimated margin on the menu (44%). Patatas Bravas sells fewer units (492) yet contributes roughly R8,000 more estimated gross profit.

Why it matters: Volume and profit are not the same thing. A popular, low-margin item can occupy kitchen capacity and menu space without earning its keep.

Recommended action: Review the Loaded Fries recipe cost and price point, or pair it with higher-margin items. Confirm with actual ingredient costing before changing the price.

03

Saturday averages about R14,600 in revenue per day compared with about R3,750 on a Monday — almost four times as much. Weekend days average 36 orders versus 21 on weekdays.

Why it matters: Demand is heavily concentrated. Staffing and prep that are flat across the week are likely over-resourced on Mondays and stretched on Saturdays.

Recommended action: Align rosters and prep quantities to the day-of-week pattern, and treat Monday and Tuesday as the natural window for reduced hours or targeted offers.

04

The 15:00–16:59 window accounts for only 6.4% of orders across the period — on Monday to Thursday roughly one order per day — while 18:00–20:59 accounts for 41%.

Why it matters: The afternoon lull is a fixed cost with almost no revenue attached, whereas early evening is where capacity is under the most pressure.

Recommended action: Test a limited afternoon offer (coffee and dessert, early-bird tapas) to lift the quiet window, and make sure the strongest team is on the floor from 18:00.

05

Where a customer ID was recorded (88% of orders), 66.6% of identified customers placed more than one order over the 90 days, and those returning customers account for 88% of identified orders — averaging 3.7 visits each.

Why it matters: The business appears to run on a returning customer base. Losing a regular is far more costly than missing a single walk-in.

Recommended action: Introduce a simple retention mechanism (a loyalty or recognition programme) and improve customer-ID capture so the 12% of unidentified orders shrink and the trend can be tracked reliably.

AI-assisted commentary

Numbers translated into plain English

Weekend dinner demand is substantially higher than weekday lunch demand — Saturday revenue per day is close to four times Monday's. Management could consider aligning staffing levels with this pattern while testing targeted promotions on the quietest days.

Mains generate 43.8% of revenue and 41.6% of estimated gross profit, while beverages contribute 19.9% of revenue but 22.7% of estimated gross profit at a 74% estimated margin. Encouraging a drink with every main is a low-effort way to lift estimated margin per order.

Loaded Fries is popular (the highest unit sales on the menu) but has the lowest estimated margin at 44%. Rather than removing a customer favourite, a small price adjustment or a portion and cost review is the more measured first step — subject to actual recipe costing.

Roughly two thirds of identified customers returned within the period. A recognition or loyalty programme is likely to reward existing behaviour rather than create it, which makes it a low-risk investment — but only if customer IDs are captured consistently.

Each statement above was generated from the computed metrics and then checked against them. The AI layer translates numbers into plain-English commentary; it does not produce the numbers and it is not allowed to introduce facts that are not in the dataset.

What I would do next

Supported by this dataset

  • Menu optimisation

    Keep the five highest estimated-profit items front and centre; review the lowest sellers (Affogato, Milk Tart, Peri-Peri Chicken Livers) for a menu refresh.

  • High-margin product visibility

    Promote high-margin, mid-volume items such as Mushroom Risotto (72% estimated margin) and Patatas Bravas (70%) through menu placement and staff recommendations.

  • Staffing alignment

    Weight rosters toward Friday and Saturday evenings and reduce cover on Monday and Tuesday, where daily revenue is roughly a quarter of Saturday's.

  • Quiet-period promotions

    Run a limited 15:00–17:00 offer on weekdays and measure whether the window moves above its current baseline of about one order per day.

  • Customer retention

    Formalise recognition of returning customers; they already account for the large majority of identified orders.

Would need additional data

  • True profitability

    Replace assumed food-cost percentages with actual recipe and ingredient costing before making pricing or removal decisions.

  • Food-waste reduction

    Combine sales-by-hour data with stock and wastage logs to identify over-prepping in quiet windows. Wastage data is not in the POS export.

  • Staffing costs

    Roster and wage data would allow labour cost to be compared with revenue per hour, turning the demand pattern into a labour-efficiency measure.

  • Future automation

    Once the data feed is stable, the cleaning and dashboard refresh could run automatically from a weekly POS export, with an AI-generated weekly summary emailed to the owner for review.

Technology used

Python (pandas, NumPy)

Synthetic data generation, cleaning, aggregation and statistics

CSV

Raw and cleaned dataset exports

TypeScript / React

Interactive dashboard, filters and calculations in the browser

Recharts

Dashboard charts

AI assistant

Plain-English commentary generated from the computed metrics and checked against them