PopUp Bagels

Labor Management Portal

📅 Showing yesterday's results — today's sales & labor aren't imported until tomorrow morning.
District Overview
ShopWTD ForecastWTD SalesWTD SPLHWTD Labor $WTD Labor %WTD Earned vs ActualToday Earned vs ActualToday SPLH
📆 Week-over-Week
📊 Trends
All Shops Overview
ShopWTD ForecastWTD SalesWTD SPLHWTD Labor $WTD Labor %WTD Earned vs ActualToday Earned vs ActualToday SPLH
📆 Week-over-Week — All Shops
Last 10 closed weeks, all shops per week. Click a week to expand.
📊 Trends — All Shops
Week at a Glance
Enter a rough projected-sales number for each day to see the hours it suggests.
Fixed Hrs and Non-Service Hrs are based on this shop’s own trailing sales average, not what you type below. Scratch space only — not connected to anything else.
DayProjected SalesFixed HrsNon-Service HrsSuggested HoursLabor %
Support
Report an issue or question with the tool.
🔒 0 pending tickets
How the numbers work
View User Guide View Labor Exception Guide
The Formula
Earned Hours = Fixed Hours + Net SalesTarget SPLH + Non-Service Hours
Fixed Hours
Baseline
crew hours to open and close the shop, no matter the volume
Service Hours
Net Sales ÷ SPLH
sales-driven — one hour earned for every Target SPLH of sales
Non-Service Hours
Task list
opening/closing duties and other non-service work (set on the Service tab)
SPLH is the productivity target the formula is built around — how much revenue each labor hour earns. Higher SPLH means tighter, more productive staffing.
SPLH =  Total Net Sales Revenue Total Labor Hours Worked
Service & Non-Service

Service Hours — What Sales Earn, By the Hour

Hourly SalesHours Earned This HourLabor % (est.)
Why is this % the same on every row? Service hours are earned straight from sales — about 1 hour for every $225 in sales. Because the hours rise and fall exactly with sales, labor stays the same share of sales at every volume. It only moves if the wage or the sales-per-hour target changes. (This chart is service only — opening, closing, and Monday duties live separately, and those are what push your real daily labor % higher on slower days.)
In between? It’s a fraction. Service hours move on a straight line — sales ÷ $225. So $112 earns about ½ an hour, $340 about 1½. Every full $225 adds one service hour.
New shops get an easier ramp. For a shop’s first 30 days, service hours are earned off a $200 SPLH target instead of $225 — more hours per dollar of sales while the team is still new. Mark the shop “matured” on the Formula tab once it’s past that ramp to switch it to the standard $225.
Staffing is capped at 10 hours in any single hour — our maximum on-floor crew. Above that sales level, the hour is covered by the team already scheduled rather than by adding labor.

Non-Service Hours

Read-only here — managed from Admin.
TaskMinutesFrequencyHrs/Day
Racking Prep
Racking grows with volume in steps, not a flat number. Enter tomorrow's projected sales (the prep happens today for tomorrow's bake) and the tiers give the prep hours to budget. Complete racking after 1pm. These hours count toward Earned Hours only for shops averaging $20,000+/week (same trailing-average rule as Schedule Writing & Ordering) — below that, racking isn't earned.
$
Racking Prep Time
hours, from the tiers below
Tomorrow's SalesRacking Hours
Workload Calculator
Scratch space — plug in a projected sales number to see the labor hours it earns. Not connected to anything else in the tool.
$
$
hrs
Non-Service Hours
+
Sales ÷ SPLH
=
Labor Hours
Admin
Re-pulls this week’s completed days from Toast so time adjustments show up.
📤 R365 Report Upload
Upload the Forecast Download Report (weekly) and the Labor Actual vs Scheduled report (one day at a time). Fills forecast sales & scheduled hours for all shops.
🩺 System Diagnostics
Checks whether every scheduled job is still firing on its own. Netlify's cron has silently stopped firing before — no error, no log entry — which leaves data quietly stale, so this is the place to confirm nothing has gone dark. Read-only; running it changes nothing.
Shop Settings
$
Used for labor-cost dollar estimates only — your actual hours come straight from R365 and Toast.
Hours of Operation (all 7 days)
Correct any day that's wrong, then publish so it takes effect everywhere — not just this device.
DayOpenClose
hrs
$
Sales each labor hour should produce ($ per labor hour). One shared standard for all shops; new shops use a temporary lower ramp until they mature.
How it works: Labor Hours = Non-Service Hours + (Projected Sales ÷ Target SPLH). Non-Service Hours is one standard baseline shared by every shop; only sales above that earn extra hours. Productivity Goal (the sales each labor hour should produce) is one shared standard for all shops — $225 per labor hour — with a temporary lower ramp for brand-new shops until they mature. Guardrails: never fewer than 2 or more than 10 people during open hours — the Non-Service Hours budget determines how those people's hours get spent, not a separate per-shop headcount.
Non-Service Hours (editable)
Shown read-only to everyone on the Setup tab — this is the only place it can be edited.
TaskMinutesFrequencyHrs/Day
Manager Pay
This week, day by day — click a day for hour by hour
DayForecasted SalesActual SalesHours EarnedHours ScheduledActual HoursEarned vs ActualSPLHLabor Cost $Labor %
📆 Week-over-Week
Week ofSalesActual HrsEarned HrsEarned vs ActualSPLHLabor % (est.)SPLH vs Prior
No closed weeks yet.
📝 Weekly Notes
All notes await approval. Multiple approved notes for the same week are combined, and their exception hours are added together.
Loading…
Submit a note for current or prior week(s)
🔒 0 pending notes
⏰ Hour-by-Hour —
Need = the staffing chart (per hourly sales: $0–250→2, –500→3, –750→4, –1,000→5, –1,400→6, –1,800→7, –2,400→8, –3,000→9, above→10 max) with your baseline crew as the floor. Imported days pre-fill Sched and Actual as an estimate spread from the day's totals (exact hourly punches arrive with the R365 API) — edit any cell to correct it.
Hour% of DayFcst $NeedSchedActualVarStatus