Drafts, then publish
Shifts start as drafts. Publishing is a deliberate act, and editing a published shift re-drafts it — so the version your staff saw is never quietly rewritten underneath them.
Solution — Workforce & store ops
An 8-location franchise with 32 employees runs its whole week on this: PIN punches on a shared counter tablet, a published rota, timesheets that show scheduled against actual, and a payroll workbook that opens in Excel with the formulas live. It replaced Deputy. It is not a loyalty app with a time clock stapled to it — it's a separate product tier, and the surfaces that don't belong to it are switched off at the API.
8locations on one roster
32employees, PIN on a shared tablet
4digits to clock in
.xlsxpayroll workbook, live formulas
01 — The time clock
A time clock is easy to demo and hard to survive. The failures are all in the edges: the forgotten out-punch, the break that never closed, the manager "fix" nobody can trace, the employee scheduled at one store who worked at another.
That last line is load-bearing. A person who works two stores used to have their whole cross-store rota attached to their first row — the unscheduled store's timesheet filled up with the other store's hours. Scheduled hours are now keyed by employee and location, and a schedule-only row is filed under the store the shift is at. If a timesheet number looks wrong to you, it is wrong, and there's a drawer to fix it with your name on the edit.
02 — Scheduling
Shifts start as drafts. Publishing is a deliberate act, and editing a published shift re-drafts it — so the version your staff saw is never quietly rewritten underneath them.
Copy-week de-dupes instead of stacking duplicates. Drag a chip to move it, hold Alt or Ctrl to copy, or pick up the clip and paint shifts into cells — including into a different store's grid.
Pick the stores you're scheduling from a multi-select; each one gets its own editable grid with its own publish and copy-week. A totals card sums every selected store, and tells you how many of them it actually counted.
Approved leave shows up against the grid while you're building it, not after you publish and someone texts their manager.
A published shift carries a red dot until the employee taps Confirm shift in their phone portal, then it goes green. Edit the shift and the confirmation clears — because it was a confirmation of the old one.
PIN verification at the counter carries that person's published shift for today, so the clock and the rota can't disagree about who was supposed to be there.
03 — Payroll
Most systems hand payroll off as a flat export and let the office rebuild the workbook they actually use. We built the workbook. One owner-only button produces a genuine .xlsx that mirrors the sheet the bookkeeper was already keeping by hand — sections per legal entity, live SUM formulas in the subtotal cells, hourly rows carrying hours and overtime straight from the punches, and blank leave columns where they're meant to be filled in by hand.
The details that make it usable are unglamorous and all real: a layout switch between per-entity sections and person-major (salary block, then hourly, with mixed people appearing in both); vacation, sick, holiday, bereavement, paternity/maternity and a labelled “other” with its reason appended to the comments; whole-row highlighting when a pay change landed inside that week, when there are leave hours, or when there's a note the office should read; and per-store payroll extras — weekly salary split, mileage, loans, deductions, direct deposit — because a salaried person who covers three entities gets paid differently by each one.
Salary is per store, not per person. Someone can be salaried at three locations and hourly at a fourth, and the workbook, the timesheet and the schedule's salary/hourly split all read it the same way: the salary belongs to the stores that have a profile row for it. Salaried rows show literal zero actual hours with a SALARY tag next to the name — the client's own convention, matched deliberately so the sheet ties out.
04 — Paper you're legally required to keep
One rule worth stating plainly, because it's the kind of automation that goes wrong everywhere else: pay-rule automation suggests. You can set a rule — this many write-ups in this window implies a dock or a raise, by percent or by cents — and when it fires it creates a suggested pay change for the owner to approve or dismiss on its own screen. Nothing changes anyone's pay silently. Every approved move is written to a pay-change ledger with an owner-only history chart.
05 — Who can see what
Multi-location HR is mostly a permissions product. Two mechanisms do the work: store scope, and per-area revokes. A GM or manager is assigned stores; every list they can reach — people, schedule, timesheets, quotes, stamp logs, write-ups — is filtered to those stores, and a direct link to a record outside their scope returns a 404 rather than opening. Assigned nothing means seeing nothing. That's deliberate: an empty assignment used to mean "everything", which is the wrong default for the only mistake an owner is likely to make.
On top of that, the owner can revoke individual areas per person from an access drawer — hiring, documents, schedule, leave, people. The revoke is enforced in middleware, and the sidebar asks the API what the signed-in user can actually do before it draws itself. We found that one in production: a revoked area returned 403 while its tab sat there in the nav, visible on a fresh login. Nav and API now read the same answer, and someone sitting on a tab that just got revoked is moved off it.
Pay is stricter than everything else. Rates, pay history, the payroll workbook, the hours export, clock rules, PTO and store creation are owner-only at the endpoint. The schedule doesn't even return who is salaried to a GM — that key is absent from the response, so the salary tag and the salary/hourly split simply don't exist for them. View-as inherits the target's permissions rather than the owner's, which is the whole point of view-as.
06 — The employee's phone
Every employee gets a phone portal on a private link — no app store, no password to forget. It's the half of the product that decides whether any of the above actually gets used.
There's also a help button on the counter tablet: PIN, type the problem, and it posts into a single reused chat thread with the owners and pushes to their phones. It reuses the thread on purpose — a help button that spawns a new thread every time is a help button owners learn to ignore.
07 — The counter itself
Workforce is half of store ops. The other half is the paperwork a shipping-and-print counter generates all day — and this is where the product stops being generic HR software.
Price is computed server-side from the item's actual dimensions and a rate you set — the associate can't quietly discount it. Padding rules per dimension (standard, fragile, custom), a double-versus-triple wall comparison side by side, optional material and service add-ons priced off the box, at least two photos when the item is in the store, and a required customer signature with a pricing disclaimer ticked before it's accepted. Box sizes stay hidden from the customer-facing screen until a shipping choice is made.
The forms match the paper forms field for field, including the personal-belongings disclaimer verbatim, per-item condition, specific-dates-or-window handling and the damages-and-photos branch. A box quote hands off to freight carrying the finished boxes — padded dimensions, weights, photos — and can hand back again without re-typing.
Scan the carton's tracking and each RMA with the tablet camera or a handheld scanner, witnessed by two or three distinct employee PINs. Export to CSV or XML in the exact shape the client's own sheet wants — carton row, then one row per RMA. Malformed RMA codes and mis-scanned barcodes are refused on both the tablet and the server.
Books and rolls are separate counters, and sold is derived between consecutive counts plus restocks — so a closing count with no opening count is refused at the tablet rather than poisoning every day after it. The month is a fully editable grid; the CSV mirrors the workbook the stores were emailing in. Prices are effective-dated so a change never restates last month, and the whole money layer — revenue, cost, margin — is owner-only: a manager's payload contains no money at all.
Quotes become a pipeline — new, quoted, won or lost — email the owners in one batched send, and can be edited afterward by the owner or a scoped manager with the reference and signature preserved. The same forms are available from the office portal, not just the tablet, so a phone quote doesn't have to be taken at the counter. Deeper on the tablet itself: the counter kiosk and staff roles and management.
08 — Honest limits
Camera scanning depends on the tablet. Continuous barcode scanning uses the browser's barcode API, which means Chrome and Android tablets. iOS falls back to typing the code. We also support a plain USB or Bluetooth handheld scanner as a keyboard wedge on the returns screen, and honestly that beats any tablet camera on a dense UPS label — if your counter has a handheld, use it.
Per-seat billing isn't automated yet. Workforce deployments are quoted and invoiced as a buildout plus a per-active-employee monthly rate. The metering behind that is not yet wired into our self-serve billing, so it's handled as an account rather than a checkout.
Address lookup is a live integration. The counter's address type-ahead runs through a Google Places proxy that needs a key configured for your account. USPS address verification is built but dormant until credentials are set — we won't claim it works for you until it does.
Pricing is quoted. Unlike the loyalty platform's published $200/mo, workforce and ops pricing depends on sites and headcount. Ask and you'll get a number on the call.
09 — Questions
It replaced Deputy at an 8-location franchise with 32 employees, roster and all. Punches, breaks, exceptions, manager fixes with an audit trail, the rota with drafts and publishing, and the weekly payroll workbook are all in here. It is a separate product tier from the loyalty CRM — ops tenants never touch retail or studio code, and the gate fails closed.
One shared tablet per store on the counter. It claims itself once with a per-store 5-digit code and then holds a long-lived device token you can revoke from the Stores tab. Employees identify with a 4-digit PIN they set themselves from their phone — no per-person badge, no biometric hardware, no per-device fee.
No. Store scope fails closed: a GM or manager with no stores assigned sees nothing until the owner assigns them, and every list — people, schedule, timesheets, quotes, stamps, write-ups — is filtered to their stores. Pay rates, pay history, the payroll workbook, PTO and the clock rules are owner-only at the API, not just hidden in the nav.
Workforce and ops pricing is not published — it is quoted per site and headcount, because a 2-store shop and a 9-location franchise are not the same build. The loyalty platform's pricing is public at $200/mo. Ask on a demo call and you will get a number, not a discovery sequence.
10 — Next step
Twenty minutes: the counter tablet, a published rota, a real timesheet with exceptions on it, and the payroll workbook opening in Excel. Bring the week that broke your last system.
Workforce & ops pricing is quoted per site and headcount · no contracts