AURA

Sales per Labour Hour: The Staffing Reality Check

A shift can close exactly on its sales-per-hour target and still have a quarter of its hours standing in the wrong place. This page gives the arithmetic, the hour-by-hour cut that finds those hours, and the reason it prints no target figure of its own.

Published
25 min read4904 words
Aura editorialAuthor

Key takeaways

  • Sales per labour hour is net sales divided by timesheet hours, in PLN per hour of work — hours, not headcount, and the timesheet, not the roster.
  • The shift average is where staffing errors hide: in the worked example on this page, a Friday that closed exactly on target still had 23 of its 92 hours sitting in the wrong clock hour.
  • The indicator is blind to wage rates but not to menu prices; covers per labour hour is the one that survives a reprice unmoved.
  • No target figure is printed here. The ranges in circulation carry a currency symbol and no traceable publisher, and the number is not comparable across service formats, currencies or years in any case.
  • Divide forecast sales by your own target and the answer comes out in hours — which is the unit a roster is written in, and how the indicator becomes a decision.
  • Eurostat shows Poland ahead of the EU average per person employed and level with it per employee-hour: the plainest demonstration that headcount is not hours.

Sales per labour hour is net sales divided by the hours people actually worked in the same period. It tells a restaurant owner whether a shift was staffed to the demand it actually had. Unlike a labour cost percentage it is not moved by wage changes, though it is still moved by menu prices.

What one hour of work brings in, and why a cost percentage cannot answer it

Sales per labour hour (SPLH) — net sales divided by the hours actually worked over the same period, expressed in PLN per hour.

Labour hours — hours people were genuinely on the floor or in the kitchen, taken from the timesheet rather than from the roster, with paid leave and training left out.

Overstaffing — scheduled hours materially above what the measured demand of that shift required.

An owner looking at a payroll line and an owner looking at a roster are asking two different things. The payroll line asks what an hour of work costs. The roster asks whether that hour needed to exist. Those questions have different answers, they move for different reasons, and treating them as one is how a restaurant ends up cutting a rate when the real problem was a person standing at an empty pass at four in the afternoon.

This page holds the second question only. What a fully loaded hour costs you — gross pay, employer contributions, benefits, agency invoices and the rest of it — is worked out in full on restaurant labor cost percentage, and everything below takes that figure as given rather than recomputing it. When the arithmetic here needs a price for an hour, it reaches for your number from that page and does not build its own.

The advantage of counting hours instead of money is that hours do not inflate. Raise every wage in the building by a tenth and your labour cost percentage jumps while the staffing decision that produced the shift stays exactly as good or as bad as it was. Count the hours and that noise disappears.

One thing this page will not hand you is a target figure. Ranges for "good" sales per labour hour circulate with a currency symbol, no year and no traceable publisher — why none of our pages prints an inherited benchmark is set out on restaurant prime cost — and money per hour additionally carries your currency, your year, your average check and your service format, so a quick-service counter and a tasting-menu room can both be staffed perfectly and still read a multiple apart. What this page builds instead is a base made out of your own trading history, by weekday and by hour.

The arithmetic and the units it has to land in

SPLH = Net sales ÷ Labour hours

  • Net sales — revenue for the period excluding VAT, discounts and comped bills, in PLN;
  • Labour hours — the hours all roles actually worked in that same period, from the timesheet, in hours;
  • SPLH — the result, in PLN per hour.

Money on top, hours underneath, so the answer is money per hour. That sounds obvious until you meet the denominator that gets substituted for it by accident.

Take a Friday. Net sales for the trading day come to 18 400 PLN and the timesheet for that day totals 92 hours across kitchen, floor and bar. 18 400 ÷ 92 = 200 PLN per labour hour. Every number on this page is built on that one Friday, so it is worth writing down.

⚠️ Labour hours are not seat hours. Seats multiplied by opening hours produces seat hours, which measure the capacity of a room, not the effort of the people in it. A fifty-seat restaurant open eleven hours has 550 seat hours no matter whether eight people or eighteen are working. Divide the same sales by them and 18 400 ÷ 550 = 33.45 PLN, which is a statement about the room rather than about the roster. Divide sales by seat hours and you have measured the room; divide by labour hours and you have measured the roster. The two denominators differ by a factor that changes every shift, so a figure computed on one is meaningless against a target set on the other.

⚠️ SPLH moves in per cent, not in percentage points. It is money per hour, so a change from 200 to 216 PLN per hour is a rise of 8 per cent. A labour cost percentage, by contrast, moves in percentage points — thirty per cent falling to twenty-eight is a drop of two percentage points, which is a relative improvement of 6.7 per cent, not of two per cent. Owners routinely report one in the language of the other, and the two are not interchangeable: read "labour dropped two per cent" as two points and you have overstated the change by more than threefold.

Three neighbours, and the division of labour between them

SPLH has two close relatives, and each is blind to something the others see.

Covers per labour hour = Covers ÷ Labour hours

  • Covers — guests actually served over the period, counted as people, not as bills;
  • Labour hours — as above, in hours;
  • the result is guests per hour of work.

This one is immune to both wage changes and menu prices, which makes it the honest yardstick when either has moved. Our Friday served 460 guests on 92 hours: 460 ÷ 92 = 5.0 guests per labour hour.

Now raise every menu price by eight per cent and change nothing else. The same 460 guests on the same 92 hours now spend 19 872 PLN, so SPLH reads 19 872 ÷ 92 = 216 PLN per hour — up eight per cent — while covers per labour hour sits unmoved at 5.0. The kitchen did not get faster, the roster did not get smarter, and yet one of the two indicators applauded. That is precisely the distortion covers per labour hour exists to strip out.

The third relative belongs to another page, so it is quoted here rather than redefined: labour cost per cover — total labour cost divided by the number of covers for the same period (restaurant labor cost percentage). Two of our pages defining the same term in two ways would give one restaurant two answers, which is worse than not writing about it at all.

IndicatorFormulaMoves withDoes not move withReach for it when
Sales per labour hourNet sales ÷ Labour hoursmenu prices, demand, roster sizewage rates, contribution ratesjudging whether a shift was staffed to its demand
Covers per labour hourCovers ÷ Labour hoursdemand, roster size, service speedwage rates, menu pricesprices or wages have changed and you need a clean comparison
Labour cost per coverTotal labour cost ÷ Coverswage rates, roster size, demandmenu pricesjudging what serving one guest costs you

Read across the row rather than down the column. If SPLH improved and covers per labour hour did not, you repriced. If both improved, you genuinely served more people with fewer hours. If SPLH improved while cost per cover also rose, something in the wage structure moved and belongs on the other page.

Poland and the EU-27 turn over almost the same money per employee-hour — and neither figure is your target

Official data on hours does exist, and it is worth looking at once — mostly to see why it cannot be your target.

Eurostat's Enterprises by detailed NACE Rev. 2 activity (sbs_ovw_act, updated 10.03.2026, reference year 2023) publishes, for NACE I56 — food and beverage service activities — both a turnover figure and an hours figure for Poland: net turnover 16 130.99 million euro and 287 451 033 hours worked by employees. Divide one by the other and the Polish sector produced 56.12 euro of turnover per employee-hour in 2023 (Eurostat, sbs_ovw_act, updated 10.03.2026). The same two fields for the EU-27 (511 080.61 million euro over 9 316 530 809 hours) give 54.86 euro — barely a euro apart.

Now do it per head instead of per hour, using Eurostat's own published indicator from the same table: turnover per person employed was 67.05 thousand euro in Poland against 59.27 thousand euro in the EU-27 (Eurostat, sbs_ovw_act, updated 10.03.2026). Per person, Poland looks thirteen per cent ahead of the European average. Per hour, the gap all but vanishes.

That inversion is the whole argument of this page in one line. Headcount is not hours. The Polish sector reaches a similar figure per hour while looking far ahead per person, because the hours behind each Polish head are different in number. Any indicator built on people rather than on hours will tell you a story that changes when the roster changes and nothing else does.

Three warnings belong beside those numbers, and they are the reason none of them is a target.

  • The hours counted are employees' hours only. In the same Eurostat table, employees are 79.36 per cent of persons employed in the Polish sector (Eurostat, sbs_ovw_act, updated 10.03.2026) — so roughly a fifth of the people working in Polish food service are owners and family whose hours appear in no payroll record at all. The true denominator is larger than the published one, and the true figure per hour therefore lower.
  • The Polish revenue you are most likely to reach for includes VAT. Statistics Poland (GUS), in Rynek wewnetrzny w 2024 r. (published 03.11.2025), defines revenue from catering activity as revenue including VAT in the definition itself, and puts the 2024 total at 85.2 billion PLN (GUS, Rynek wewnetrzny w 2024 r., published 03.11.2025), up 11.1 per cent in current prices and 2.8 per cent in constant prices. That 85.2 billion is every operator in the country; the same publication carries a second, smaller figure — 52.7 billion PLN for enterprises with more than nine people employed, which GUS itself puts at 61.8 per cent of total catering revenue — so whichever number you quote, say which set it counts. VAT never was your money. Put it on top of the fraction and every SPLH you compute is inflated by exactly the proportion VAT adds to a bill.
  • What an hour costs is a different page's arithmetic. For scale only: hourly labour cost in NACE section I was 11.5 euro in Poland in 2024 and 12.7 in 2025 (Eurostat, lc_lci_lev, updated 23.04.2026), and section I bundles accommodation together with food service, so hotels sit inside that average. What your own hour costs, and what belongs inside it, is worked out on restaurant labor cost percentage — this page only ever multiplies by it.

Two more Polish figures set the scene for how small the unit of decision is here. GUS estimates 101.5 thousand catering establishments in Poland in 2024, up 8.8 per cent on 2023, and reports that establishments belonging to firms with more than nine people employed number 22 666 — 22.3 per cent of the total. Average employment in section I grew by 3.2 per cent in 2024, the fastest rise among service activities (GUS, Rynek wewnetrzny w 2024 r., published 03.11.2025). Most Polish restaurants, in other words, are small and getting more numerous, and in a small operation a single scheduled hour is a large share of the shift.

One Friday, hour by hour: the shift average that hides everything

Back to the Friday — and it is a worked illustration rather than a case study: the figures are chosen round so that the arithmetic stays readable, and what matters is the shape they make, not the values themselves. The shift closed at exactly 200 PLN per labour hour. Now open the same day by the clock, with the roster as it was actually worked — eight people through the evening, four on the late hour.

HourNet sales, PLNHours workedSPLH, PLN/hTarget hours at 200 PLN/hGap, h
12:00–13:00600875.03.0+5.0
13:00–14:001 1008137.55.5+2.5
14:00–15:00700887.53.5+4.5
15:00–16:00500862.52.5+5.5
16:00–17:00700887.53.5+4.5
17:00–18:001 4008175.07.0+1.0
18:00–19:002 4008300.012.0−4.0
19:00–20:003 2008400.016.0−8.0
20:00–21:003 0008375.015.0−7.0
21:00–22:002 4008300.012.0−4.0
22:00–23:001 6008200.08.00.0
23:00–24:008004200.04.00.0
Shift18 40092200.092.00.0

Every number in that illustration belongs to the same Friday that read a clean 200 PLN per hour. Hour by hour it runs from 62.5 to 400 PLN per hour: 400 ÷ 62.5 = 6.4, so the best hour of the shift is 6.4 times the worst one. Your own Friday will produce different values. It will not produce a flat line.

The total that lies by being right

Add the gap column and it comes to zero. That is not a coincidence and it is not good news: the target hours were derived from the same day's sales at the same day's average, so the two totals were always going to match. The shift bought exactly the right quantity of labour. It simply put it in the wrong hours.

Count the halves separately. The positive gaps sum to 23 hours of surplus and the negative gaps to 23 hours of shortage, out of 92 worked — a quarter of the shift's hours were in the wrong place, and the shift-level indicator could not see it, because the shift-level indicator is an average and averages are built to hide exactly this.

⚠️ Do not add the two halves together. The absolute values sum to 46, but that counts every misplaced hour twice — once where it was and once where it was needed. The number of hours to move is 23.

What the flat line actually costs

The surplus half converts to money the moment you multiply it by your own fully loaded hourly cost from the labour cost page.

Cost of the surplus = Surplus hours × Fully loaded hourly cost

  • Surplus hours — the positive gaps only, summed across the shift, in hours;
  • Fully loaded hourly cost — your figure from restaurant labor cost percentage, in PLN per hour;
  • the result is PLN for that shift.

Put a round 40 PLN an hour into it — a number chosen to make the arithmetic legible, not a benchmark — and 23 × 40 = 920 PLN went out of that single Friday's dead middle. Use your own figure, and remember that the shortage half does not simply cancel it: understaffed hours cost you differently, and worse, as the section below sets out.

Turning a target back into a roster

The whole point of a target expressed in PLN per hour is that it converts back into people.

Target hours = Forecast sales ÷ Target SPLH

  • Forecast sales — expected net sales for the slot you are staffing, in PLN;
  • Target SPLH — the figure you built from your own history, in PLN per hour;
  • Target hours — the hours to schedule for that slot, in hours.

PLN divided by PLN per hour leaves hours, which is what a roster is written in. For the 19:00 slot on our Friday: 3 200 ÷ 200 = 16 hours. For the whole day: 18 400 ÷ 200 = 92 hours.

Staffing gap = Scheduled hours − Target hours

  • Scheduled hours — hours written into the roster for that slot, in hours;
  • Target hours — from the formula above, in hours;
  • a positive gap is surplus, a negative gap is shortage, both in hours.

Two cautions before you run this on your own data.

The first is that everything upstream of it is a forecast, and a forecast built badly puts people in the wrong hour with perfect arithmetic. How to build one, and how to measure whether yours is any good, is a subject of its own: see restaurant demand forecasting and the practical side in forecasting. No-shows deserve a particular mention, because they hit the forecast precisely at the peak hour where a staffing error is most expensive — the mechanics are in the no-show confirmation chain.

The second is a known weakness of the gap formula, and it is fairer to state it than to leave you to find it. Target hours are compared against the roster, while SPLH itself is computed on the timesheet. Where overtime is systematic rather than occasional, the roster understates the hours that will actually be worked, and the gap comes out smaller than reality. If your timesheet routinely beats your roster, compare both to the timesheet and treat the roster as an intention.

Turning that comparison into an actual weekly schedule is ordinary operational work rather than analysis — team scheduling and task management are where the hours stop being a calculation and become a rota someone can see.

Overstaffing leaves a quiet trail

Surplus hours never announce themselves. Nobody complains, nothing breaks, and the money leaves anyway. These are the marks it does leave.

Sign of surplusWhere it shows in your dataWhy it goes unnoticedHow to confirm it
A long flat stretch of low SPLH mid-afternoonhourly SPLH, weekday cutthe shift total still lands on targetcompare the same weekday across several weeks; a one-off is weather, a pattern is the roster
Clock-ins bunched at shift start regardless of demandtimesheet start times against the demand curveit looks like disciplinecheck whether start times differ at all between a Monday and a Friday
Side work expanding to fill the hourstask completion timestamps clustering in dead hoursthe work genuinely got doneask what would not have been done if the hour had not existed
Labour cost percentage stable while covers fallmonthly labour percentage against coversthe percentage is behavinghours followed the roster, not the room
Overtime absent but productivity per hour fallingtimesheet totals steady, covers per labour hour drifting downnothing breaches a limitthe roster is right by habit rather than by measurement

The reason surplus survives so long is that it is comfortable. A fully staffed dead hour looks like a well-run restaurant to everyone standing in it.

Understaffing is dearer and arrives later

Shortage does not show up in the labour line at all — it shows up in the sales line, weeks afterwards, disguised as demand that simply did not turn up.

Sign of shortageWhere it shows in your dataWhy it is found lateHow to confirm it
Peak-hour SPLH stops climbinghourly SPLH at the busiest slot, quiet day against busy daya ceiling reads as a plateau, and a plateau reads as stabilityif the 19:00 hour gives the same figure on a slow Tuesday and a full Friday, the ceiling is the roster, not demand
Average check falls in the busiest hourhourly average check against hourly coversit looks like guest behaviour rather than staffingnobody had time to offer a second round or a dessert; check the item count per bill by hour
Tables sit uncleared while a queue waitsseating times against table-free timescapacity looks fine, because the room does have itcount how long a table stays dirty at peak against off-peak
The complaint mix shifts from food to waitingreviews and complaints by dateit arrives as a reputation problem, not a labour onereviews stop mentioning the kitchen and start mentioning time
Calls go unanswered during servicecall log against the demand curvethe loss never enters any report you ownmatch unanswered calls to clock hours and compare with the gap column

The last of those has arithmetic of its own: what an unanswered phone actually costs is worked out in what a missed call costs, and enquiries about events fail by the same mechanism, as the event enquiry queue sets out.

The asymmetry matters when you act on the gap column. A surplus hour costs you its own price and nothing more. A shortage hour costs you the margin on everything that did not get sold in it, plus a share of the guests who will not come back — and that second part never appears in any labour report.

Where the metric misleads: roles, prep hours and the hours nobody clocks

One number for the whole shift, or one per role?

Whole-shift SPLH answers whether the shift was staffed correctly. Per-role SPLH answers almost nothing on its own, because roles do not share a denominator with the sales they enable. Kitchen hours produce no sales without floor hours, and dividing the same revenue by each role's hours in turn simply produces three numbers that add up to nothing.

The useful cut is not by role but by hour, within a role. A kitchen that has three people on at 15:00 and three at 19:30 is misstaffed in one of those hours regardless of what the floor is doing.

Prep, delivery and close

Hours worked before service and after it produce no sales in their own clock hour and will drag any hourly reading toward zero. Choose one treatment and hold it: either exclude non-trading hours from the hourly view entirely and keep them in the shift total, or spread them across the trading hours they support. Both are defensible. Switching between them mid-year is not, because it makes your own history unreadable, and your own history is the only benchmark on offer here.

The hours nobody clocks

The Eurostat share above puts a figure on this: roughly a fifth of the people working in Polish food service are not employees. An owner who works the pass on Friday and does the ordering on Sunday is contributing real hours to the denominator, and if those hours are missing your SPLH is flattering by exactly the amount of work you did for free. Put them in the timesheet at a nominal rate or at none, but put them in.

Comparing weeks, seasons and sites without fooling yourself

Comparing one restaurant's Friday to another's is close to meaningless until three things are equalised: the average check, the service format and the share of orders that never occupied a table. A delivery-heavy site produces sales with fewer floor hours by construction, which flatters its SPLH while telling you nothing about the quality of its rostering. Where the money actually lands on those orders is unpacked in what stays with you on online orders.

Across a group, the comparison worth running is not site against site but each site against its own demand curve. Two locations can differ by a factor of two in SPLH and both be perfectly staffed; the same two can match exactly and both be wrong. Assembling that view for several locations at once is described in running a chain from one screen.

Seasons need the same discipline. A terrace changes the denominator and the numerator at once, and comparing July to February teaches you about weather rather than about rostering.

Building your own base from your own past shifts

There is no external number to aim at, so build an internal one. Four steps, and none of them needs a new system.

  1. Take closed weeks, not memorable ones. Pull the last several complete weeks whose sales are final and whose timesheets are closed. Weeks with a public holiday, a closed terrace or a broken cooker go in a separate pile.
  2. Cut by weekday and by hour, never by month. A month has no staffing meaning. A Friday at 19:00 has one, and it is the same decision every week.
  3. Take the range your own good shifts produced. For each weekday-hour cell, look at what you achieved on the shifts where service felt right and nothing broke. That range is your target band for that cell — not one number for the restaurant, a small grid.
  4. Write down what happened next to each cell. A price change, a new supplier, a staff change, a heatwave. Without the annotations you will read events as performance.

From then on the question stops being "is my number normal" and becomes "which hour drifted, and what changed in it". Assembling the same cut every week rather than rebuilding it by hand is what analytics and dashboards are for, and the numbers an owner actually looks at covers which of them survive contact with a working week. What else a restaurant can hand to a system, and what stays manual, is set out in restaurant automation.

Putting this figure on a live shift screen — thresholds, refresh, who gets told — is its own subject and belongs to the restaurant KPI tree.

Questions owners ask about sales per labour hour

What is sales per labour hour?

It is net sales divided by the hours actually worked over the same period, giving a figure in PLN per hour of work. Net sales means revenue with VAT, discounts and comped bills already taken out; hours mean timesheet hours across every role that worked, not roster hours and not hours paid for leave or training.

Why is there no universal "good" SPLH, and how do I build my own target?

Because the figure carries your currency, your year, your average check and your service format, a number from someone else's restaurant is not comparable with yours even when both restaurants are well run. Build your own by recomputing several closed weeks on identical definitions, cutting them by weekday and hour, and taking the range your own untroubled shifts produced in each cell.

How is SPLH different from labour cost percentage?

They answer different questions. Labour cost percentage answers what your people cost relative to what you sold, and it moves whenever wage or contribution rates move. SPLH answers whether the hours you scheduled matched the demand you had, and rate changes do not touch it. The cost side is worked out in full on the labour cost page and is not recomputed here.

How do I detect overstaffing from data?

Cut SPLH by clock hour rather than by shift and look for long flat stretches at a low figure, especially mid-afternoon and immediately after opening. Then check whether your clock-in times differ at all between a slow weekday and a busy one; if they do not, the roster is running on habit rather than on measured demand.

What are the signs of understaffing in a restaurant?

Peak-hour SPLH that stops rising however busy the room gets, average check falling precisely in the busiest hour, tables left uncleared while a queue waits, complaints shifting from the food to the waiting, and calls going unanswered during service. Shortage hides in the sales line rather than the labour line, which is why it is found late.

Should SPLH be measured per role or for the whole shift?

For the whole shift when you are judging whether the shift was staffed correctly, because roles do not each own a share of the revenue they jointly produce. Within a role, the useful cut is by hour: the same three cooks can be exactly right at 19:30 and clearly surplus at 15:00.

How do I turn a target SPLH into a shift roster?

Divide forecast sales for each slot by your target figure for that slot, which leaves hours, and compare the result with the hours you had planned to schedule. A positive difference is surplus, a negative one is shortage, and both are expressed in hours you can actually move between slots.

Take one recent Friday, cut it by clock hour, and see how many of its hours were standing in the wrong place. Then do the same with the Friday before it, and the one before that: the comparison base this page keeps pointing at is already sitting in your own closed weeks, waiting to be recomputed on one consistent definition. For the wider picture that this single indicator sits inside, start from restaurant management.

Related services

In this section

Let us look at your numbers

Tell us how enquiries are handled today — how many there are, who picks them up, where they get lost. Aura walks the process with you and shows what can be taken off a person, and what is better left alone.

Talk to Aura

The home page with Aura opens. Give a company name — she looks at it in public data and shows what a client sees. No promises of a result.

Prefer to write? marketing@auraglobal-merchants.com

Next step

Let us check whether Aura fits your place

We do not take everyone: first we look at your processes, sales and current systems and tell you honestly whether it makes sense for us to come in. A few questions, about five minutes.

Take the assessment →