One set of numbers for every store
When each brand runs its own point-of-sale system, comparing two stores takes an afternoon. Joining them is mostly about definitions, names and timestamps, not charts.

Photo from Unsplash.
Restaurant groups rarely choose to run several point-of-sale systems. It just happens. One brand was bought with its system already in place, another needed a feature the first one didn't have, a third came along later. Each exports its own report, in its own format, with its own idea of what a sale is.
When we built the sales dashboard for a multi-brand group, comparing two stores meant three exports and an afternoon of copying into a spreadsheet. The weekly numbers meeting started from six exports. The goal was one screen. Getting there was mostly not about charts.
Decide what each word means
Every system reports net sales. They don't always mean the same thing. One takes off discounts but leaves in tax. Another counts gift cards as revenue on the day they're sold. A third puts tips in the total. Put those side by side and the stores look different for reasons that have nothing to do with the stores.
So the first job is a short glossary, written down and agreed by whoever runs the numbers meeting. For each measure, say what's in, what's out, and which field in each system it comes from. It's a boring document. It's also the reason anyone will trust the screen later. Here's the kind of thing it should say:
- Net sales: after discounts and comps, before tax and tips. Gift cards count when they're redeemed, not when they're sold.
- Guests: covers where the system records them, checks where it doesn't, and a label saying which.
- Labor: hours and cost from the scheduling or payroll system, matched to the same business day as sales.
- Business day: when it starts and ends, so a late-night store's 1 a.m. sales land on the right date.
Name things once
The second job is names. The same store is “Downtown” in one system, “Store 014” in another and “DT Main St” in the payroll export. Menu items are worse. Without one list of stores, and a mapping from every system's name to it, the join quietly drops rows. Nobody notices until a store's sales look oddly low.
Keep that mapping as data, not code. When a store opens, closes or gets renamed, someone in the office should be able to update it without a developer. And when an export arrives with a name the mapping doesn't know, it should stop and ask rather than guess.
Show how old every number is
Different systems update at different times. One sends sales every few minutes. Another posts the day once, overnight. A third needs someone to run an export by hand. Put them on one screen with no label, and a store that hasn't reported yet looks like a store that had a terrible day.
The sales dashboard puts a freshness badge on each number: how long ago it was updated. It sounds minor. The point is to end the argument about whether the numbers are current, because the screen answers it, store by store.
The same goes for gaps. If a store is missing a day, show a gap, not a zero. A zero is a claim about the store. A gap is an honest statement about the data.
Then make it comparable
Once the definitions, names and timestamps are settled, the screen is the easy part. The sales dashboard shows sales, guests, product mix and labor by store and by brand, and compares any period with the one before. A written weekly summary sits on top for people who won't open the charts. It works in English and Chinese, switchable per person, because the team doesn't all work in one language.
A few rules that hold up:
- Compare like with like: this Tuesday with last Tuesday, not with the weekend.
- Rank stores within a brand before ranking across brands. A coffee counter and a sit-down dining room aren't the same business.
- Keep the raw exports. When a number looks wrong, you'll want to see exactly what the system sent.
- Put the definition one tap away from every number.
Where to start
You can do the hardest part without any software. Write the glossary. Build the store list, with every system's name for each store. Note when each system's data lands.
Then take last week's numbers through it by hand, once, with two people working separately. If they get the same answer, you're ready to automate it. If they don't, you've found the problem before it's on a screen in front of everyone.