Payroll
Payroll is where your workspace turns each employee's salary into a monthly pay run: it calculates gross pay, applies attendance-based proration, deducts tax and other statutory amounts, produces salary slips, and records how each person was paid.
All screens below live under Payroll in the admin sidebar (/admin/payroll/...).
The exact deductions and tax math follow your workspace's country pack — for
example, workspaces set to a Gulf country such as the UAE have no income tax, while a
Pakistan workspace runs progressive tax slabs. You never pick these formulas by hand;
they come from the country set on your company profile.
Menu items and buttons only appear if your role has the matching payroll permission (view, process, approve, lock, manage, configure). If a page is missing, ask an admin to grant the permission.
The big picture
A typical month runs in this order:
- Set up components and structures (one-time, then occasional edits).
- Assign a salary to each employee.
- Add any increments, bonuses or adjustments for the month.
- Process the payroll run for the month.
- Review → Approve → Lock the run — approval runs automatic pre-flight checks and is refused while any blocking problem remains.
- Mark as paid (disburse) and optionally generate the bank file.
- Send salary slips; employees acknowledge them in their portal.
1. Salary components
Screen: /admin/payroll/components
A component is a single line that can appear on a pay slip — Basic, House Rent, Provident Fund, Tax, EOBI, and so on. Click Add Component and fill in:
| Field | What it does |
|---|---|
| Name / Code | Label shown on slips; the short code (e.g. BASIC, TAX) is used by formulas |
| Type | Earning, Deduction, or Employer contribution |
| Calculation | Fixed, % of Basic, % of Gross, or Formula |
| Taxable | Whether the amount is included in taxable income |
| Contributes to | Flags for EOBI, Provident Fund, Overtime, and Gratuity bases |
The component with the code TAX is special: income tax is only deducted from an
employee whose salary structure includes a TAX component. A structure built
without it is treated as fully tax-exempt.
2. Salary structures
Screen: /admin/payroll/structures
A structure is a reusable template that bundles several components together (for example "Standard Employee"). Click Add Structure, give it a name, then add components one by one. For each row you set the calculation type and a value (or a formula) and whether it is mandatory. Click a structure to see its full component breakdown.
3. Assign salaries to employees
Screen: /admin/payroll/salaries
Click Assign Salary and choose the employee, the structure, the gross salary, and the effective-from date. This becomes the basis for every future pay run.
To give someone a different template later, use Change Structure on their row — it creates a new assignment from the effective date you pick, so history is preserved.
4. Increments, bonuses and adjustments
These optional items feed into the pay run for their month.
- Increments —
/admin/payroll/incrementsA permanent salary change going forward (types: annual, promotion, performance, adjustment). Enter the employee, the new salary and the effective date. - Bonuses —
/admin/payroll/bonusesA one-time payment for a chosen month (performance, festival, annual, signing, spot, or custom). Bonuses move through pending → approved → paid. - Adjustments —
/admin/payroll/adjustmentsA low-ceremony one-off addition or deduction for a month, with a taxable flag. Use it for corrections and edge cases.
Bonuses and adjustments attached to a run are settled (marked paid) automatically when the run is locked or disbursed, after which they can no longer be edited.
5. Process a monthly payroll run
Screen: /admin/payroll/process
Pick the month and year (the picker defaults to the previous month, since a month's payroll is normally run after it closes) and click Process Payroll. The system calculates every eligible employee and shows totals for employees, gross, deductions and net. If any employee was skipped, a note tells you to open the run and see why.
If your workspace has enabled it in settings, a Skip attendance deductions checkbox appears — ticking it pays everyone in full for that run, ignoring absences, late days and unpaid leave.
Presence-based proration (the "sandwich" rest-day rule)
Payroll prorates pay on a calendar-day basis: each employee earns payable days out of the month's total days, and pay is scaled by that ratio.
- Working days are paid according to attendance (present days count, absent days do not, half-days count as half).
- Rest days (weekly offs and holidays) are paid only when they sit between two earned days. An absence directly next to a weekend or holiday forfeits that rest day — this is the "sandwich" rule.
- Mid-month joiners and leavers are prorated for the days they were actually employed.
Rest-day swaps (a worked weekend traded for a different day off) are honoured in the same calculation. If Skip attendance deductions was used, everyone counts as fully present and no proration is applied.
Income tax and statutory amounts
Tax and other statutory figures come from your country pack:
- Income tax — progressive slabs, a flat percentage, or none (for example, the Gulf states), depending on your country. Tax is applied only if the structure carries a TAX component (see the tip above). Where the statute taxes pay net of the employee's statutory contributions (the Philippines), those lines are taken off before the tax table is applied. German and French workspaces are asked to enter their own bracket table before approval — see the pre-flight table below.
- Provident Fund, Gratuity, and social-security / EOBI contributions are computed using the country's rules and the component flags you set.
If your country levies no income tax through payroll (for example the UAE or Saudi
Arabia — or Singapore, where employers never withhold and IRAS assesses each employee
directly), the tax screens are not just inert — they are removed. The whole Tax section
vanishes from the admin sidebar (Tax Slabs, Tax Certificates, Adjustments, Templates),
Tax Reports disappears from Reports, and employees do not see Tax Certificates
in their portal. An old bookmark opens a Not applicable in <your country> page
instead of an error, and the underlying API answers 404.
Nothing is wrong and there is nothing to configure — this is driven by the country on your company profile, not by permissions or your plan, and no admin can turn it on.
Tax slabs and the new fiscal year
Your fiscal year now advances automatically each year — the platform opens the next year the day after the current one ends (see Company Setup → Fiscal Years). But in a progressive-tax country the slab table follows each year's Finance Act, so the new year does not automatically come with brackets.
Seeded data currently covers Pakistan through FY 2026-27 (Finance Act 2026) and the
UK through 2026-27. Before processing the first run of a new fiscal year, open
Tax → Tax Slabs (/admin/tax/slabs), pick the new year and confirm brackets exist.
A fiscal year with no slabs computes zero income tax for everyone — the platform
logs an error when this happens, but the run itself will not invent a number. If slabs
are missing, contact support or enter the year's brackets on that page.
Fixing a run before approval
While a run is still in draft, processing or review, you can open it
(/admin/payroll/runs/{id}) and Reprocess one or more selected employees without
disturbing the rest. Once approved, locked or disbursed, entries are protected from
reprocessing.
6. Review, approve, lock and disburse
Open a run from the history list (/admin/payroll/history) or straight after
processing. A run moves through these statuses:
| Status | Meaning |
|---|---|
| Review | Freshly processed; still editable |
| Approved | Signed off; ready to lock or pay |
| Locked | Frozen — no further changes |
| Disbursed | Payments recorded as made |
Buttons appear according to the current status:
- Approve a run in review. You can Send back to review an approved run to edit it again. Approval is subject to the pre-flight checks below — if a blocking issue exists you will see an error explaining each problem, and the run stays in review.
- Lock an approved run to freeze it.
- Mark as Paid opens the disburse dialog — enter the payment date, payment method (bank transfer, cheque, cash or wallet), an optional bank account and reference, and whether to email employees. This marks every entry paid and moves the run to Disbursed.
- Finalize Run is used when each entry was already marked paid individually (e.g. imported history): it moves the run to Disbursed without overwriting per-entry payment details.
- You can also mark or un-mark individual entries as paid from the run detail.
Print produces a clean payroll register, and Export downloads every column for all employees as a CSV.
Pre-flight checks — why an approval can be refused
The most damaging payroll mistakes look completely normal on a payslip. An employee with no shift is never marked present, so payroll reads the whole month as absence and deducts nearly the entire salary — and the slip still looks ordinary. Before a run can be approved, the system checks the month and refuses approval while any blocking problem remains. Warnings are surfaced but never stop payday.
When you click Approve with problems present, approval fails and you'll see an error listing each problem. Every finding explains what is wrong, why it matters in money terms, and what to fix — the person running payroll is often not the person who configured the workspace.
Blockers — approval is refused until these are fixed:
| What stops approval | How to fix |
|---|---|
| This workspace has no default shift | Create a shift under Attendance → Shifts (/admin/attendance/shifts) and mark it as the default. Without one, new employees get no working pattern. |
| Employee(s) have no shift assigned | No shift means no attendance is ever recorded, so payroll treats every day as absence and deducts almost the whole salary. Assign a shift on each employee's profile. |
| Employee(s) have no attendance at all this month | Not a single day is recorded, so the month is treated as unworked. Mark the days on Mark Attendance (/admin/attendance/mark), or switch their shift to auto-present if they are not expected to clock in. |
| No fiscal year is marked current | Set it under Company → Fiscal Years (/admin/company/fiscal-years). |
| No income tax slabs configured for the current fiscal year | Only raised where your country levies income tax. Without slabs, income tax computes as zero for everyone — silent under-withholding. Add them at Tax → Tax Slabs (/admin/tax/slabs). |
| Income-tax brackets for your country are yours to enter | Raised instead of the row above for Germany and France, whose income tax no bracket table can express (German tax classes; the French per-employee withholding rate). Enter your own approximation at Tax → Tax Slabs — or, if you run tax entirely outside the product, a single 0% row for the year, and post each employee's tax as a payroll adjustment deduction. |
| A statutory deduction has no salary component to post through | Your country pack computes a contribution (UK National Insurance, US FICA, Canada CPP/EI, Saudi GOSI, India EPF, Australian Medicare levy, German RV/KV/PV/AV, French vieillesse/AGIRC-ARRCO/CSG, NZ ACC levy, Singapore CPF, Philippine SSS/PhilHealth/Pag-IBIG) but no active deduction component with its code exists, so nothing would be deducted and take-home would come out too high with no line explaining why. Create the component under Payroll → Salary Components and link it to the structures it applies to. |
| Employee(s) have no nationality recorded, and a contribution is levied on nationals only | Saudi GOSI comes out of Saudi nationals' pay and Singapore CPF out of Singapore citizens' pay; a foreign employee contributes nothing. With nationality blank, neither deducting nor skipping can be justified, so payroll deducts nothing for those employees and refuses approval. Set Nationality on each employee's profile, then reprocess. |
Warnings — shown with the findings but never block approval:
- Employees still pending activation will not be paid by this run — activate them first if they should be paid (see the Employees guide).
- More than one shift is flagged as the default.
- Employees with no active salary structure are skipped by the run entirely — not paid zero, but absent from the totals, which is easy to miss when reviewing.
- One or more employees lose over 60% of gross to deductions. The message notes when the bulk is an absence deduction, which usually means missing attendance rather than genuine absence.
A large deduction can be genuine — a mid-month joiner, unpaid leave, a loan recovery — so warnings never block; blocking them would train people to route around the check.
Who is checked. Employees pending activation are excluded from the per-employee checks — payroll never pays them, and they get their own warning instead. The attendance check only covers people this run will actually pay: joined by the end of the month, holding an active salary structure, and not on a Punch Not Required (attendance-exempt) shift — exempt staff never produce attendance rows by design, so they are not flagged. Per-person findings name up to 8 employees, then collapse to a count.
The same checks are available any time via the API (GET payroll/preflight?month&year)
so problems can be caught while the month is being set up.
7. The bank payment file
When a run is locked or disbursed, use Download Bank File on the run detail
page to generate the Standard Chartered Straight2Bank / iPayments salary CSV for
bulk upload. You choose the company bank account to pay from and can optionally set
a value date, city and purpose of payment. A preview lists who will be paid and who is
skipped (and why) before you download. See also /docs/payroll/bank-payment-file.
8. Salary slips
Screen: /admin/payroll/slips
Each processed entry produces a salary slip. From this page you can:
- View a slip, download its PDF, or email it to one employee.
- Select several and Download ZIP or Email All at once.
Slip layout is controlled by your slip template (/admin/payroll/slip-templates).
Acknowledgment flow
When you disburse a run with emails enabled, each employee gets an
acknowledgment-request email (no PDF) linking to their portal at /portal/salary.
After the employee confirms receipt there, the system emails the signed slip PDF
with an e-signature stamp and records the acknowledgment (with timestamp and IP) for
your records.
Provident Fund ledger
Screen: /admin/payroll/pf-ledger
If your components contribute to Provident Fund, this page shows each employee's
running PF balance. Click an employee to open their full ledger of contributions and
movements at /admin/payroll/pf-ledger/{employeeId}.
Importing historical salary
Screen: /admin/payroll/salary-history-import
To backfill past pay records for an employee (for example when migrating onto Operentra), download the CSV template, pick the employee, upload the filled file, preview the parsed rows and warnings, then import to commit them. Each import is tracked as a batch you can revert in one click if something looks wrong. A setting controls whether the Provident Fund column is treated as a real ongoing balance or a legacy cash refund.
Payroll settings
Screen: /admin/payroll/settings
Workspace-wide options that affect every run:
- Rounding method — round, floor or ceil.
- Rounding precision — number of decimal places.
- Pay day — the day of the month salaries are due.
- Allow skip attendance deductions — whether the "pay in full" option shows on the Process Payroll screen.