Payroll is its own tab for managers, admins, and owners. It turns a pay period's approved timesheets into a CSV you can hand to whoever runs payroll: one line per person, with regular hours, overtime, breaks, the hourly rate, any wage premiums, and gross pay. It reads and it locks — fixing a punch still happens in Attendance.
Pay periods Growth+
Pick the cadence in Settings → Attendance → Pay Periods & Rounding. Nothing is stored until you lock something — the periods in the picker are worked out from the setting, so changing the cadence simply re-draws them.
- Weekly and Biweekly (the default) count whole periods from the First period start date you choose, forwards and backwards, forever. Pick a Monday and every period starts on a Monday, including the ones before the date you picked.
- Semimonthly ignores that date entirely and splits every month into the 1st–15th and the 16th to month end — so February ends on the 28th, or the 29th in a leap year. Monthly is calendar months.
- An entry belongs to the period that contains its clock-in date. An overnight shift that starts on the last day of one period and ends in the next is paid entirely in the earlier one.
Punch rounding Growth+
Rounding is off by default. Turn it on with an increment of 5, 10, or 15 minutes and a direction — nearest, round up, or round down. The direction only applies once an increment is set.
Rounding never changes a recorded punch
It is applied when the payroll figures are worked out, to each person's period total — once to their regular hours and once to their overtime — not to individual shifts and not to the clock-in and clock-out times themselves. The stored time entries are untouched, so Attendance keeps showing exactly when someone worked, turning rounding off puts the original figures straight back, and nothing needs recalculating when you change the setting.
Worked example: 7h52m is 472 minutes. At nearest 15 that is 7 minutes past 465 and 8 short of 480, so it pays as 7.75 hours. With rounding off it pays as 7.8667 hours.
Approving and locking a period Growth+
Approve all signs off every finished, unapproved entry in the period at once. Unapproved entries are still counted and still exported — the amber warning is there so you see them before the run, not to quietly drop them from it.
Lock period then freezes it. Any manager or admin can lock. Once locked, nobody below owner can create, edit, approve, delete, or change the breaks on any entry whose clock-in falls in those dates, in Payroll or in Attendance. Clocking in and out is never blocked — a live punch is happening now and cannot land in a locked past period.
The owner override, and how to get back out
- An owner can still edit an entry inside a locked period — a missed punch discovered on payday is a real thing. Every such edit is recorded in the audit log, so the escape hatch leaves a trace.
- Unlock is owner-only. Managers and admins cannot reopen a period they locked; the Unlock button only appears for owners.
- Unlocking is deliberately not plan-gated — the server never refuses an owner's unlock over the plan. The Payroll tab itself is still hidden below Growth, though, so a workspace that downgrades with a period left locked has to be back on Growth to reach the button.
The CSV Growth+
Export CSV downloads the period as one row per employee, in this order: Employee, Job Title, Regular Hours, Overtime Hours, Unpaid Break Hours, Paid Break Hours, Hourly Rate, Regular Pay, Overtime Pay, Premium Hours, Premium Pay, Gross Pay, Entries, Unapproved — followed by a TOTAL row.
- Hours print to 4 decimals and money to 2, so the file reconciles by hand: printed hours × printed rate is the printed regular and overtime pay, gross is those two plus Premium Pay, and each total is the sum of the column above it. The screen rounds hours to 2 decimals; the file is the artifact to pay from.
- Unpaid breaks are already deducted from the hours; paid breaks are already inside them. Both are shown so the deduction is visible rather than implied.
- Only people with time entries in the period get a line. Nobody appears at zero hours.
Overtime is paid at the regular rate — for now
Approved overtime is split out of the worked total into its own column so you can see it, but Schedula has no overtime multiplier yet, so Overtime Pay is those hours at the same hourly rate. Wage premiums (below) are the way to pay more for particular hours, and they apply to overtime minutes as well — so nothing multiplies a multiplier.
Banking overtime instead of paying it Growth+
Under Settings → Attendance → Time Banks → Approved overtime you can send approved overtime to a leave policy rather than to the payroll run. Approving an overtime request then credits those minutes to the employee’s balance, to be taken later as time off, and stamps the request as banked at the same moment.
Banked overtime is never also paid
Banked minutes are removed from the worked total before regular and overtime hours are worked out — not merely left out of the overtime column, which would have quietly paid them at the base rate instead. A fully banked hour therefore adds nothing to Regular Hours, Overtime Hours or Gross Pay. The export decides this from the stamp on the overtime request itself, so overtime approved after a period closed is still recognised as banked. The CSV columns are unchanged; nothing needs remapping.
Banking needs a policy to bank into
The settings screen refuses to save Bank it as time off until you choose the policy it banks into. If that policy is later deactivated, the screen says so and approved overtime is paid out in the meantime — stamping a request as banked with no balance behind it would lose the minutes altogether. Note that banking is deliberately not switched off by a downgrade: a workspace that drops below Growth keeps banking overtime under the rule it set, rather than silently starting to pay people out.
Wage premiums Growth+
A premium pays extra for particular hours — an evening or night differential, a weekend rate, a holiday rate. Add them in Settings → Attendance → Wage Premiums (admins and owners), and the export applies them to everyone automatically. A premium says when it applies and what it is worth.
- Time window — a start and end time in HH:MM. The start counts, the end does not, and an end at or before the start wraps past midnight, so 22:00–06:00 is the night shift.
- Days of the week — one or more whole days.
- Specific dates — explicit dates for statutory holidays. Schedula ships no holiday calendar; you enter the dates you pay for, up to 200 per premium.
- Every minute is judged by its local date, weekday and time in your workspace's timezone — so a Saturday-night shift stops counting as the weekend at local midnight, not UTC midnight.
- What it is worth — a multiplier greater than 1 (at most ×5) or a flat amount per hour greater than $0 (at most $100). ×1.00 and +$0.00 are rejected rather than saved: they are worth nothing per hour, so they would sit in the list looking active and never pay.
Overlapping premiums never stack
A minute of work earns one premium — the best-paying rule for that person. Two overlapping rules mean "whichever is better", not "add them both".
- "Best" is judged per employee, at their own hourly rate, on what the rule adds per hour: a multiplier adds rate × (value − 1), a flat amount adds its value. So ×1.15 beats +$2.00/h above about $13.34/h and loses below it, and the same two rules can genuinely credit two people on the same shift to different rules. That is what "whichever is better" means.
- An exact tie goes to the older rule, so re-running an export never reshuffles which premium was credited.
- A premium is an uplift. The hours themselves are already paid in Regular Pay and Overtime Pay; Premium Pay is only the extra on top, which is why Gross Pay is regular + overtime + premium.
Unpaid breaks reduce premium hours proportionally, not exactly
A break records how long it lasted, not which minutes of the shift it occupied, so Schedula does not guess. It works the premium out over the whole clocked interval and then shrinks every bucket by the same proportion: an 8-hour shift with 30 unpaid break minutes and 4 hours inside a premium window pays 3.75 premium hours, not 4. It is exactly right whenever a shift sits entirely inside or entirely outside a window — which is most shifts — and an honest approximation otherwise.
- Premium hours are rounded with the same punch-rounding policy as the paid columns, once over the period total, and can never exceed the hours the row actually pays for.
- Premiums apply to every worked minute, including overtime minutes. Overtime itself still pays at the plain hourly rate, so nothing compounds.
- Premiums are deactivated, never deleted. There is no delete button: the CSV carries hours and dollars but not the rule that produced them, so a deleted premium would make a past export impossible to explain. Turning one off stops it earning from the next export onward and leaves it readable. Up to 50 per workspace.
Editing a premium changes what an export shows — including a locked period
Payroll figures are worked out fresh every time you open or export a period, from the premiums, hourly rates and rounding settings as they are right now. Locking a period freezes its time entries, not the rules the money is computed from, so re-exporting a period you have already paid after editing a premium will not reproduce the file you paid from. Keep the CSV you paid from, and prefer adding a new premium from a date forward over rewriting one that has already been paid.
Who and what plan
Payroll needs Growth or above and the manager role or higher. Below Growth the tab is hidden altogether rather than shown locked, while the pay period, rounding and wage premium settings in Settings → Attendance stay visible but disabled — so you can see what upgrading buys, and a workspace that downgrades can still read the premiums its past exports were computed from. Staff never see Payroll. Premiums are added by admins and owners, since Settings itself is admin-only.