Moonlight Analytica Request demo
Floor intelligence

From cameras to covers-per-hour: turning dwell into a number a GM can use

Guest-only table dwell is a clean number. It still isn't the number a GM checks before a Friday shift. Here's the five-step translation.

Moonlight AnalyticaField notes July 2, 20266 min read

A general manager does not read dwell time. She reads the wait list, the reservation book, and a number in her head for how many parties an hour the dining room can absorb before a Friday rush turns into a line at the host stand. Correcting a camera feed for staff movement, the way Janus does before it reports anything, produces a better measurement: guest-only table dwell, 22% longer than a restaurant's own ticket-close clock had shown. None of that changes a single decision on the floor by itself. A minute figure sitting in a dashboard is an analyst's number. What a GM needs is covers-per-hour, and getting from one number to the other is its own piece of engineering.

A measurement is not a decision

That gap between a measurement and a decision shows up everywhere sensors get bolted onto a business, and on a restaurant floor it runs in the opposite direction from what most dashboards assume. Most reporting tools start with an operational number a manager already trusts, a ticket time or a POS close, and layer analytics on top of it. Janus starts one level lower, at the pixel, and has to climb back up to a number that means something to whoever is deciding how many servers to schedule for Friday's dinner rush.

On the fast-casual floor Janus tracked for a single dinner service, that climb started with 17 distinct presences moving through the dining room and ended with 4 of them correctly flagged as staff, not guests. Once staff time came out, guest table dwell measured 22% longer than the restaurant's ticket-close timestamps had implied. That number is real and verified. It's exactly the kind of thing a data team is proud to ship. On its own, it is not much use to the host standing at the front door telling a party of four how long the wait will be.

17
Presences tracked, one dinner service
4
Correctly separated as staff
+22%
Guest dwell once staff time is removed

Five rungs from pixel to KPI

Getting from a corrected dwell minute to a staffing decision takes two more steps, not one unit conversion. Each rung strips out noise the rung below it could not see, and each one is a place a vendor could quietly stop building and start hand-waving instead.

Pixel to KPI, five rungs
1
Raw camera frames
Every zone re-scored continuously, each detection tagged with a confidence score.
42ms · 94% confidence
2
Zone-tagged presence
Each detected person gets a path, a zone, and a staff-or-guest flag.
17 tracked paths
3
Guest-only dwell
Staff time subtracted. What's left is how long a party actually sat.
+22% vs. ticket clock
4
Turn-time model
Dwell plus the bussing-and-reset gap a table needs before the next party sits.
dwell + buffer
5
Covers-per-hour
Seats × 60 ÷ turn time. The number on the host stand's clipboard.
the KPI
The bottom three rungs are measurement. The top two are a model, and a model is exactly where most computer-vision products stop shipping numbers a floor can act on.

The formula the ladder is climbing toward

The top rung has an actual formula behind it, and it is not exotic: covers per hour equals seats times sixty, divided by turn time in minutes, where turn time is guest dwell plus whatever reset gap a table needs before the next party sits down. Black Box Intelligence's own restaurant benchmarking puts a concrete number on why that denominator matters: cutting one dining room's turn time from 90 minutes to 75 lifted nightly revenue 20%, with nothing else about the room changed. The formula runs the same whether the input comes from a stopwatch or a camera. The camera just makes the input honest.

Feed a naive, ticket-time-based turn assumption into that formula and it produces a covers-per-hour ceiling higher than the room can actually deliver, because the ticket clock is missing the host-stand wait and the minutes a party lingers after the check closes, the same gap the fast-casual floor's data closed at +22%. Swap in guest-only dwell and the ceiling drops to something the floor can actually hit. The chart below runs both versions of the formula across a range of turn times for a 60-seat room.

Covers-per-hour ceiling, 60-seat room
Same formula, two turn-time inputs
Ticket-time assumption Guest-dwell corrected
−18% 30 60 90 120 150 Average total table cycle — dwell + reset (minutes)
IllustrativeModeled from the covers-per-hour formula, seats × 60 ÷ turn time, for a nominal 60-seat room. The 22% dwell correction is the measured gap from Janus's restaurant deployments, not a specific location's live numbers.

At a 90-minute assumed turn, the naive formula says a 60-seat room can move 40 covers an hour. Run the same room through the guest-dwell correction and the honest ceiling is closer to 33, an 18% gap between what a schedule built on ticket time promises and what the floor can actually deliver. That gap is not a rounding error. Staff a Friday off the higher number and the shift runs a server short during the exact hour tables are running long, which is precisely the failure mode the dwell correction exists to catch.

The dwell number was never the point. The point is the covers-per-hour figure two rungs above it, the one a host stand uses to make a promise at 7:15 on a Friday.

What actually changes on the floor

None of this earns its keep if the output is a number a data team checks once a week. A covers-per-hour figure only matters while a host is deciding between a 25-minute quote and a 45-minute one, mid-service, with a line already forming at the door. That number has to arrive live, while the host is still deciding. It can't wait for a report someone reads on Monday. Janus runs its floor model at 42ms latency with a 94% confidence score attached to every reading, so the number a host stand sees has already climbed all five rungs, pixel to zone to guest dwell to turn time to covers-per-hour, before the next party walks in.

42ms
Latency from frame to reported number
94%
Confidence score on every reading

The POS will keep quoting ticket time. It was never built to run the rest of the ladder. The floors that translate their own camera feed into a number a GM actually uses are the ones writing their own Friday staffing plan, instead of borrowing one from a clock that was never watching the whole table.

Janus · Physical-space intelligence

Turn your own floor's dwell into covers-per-hour.

Janus reports guest-only dwell at 42ms latency with a 94% confidence score on every reading, then runs it through the same turn-time model behind this piece, so covers-per-hour updates mid-shift instead of showing up in next week's report.