Skip to content

Salary & Payslips

The Salary page (linked from Employees, or in the People navigation) is where payroll gets formally prepared and finalized month by month - this is a different workflow from Payroll & Hours, not just a renamed version of it:

Payroll & Hours Salary
Period Any week or month, live Calendar month only
Source Raw attendance, recalculated on every visit Attendance + any manual day adjustments, frozen into a versioned snapshot when finalized
Editable? No - view/export only Yes - each day’s hours can be overridden before finalizing
Output CSV of estimated hours/pay Finalized payslip PDFs (with tax breakdown) and a timesheet CSV
Undo N/A De-finalize reopens a finalized month for editing

Only employees assigned to a branch are considered anywhere on this page - an employee with no branch simply doesn’t appear in the list, exports, or bulk actions. Terminated employees are also excluded from the main list entirely.

  • Use the month navigation at the top to move between months, and the branch dropdown to filter.
  • Each employee appears as a card showing their status for that month, computed fresh every time you view the page (not stored as a fixed value) from whether a draft and/or a finalized payslip exist:
    • Not started - no draft and no finalized payslip yet.
    • Draft - a draft exists (day adjustments may have been made) but nothing has been finalized.
    • Changed since finalized - a payslip was finalized, but the draft has since been reopened or edited (hours changed after finalizing).
    • Finalized - a payslip exists and there’s no newer draft activity since.
  • Click an employee’s card to open their monthly detail page: hours grouped into weeks, each day shown as a clickable cell.

Clicking a day cell on the monthly detail page opens a panel showing:

  • Every attendance record (clock-in → clock-out, plus any break minutes) recorded that day, and the hours computed from attendance. A shift that runs past midnight is attributed entirely to the day its clock-in falls on, even if the clock-out lands the next calendar day - it isn’t split across the two days.
  • Fields to enter a different hours (0-24, whole number) and minutes (0-59, whole number) total for that day, plus an optional note explaining the change (e.g. “forgot to clock out, confirmed with employee”). The combined total can’t exceed 24 hours.

Saving an adjustment overrides the computed total for that day everywhere on the Salary page and in the final payslip - the day cell gets an “adjusted” flag so it’s clear it’s no longer the raw attendance number, and that day’s overtime (still measured against the 8-hour daily threshold) is recalculated from the overridden total, not the original attendance. Click Revert to computed to discard the override and go back to the attendance-based total.

Click Review & finalize on an employee’s monthly detail page (or select multiple employee cards on the main Salary page with the checkboxes and click Finalize {n} selected) to lock in that month’s payslip:

  • If your restaurant has any payroll categories set up and this employee doesn’t have one assigned yet, you’ll be asked to pick one before finalizing - it’s then saved permanently to their profile (their payroll_category_id), so future months don’t ask again and reuse the same category automatically.
  • Finalizing snapshots the month’s hours, pay, and tax breakdown into a new payslip version (version numbers increment per employee per month), superseding any previous version for that month (older versions aren’t deleted, just marked superseded). The snapshot freezes the employee’s name, code, branch, currency, rate, expected hours, category name, and tax lines exactly as they were at that moment - so a later change to any of those doesn’t alter an already-finalized payslip.
  • De-finalize reverses this: the active payslip is marked superseded and the draft reopens for editing (its status flips back to “draft”). Nothing is deleted, so finalizing again afterward just creates the next version.
  • If hours change (via an adjustment or new attendance) after a payslip was finalized, that employee’s card shows Changed since finalized until you finalize again.
  • Bulk-finalizing several employees at once processes each independently; if some fail (e.g. an employee has no branch), the result tells you how many of the total succeeded and surfaces the first error, rather than failing the whole batch silently.
  • Download payslip on an individual employee’s monthly page downloads that finalized month’s PDF (/salary/{profileId}/{month}/payslip) - this 404s if that employee has no active (finalized) payslip for the month.
  • Back on the main Salary page, select employee cards and click Download {n} payslip(s) to get a ZIP of the selected finalized (or changed-since-finalized) payslips - any selected employee without a finalized payslip is simply skipped rather than blocking the download, as long as at least one selected employee has one.
  • Download all payslips downloads everyone currently visible for the month as a ZIP, but only once every one of them is finalized or changed-since-finalized - if anyone in scope is still Not started or Draft, it refuses and tells you how many are missing so you can finalize the rest first.
  • Export timesheet (CSV) downloads one row per employee for the month/branch - Month, Employee, Employee Code, Branch, Status (Not started/Draft/Changed since finalized/Finalized), Days Worked, Hours, Overtime Hours, Hourly Rate, Estimated Pay - reflecting any day adjustments, unlike the raw Payroll & Hours export. The status column is computed at export time from current draft/payslip state, the same logic used for the employee cards, so it can’t go stale.
  • The stat bar and a payout-by-branch breakdown summarize totals across employees for the month (based on finalized payslips only).

Each generated payslip PDF shows the employee’s name, code, and payroll category; their hourly rate (or “Not set” if none) and expected weekly hours; total hours and overtime for the month; a gross pay figure; a line for each tax on their payroll category (name, percentage, amount withheld) if any apply, followed by net pay; and, unless Payslip Settings has the layout set to Short, a full week-by-week, day-by-day table of hours with any adjustment notes and each week’s expected-hours comparison. Every payslip footer notes it was “Generated {date} by SessionPilot OPS - Estimated figures for internal payroll preparation,” and carries its version number.

Payslips generated before your restaurant had taxes, categories, or a layout choice set up still render correctly if you re-download them later: a snapshot missing those keys falls back to no taxes, net pay equal to gross, and the long layout, exactly as it looked when it was first generated.

Payslip Settings (top right of the Salary page) is where payroll categories themselves are defined - distinct from contract categories described in the Employees guide. Each payroll category has a name (e.g. “Standard”, “Manager”) and any number of named tax lines, each a percentage between 0 and 100:

  1. Click Add category, name it, and click + Add tax for each tax to withhold (e.g. “Income tax”, 30%).
  2. Click Save. Saving an existing category replaces its entire tax list in one go - it deletes all of that category’s current taxes and re-inserts the ones you just submitted, rather than patching individual tax lines.
  3. Assign the category to employees either ahead of time (their profile’s Payroll category field under Pay & Time Clock) or the first time you finalize their payslip.

Every tax on the employee’s assigned category is applied as a percentage of that month’s gross pay, rounded to the nearest cent, and the sum is subtracted to produce net pay on their payslip. A category with No taxes still works - it just shows gross = net.

Payslip Settings also has the Payslip length toggle (Long/Short), which applies restaurant-wide - but only to payslips generated (finalized) after you change it. It’s baked into each payslip’s snapshot at finalize time, so switching the toggle doesn’t retroactively reformat a payslip that was already finalized; you’d need to finalize that month again to pick up the new layout.

Why did finalizing a payslip ask me to pick a payroll category? This only happens the first time you finalize for an employee who doesn’t already have a payroll category set, and only if your restaurant has created at least one category under Payslip Settings. Whatever you pick is saved to their profile, so later months won’t ask again.

An employee’s hours look wrong after I clocked them in/out manually or fixed attendance. Both Payroll & Hours and the Salary page recompute from current attendance every time you view them (unless a day has a manual adjustment on the Salary page, which always wins over the computed total). If a payslip was already finalized before the fix, its card will show Changed since finalized - de-finalize and re-finalize to pick up the corrected hours.