Every rule here was decided once and is followed by the app the same way every month. Each one has a worked example and the place in the app where it is set.
This chapter is generated from the same data as the Help Center policy page (/help/policy-book). Updated 2026-10-08.
Late
Grace decides IF you are late. Lateness counts from shift start. — Arrive inside the shift grace and the day is on time, zero late minutes. Arrive after it and the whole grace is lost: late minutes count from the shift start, not from the end of grace. Late deduction bands use the same clock. Example: 9:00 shift, 15 min grace. 9:10 → on time, 0 min. 9:20 → late, 20 min (not 5). Where: Shifts → grace period. The old Payroll Policy grace field is retired and not read.
Setting a late day to PRESENT by hand does not forgive the late — A late day that HR changes to PRESENT keeps its late cut. To forgive a late, HR uses the late waiver, so the forgiveness is recorded with a name and a reason. Example: Late 287.50 on 13 Sep. HR edits the row to PRESENT → still 287.50 off. HR waives it → 0, and the waiver shows who did it. Where: Attendance → edit row (status); late waiver.
Payroll run
A payroll policy must cover every month you run — Each policy has an effective window. A month with no policy covering it cannot be run. Example: Policy ends 30 Sep. The October run stops with "No active payroll policy found for this payroll period." until the window is extended or an October policy is made. Where: Payroll → Payroll Policy → effective from / to.
An APPROVED run is locked — Processing a run approves it. An APPROVED run cannot be reprocessed or recalculated, and an import cannot change it. To change it, HR un-approves it (back to Draft), then presses Process again, which approves it again. Example: August run approved. Someone fixes an attendance row in September. The August figures stay as approved until HR sets August back to Draft and processes it again. Where: Payroll → Payroll Runs → Edit → status Draft, then Process. The Reprocess button is off.
No tax rule for the month = 0 tax, with a warning — A run whose month has no tax rule deducts no tax and now shows a warning instead of staying silent. Example: Bangladesh rules end June 2026. A July 2026 run deducts 0 tax and warns "No active Bangladesh income tax rule covers 2026-07, so no income tax was deducted…". Where: Payroll → Tax rules; the run shows the warning.
A day with no shift anywhere is not owed — With no shift assignment, the company default shift is used. With no default either, the day is not owed: no absence, no cut, and the payroll preview warns about it. Example: Employee has no shift, company has no default shift, misses Tuesday → no deduction for Tuesday. Where: Shifts → company default shift; Shift assignments.
Calendar
A weekend given working hours is a working day — A weekend day opened with a working-hours day override (DRIFT or MANUAL) counts as a working day. For a make-up Saturday, the right setup is a Holiday row of type "Weekend, office open" (WORKING_DAY). Example: Saturday 5 Sep opened as make-up day, employee absent → one absent day cut (575 for a 575 day pay). Where: Holidays → type "Weekend, office open"; Attendance → day overrides.
Holiday "Extra pay" is on by default — A new holiday has "Extra pay" ticked. "Weekend, office open" has it off. Working on a holiday with Extra pay on adds a Holiday Work Pay line, unless the payroll policy's Off-day work pay is "No extra pay". Example: Eid holiday, employee works → Holiday Work Pay line. Make-up Saturday → normal day, no extra line. Where: Holidays → form → Extra pay; Payroll Policy → Off-day work pay.
Attendance
HR edits are marked; device punches leave them alone — When an admin edits check-in or check-out, the row is marked overridden. A later device punch or recompute does not overwrite HR's times. Example: HR sets check-out 18:00. The device sends 17:40 later → row keeps 18:00. Where: Attendance → edit row.
The server works out the status unless HR picks one — Change only the times and the status is worked out again (PRESENT, LATE, HALF_DAY). Pick a status by hand and it wins. Example: HALF_DAY row, check-out moved to 18:00 → becomes PRESENT or LATE by itself. Where: Attendance → edit row.
Nightly absence job: every active company, stops at the last day — Each night every active company gets ABSENT rows for owed days with no attendance. It stops at a leaver's last working day. Example: Employee leaves 18 Aug → no ABSENT rows from 19 Aug. Where: Runs by itself every night; nothing to set.
Staff who never check in are paid every working day — An employee set to "Needs to check in" = No is never marked absent: the nightly absence job skips them and payroll counts every working day as worked. Only what HR enters by hand cuts their pay: an Absent or Half day row, and approved unpaid leave. No late cut. Absence rows the job wrote before the switch are ignored. Overtime and holiday pay are unchanged. Example: Basic 19,500, no attendance rows in September → paid 19,500 (before: 13 auto-absent days cut it to 10,614.50). HR enters one Absent day → one day is cut. Where: Employees → edit → Needs to check in. Import Center → Employees → "Needs To Check In" column (blank = Yes).
Leave
A leave that covers no working day is refused — A leave whose dates contain 0 working days (only weekend or holidays) cannot be created or approved. Cancelling an old one still works. Example: Leave for Friday–Saturday only → refused. Where: Leave → apply / approve.
Mid-year joiners get a pro-rated quota — A joiner's yearly quota is cut to the months left in the year, on the server and on the "Auto-assign defaults" button. Months are counted in the company timezone, not UTC. Example: Joined 9 Jul, yearly Casual 10 and Sick 12 → Casual 5, Sick 6. HR can still edit by hand. Where: Leave balances → Auto-assign defaults.
Leavers
Unused SICK leave is never paid out when someone leaves — At final settlement, unused earned / annual / casual leave is paid out. Unused sick leave is not. The rule is the per-type switch in EXIT-02, which is off for sick leave. Example: Leaver has 4 sick and 3 casual days left → paid for the 3 casual days only. Where: Final settlement.
Per leave type: "Paid out when an employee leaves" — Each leave type has a switch that decides whether its unused days are paid at exit. Final settlement pays only types that are paid leave AND have the switch on. New types start with it on; existing types named like "sick" were switched off, and an imported "sick" type comes in off. Example: Sick: off. Annual: on. Casual: on. A type called "Medical Leave" is paid out until HR switches it off. Where: Leave types → form → "Paid out when an employee leaves" (Yes / No); the list shows "Paid on leaving".
A leaver's final month is paid once — A payroll run and the final settlement cannot both pay the final month. The run skips or refuses the leaver. If an APPROVED run already covers that month, HR cancels it first. Example: Left 18 Aug. August run approved and settlement also paid 1–18 Aug → that double payment is now refused. Where: Payroll runs; Final settlement.
Unpaid loans block delete; settlement recovers them — An employee with a PENDING or OVERDUE loan instalment cannot be deleted. The final settlement recovers PENDING and OVERDUE instalments, and checks loans again at approve — save the settlement to refresh the loan figure. Example: Loan 35,000 unpaid → delete refused, the message names the loan and amount. Where: Employees → delete; Final settlement → save / approve.
Things you will forget
A make-up Saturday is a Holiday row, not a shift trick — Enter it as Holidays → "Weekend, office open". A working-hours day override also counts now (CAL-01), but the Holiday row is the setup HR should use.
How a month is paid
1A payroll policy covers the month — Its effective window includes the whole month. If not, the run stops. Where: Payroll → Payroll Policy
2A tax rule covers the month — Otherwise tax is 0 and the run warns. Where: Payroll → Tax rules
3Calendar is right — Holidays entered, make-up days as "Weekend, office open", Extra pay ticked as intended. Where: Holidays
4Attendance is closed — Missing check-outs fixed, HR edits done, leaves approved or refused — nothing pending in the month. Where: Attendance; Leave requests
5Waivers entered — Forgive a late only with the late waiver, so it is recorded with a name and a reason. Where: Attendance → late waiver
6Leavers go through final settlement — Their final month is paid by the settlement, not the run. Save the settlement to refresh loans. Where: Final settlement
7Process payroll and read the warnings — Processing approves the run. No tax rule, no shift, no policy — each warning is a setup gap, not noise. Where: Payroll → Payroll Runs
8Pay what the approved run shows — Process only when the month is final. To change an approved run, set it back to Draft and process it again. Where: Payroll → Payroll Runs