Ledgr/Documentation/Payroll

Payroll

Watch the lesson: Run payroll and issue payslips (2:11).

South African payroll with the statutory maths built in — PAYE on the current brackets, UIF at the cap, SDL at 1%, and the EMP201 totals waiting at the end.

Plan.

Payroll is included from Professional upwards, and on Starter and Business as an add-on. The first 10 employees are included; above that it is banded in blocks of fifteen — see pricing. Payroll never stops because of a band: if you grow past the one you paid for, payslips still run and the difference is settled at renewal.

Add an employee

  1. Payroll → Employees → + Add employee
  2. Identity and statutory fields

    Full name, RSA ID, Start date, Email, Business phone and Tax number (the employee's SARS income tax reference). The tax number is what appears on the IRP5, so get it right up front.

  3. Pay

    Paid monthly, fortnightly or weekly, then Gross monthly (R) — the field names the period, so it reads Gross weekly (R) for somebody paid by the week — and any travel allowance, pension and medical aid as their own fields so each is treated correctly for PAYE. The pension and medical aid you enter here become the employee's deductions under Payroll → Deductions, so each fund is kept in one place and deducted once. Change them on either screen.

  4. Contributes to UIF

    Ticked for every new employee. Untick it only for somebody the Unemployment Insurance Contributions Act leaves out — for example, a person employed for fewer than 24 hours a month. Ledgr then deducts and pays no UIF for them on either side, reports nil UIF on their IRP5 and leaves them off the UI-19; SDL still applies. If you are not sure, check before the first run rather than correcting it on an EMP501.

How the tax is worked out

Ledgr uses the 2026/27 tables. You do not enter any of this — it is applied when the run is calculated:

ItemTreatment
PAYE7 brackets from 18% to 45%, applied to annual equivalent remuneration
Primary rebateR17 820 a year, deducted from the annual tax before it is spread over the months
Tax thresholdR99 000 under 65, R153 250 from 65, R171 300 from 75
UIF — employee1% of remuneration up to R17 712 a month, so at most R177.12 a month — nil for an employee who does not contribute
UIF — employerThe same again: 1% of remuneration up to R17 712, at most R177.12 a month
SDL1% of total remuneration, employer cost, where the payroll exceeds the threshold
Retirement (s11F)27.5% of the greater of remuneration or taxable income, capped at R430 000 a year

The Tax Tables tab inside the module shows every bracket, the rebates and the thresholds as Ledgr is applying them, so you can check a figure against SARS without leaving the screen.

A year Ledgr does not have is refused, not guessed.

Ledgr holds the tables for 2026/27 and the four years before it. Asking it to calculate for a year it does not carry produces a refusal rather than a figure worked out from the nearest year it does have — because too little withheld makes the employer personally liable under the Fourth Schedule, and a plausible wrong number is worse than no number.

Part-year employment

Someone who joins in September has not earned a year's salary, and taxing them as though they had over-withholds heavily. Ledgr annualises to find the rate, then pro-rates by the months actually worked — the Fourth Schedule treatment — so a new hire is withheld what they owe rather than being handed a large refund at assessment.

There is no cumulation across employers: each employer withholds on its own annual equivalent. If that produces the wrong answer for a particular employee, the remedies are a tax directive or a written request for a greater deduction. Never a smaller one.

Run a payroll period

  1. Payroll → Run Payroll

    The button at the top of the module. Choose whom it pays: staff paid monthly, fortnightly or weekly — each runs on its own, so weekly guards and monthly office staff are paid from the same business. It uses the period of that kind covering today, creating one if there is not one yet (the calendar month paid on the 25th, the week paid on the Friday, or the next fortnight), and asks for the pay date of a new one. It pulls in every employee on that frequency who is active in the period. SDL is still judged on the whole business. The confirmation names the period and the head count, and shows the gross, PAYE and net the run will produce. Those figures are worked out by the same calculation as the run itself, so they are what you will get; before a period exists, or without a connection, the confirmation says there are no figures yet rather than guessing.

  2. Add the variables

    Overtime, commission, bonuses, unpaid leave, once-off deductions — anything that is not the standard monthly package.

  3. Calculate and review

    Ledgr produces a payslip per employee. Check gross, PAYE, UIF, other deductions and net. At this point nothing is final. Adjust on a payslip changes this period's overtime, commission, bonus and allowances; a pension or medical aid figure comes from the employee's deductions, so change it there and run the period again.

  4. Approve

    On Pay History, Approve the run. Approving locks the payslips, puts them into the EMP201 and posts the payroll journal to the ledger. Do this only when you are satisfied.

  5. Distribute payslips

    Download as PDF, or send by email or WhatsApp from the period screen.

Reopening an approved run

Payrolls get corrected: a bonus was missed, a leaver's final pay was wrong. Reopen on Pay History takes an approved or paid run back to draft so its payslips can be edited and the run calculated again, then approved afresh. The payroll journals are not deleted — each is reversed by a posting of its own, so the original and its reversal both stay on the ledger and net to nothing. Reopening is refused if an accounting period those journals sit in has been closed; correct it in the next run instead. Approving and reopening both need the approve permission on Payroll.

Approve before you file.

EMP201 reads approved runs. If a run is still in draft, its PAYE, UIF and SDL are not in the declaration — which is how a return ends up showing zero when you know you paid people. Check the run's status first if the numbers look wrong in the SARS centre.

Leave

Leave balances follow the BCEA:

  • Annual — 15 working days per year, accrued monthly
  • Sick — 30 days per three-year cycle
  • Family responsibility — 3 days per year

Those are the minimums. To grant more, change them under Payroll → Settings → Leave you grant. A change reaches every current employee from their next payroll run, and the card tells you how many people that is before you save. Balances show what has been earned so far, with fractions of a day: one month on 15 days a year is 1.25 days.

Employees request, a manager approves, and approved leave feeds the payroll run. Unpaid leave reduces the gross for that month, which changes the PAYE with it.

EMP201, EMP501 and IRP5

DocumentWhenWhat it contains
EMP201Monthly, by the 7thPAYE, UIF and SDL for the month, with the per-employee breakdown behind it
EMP501Twice a yearReconciliation of what was declared against what was paid
IRP5AnnuallyA tax certificate per employee for the year of assessment

All three are produced from approved runs. On Professional and above they appear in the SARS returns centre alongside your other returns. The Payroll add-on does not include the returns centre, so on Starter or Business with the add-on use Payroll → SARS: it shows the month's EMP201 figures from your approved payslips and prepares the e@syFile certificate file behind the IRP5s and the EMP501.

Employee self-service

At five employees the owner emails payslips. At fifty it is a job, and at two hundred it is somebody's week. Each employee can have their own link to a page showing their payslips, their leave balances and their own details — without occupying a Ledgr user seat, because charging per user for people who only ever read their own payslip would be exactly the metering the price list promises not to do.

  1. Payroll → Employees → a person → Self-service link

    Generates a link valid for 180 days. Send it however you already reach them — email or WhatsApp. It opens in the browser on any phone, with no app to install and no password. When it lapses, generate a new one from the same place.

  2. They see only what is theirs

    Approved payslips (a draft is a working figure you have not signed off, so it stays hidden), leave balances, leave history, and their own details with the bank account masked to its last four digits.

  3. They can request leave

    It arrives in the same approval queue you already use. Nothing is granted by asking.

Banking details are a request, never an edit.

Payroll diversion — getting a salary redirected to a different account — is the most common payroll fraud there is, and it works precisely because the change looks routine. So an employee submits a change and a payroll administrator with approve permission reviews it, seeing the old and the new account side by side. The approval is written to the audit log at warning severity with both values, which is what an enquiry afterwards comes looking for. The employee saves you some typing; they do not get to move the money.

Salary, tax number and start date cannot be requested at all — those are terms of employment, not corrections.

A link stops working the day an employee's employment ends. That is checked against their end date on every request rather than kept in a list somebody has to remember to update. Anyone holding the link can open the page, though, so it should be treated like a password — if one is shared by mistake, generating a new one is the fix.

Statutory returns beyond SARS

Three things every South African employer owes somebody, and none of them is a SARS return. They are on the Statutory tab.

  • The salary payment file. A CSV of who gets paid what, ready for your bank's bulk payment upload, produced from an approved run — which is the point: the file cannot disagree with the payslips, because it is made from them. Until a run is approved there is nothing here to download.
  • UI-19. The monthly employee declaration the Department of Employment and Labour asks for. If it will not validate, Ledgr says which employee is short of which field rather than producing a file the UIF portal rejects. An employee marked as not contributing to UIF is not declared, and the return names them so a deliberate exclusion cannot be mistaken for somebody missing.
  • The COIDA Return of Earnings. The annual return to the Compensation Fund, with the maximum assessable earnings for the year applied per employee — that ceiling is a field you set, because it is announced each year and applying last year's would misstate the assessment.

Change requests from employees

Anything an employee submits from their self-service link — a new address, new contact details, new banking details — waits on the Requests tab. Nothing takes effect until somebody approves it, and the employee is not told which way it went until you decide.

Confirm a banking change on a different channel before approving it.

A change of bank account moves where a salary is paid, which makes it the single request an attacker sends. Ring the employee on a number you already had — not one that arrived with the request — before you approve it. Ledgr shows you the change; it cannot tell you who typed it.

Medical aid, provident fund and garnishees

Most of what comes off a South African payslip does not go to SARS. It goes to a medical aid, a provident fund, a union, or — when a court has ordered it — a creditor. Ledgr records who each of those is, what comes off whose pay, and what to pay across at the end of the month.

  1. Add the beneficiary

    Payroll → Deductions → Add beneficiary: the scheme or fund, its banking details, your account number with them, and where to send the monthly schedule. The kind you pick is not just a label — a retirement contribution reduces taxable income and a medical aid earns the SARS tax credit, so it changes the PAYE on every payslip that uses it.

  2. Add the deduction

    Per employee: a fixed amount, or a percentage of basic or gross. Basic includes any earning you have coded as salary (3601), such as ordinary shift pay, so a fund at 7.5% of basic is taken from it even when the employee has no monthly salary. Enter the employee's share and the employer's separately. The employer's half is a company cost — it is remitted with the employee's contribution and never deducted from their salary. Putting the combined figure in the employee field is the classic mistake, and it leaves the payslip short by exactly the employer's half.

  3. Capture each employee's membership number

    Without it the scheme cannot allocate the money, and a member's cover can lapse even though the payment arrived. It appears on the remittance schedule beside their name.

  4. Run the payroll as usual

    Deductions apply automatically and appear on the payslip by name, so an employee can see what came off and where it went.

  5. Pay the schedules

    Payroll → Deductions lists what to pay each beneficiary for the period, with the banking details, the total, and every member it covers. It is built from what the payslips actually deducted, not from the standing instructions.

Garnishee and maintenance orders

An emoluments attachment order is for a fixed total, so Ledgr asks for it and then stops when it is reached — trimming the last instalment to whatever is left. A R3 200 debt at R1 500 a month deducts R1 500, R1 500, then R200, and nothing after that. Continuing past the debt would be withholding a wage the employer had no right to, so it is prevented rather than left to whoever is watching the spreadsheet.

The order reference is kept on the deduction and the payment history on each payslip, which together are what prove the order was served.

Where several deductions compete for a short month, court orders take precedence, then medical and retirement, then voluntary things like savings. Nothing is ever deducted past zero net pay — an employer may not pay someone less than nothing, and Ledgr reports the shortfall instead of quietly creating one.

Cost to company

Packages are usually negotiated as a total cost to the employer, not as a basic salary. Payroll → Deductions → Cost to company works the basic back out for you.

It is not a subtraction: UIF and SDL are percentages of the very salary being solved for, and UIF is charged only on the first R17 712 of a month's remuneration, so the answer settles rather than divides out. Applying it records that the package is a cost to company, and from then on the basic follows the package: add, change or end an employer contribution for that person and their basic is worked out again from the same total, with the same SDL choice. Saving the deduction says how far the basic moved, and the change is on the audit trail.

Employment Tax Incentive

ETI reduces the PAYE you pay over for qualifying young employees — it is a genuine discount on your monthly EMP201, and a great many small employers who qualify never claim it because working it out by hand is fiddly.

Mark the employees who qualify and Ledgr computes the claim each month, reduces the EMP201 accordingly, and keeps the schedule behind it. The claim runs for a limited number of months per employee and Ledgr stops when that is used up, rather than carrying on and creating an over-claim you have to repay.

Fringe benefits

A company car, a housing subsidy, an employer's medical contribution or a low-interest loan are not cash, but SARS taxes them. Capture the benefit against the employee and Ledgr adds it to taxable income for the PAYE calculation and shows it separately on both the payslip and the IRP5 — which is where it has to appear separately, not folded into salary.

"Why is this employee's PAYE so high?"

This is the most common question about a Ledgr payslip, the answer is almost always the same, and it is worth reading before you change anything — because the figure is usually correct and the obvious fix is the one that causes real damage.

Ledgr withholds cumulatively, the way the Fourth Schedule intends. It works out the employee's liability for the whole tax year, subtracts what has already been withheld from them this year, and recovers the rest over the periods that remain. So where earlier months of the tax year have no tax recorded against them in Ledgr — because you started using Ledgr in, say, July — the whole year's tax comes out of the months left, and each payslip looks a third too high.

A worked example on the 2026/27 tables: a director on R210 000 a month has an annual PAYE liability of about R937 149. Divided by twelve that is R78 096 a month. Start in June with nine months left and each of those payslips carries about R104 128 — which multiplies back to the same year's tax. Nothing is wrong.

Ledgr says so on the payslip rather than leaving you to work it out. The notice names the catch-up amount, the period's own share, and the fact that the total is right and the employee will not owe tax on assessment. The same line appears on the run summary and on the payslip the employee receives, so you and they are reading the same explanation.

Do not override the PAYE to make it look right.

Under paragraph 5 of the Fourth Schedule an employer that under-withholds is personally liable for the shortfall — SARS collects it from the business, not from the employee. Overriding a correct catch-up figure is how a business ends up paying an employee's tax. If the figure genuinely is wrong, the cause is missing year-to-date figures, and the fix is below.

If tax WAS withheld before you moved to Ledgr, the catch-up should not be there.

That is exactly what Payroll → Take-on is for. Enter each employee's year-to-date earnings and the PAYE, UIF and SDL already paid, and the catch-up disappears on the next run — because Ledgr then knows those earlier months were taxed. Do this before the first live run if you can; it is the single most valuable ten minutes in a mid-year cutover.

Two smaller causes of the same symptom, for completeness:

  • A bonus, commission or backpay in the month. Cumulative withholding puts the tax on the month the money is paid, so one large month is taxed at the rate the year's total earns. Correct, and it evens out.
  • A few cents of catch-up. Ordinary, and Ledgr says nothing about it — a notice below a rand would appear nearly every month and teach people to ignore the one that matters.

Bringing payroll across mid-year

If you switch to Ledgr partway through a tax year, the year-to-date figures from your old system have to come with you. Without them Ledgr calculates as though everyone started in March, the annualisation is wrong, and February's IRP5s do not reconcile.

  1. Payroll → Take-on

    Per employee: earnings, deductions and PAYE, UIF and SDL already paid this tax year. Download the template first rather than building your own — the column headings are what Ledgr matches against.

  2. Ledgr checks it is plausible

    Tax that could not have arisen from those earnings is queried rather than accepted, since an error here is invisible until the IRP5 is rejected eleven months later.

  3. Payroll → Deductions → Import

    Take-on carries only totals, so a standing garnishee order (Emoluments Attachment Order), union fee, staff loan repayment, medical aid or provident/pension fund contribution has nowhere to live in those figures — it is an ongoing instruction, not a number. Its own template takes one row per employee per deduction: the beneficiary (the fund, the union or the lender), what kind it is, the calculation, and — for a garnishee order or a loan — the balance still owing, so it stops on its own once that debt is settled. A beneficiary Ledgr has not seen before is created as it goes, and you see the per-row match before anything is written. Capture your employees first — both this and the take-on above attach to an employee record rather than creating one.

  4. It shows on the dashboard checklist

    The setup checklist only marks payroll complete once every live employee has opening figures — so a person missed in the take-on is visible now rather than at year end.

See switching to Ledgr for the rest of the cutover. Mid-February is the easy month to move; mid-October is the one where this screen earns its place.

Common problems

What you seeWhat to do
An employee's PAYE looks far too high See "Why is this employee's PAYE so high?" above. The short answer is that it is almost certainly correct, and overriding it is what causes the problem.
A new hire's PAYE looks too high Check the periods-worked figure on the run. A part-year employee's tax is worked out by annualising to find the rate and then pro-rating by the periods actually worked — never by dividing by the periods remaining, which over-withholds heavily.
An unsupported tax year is refused Deliberate: a year Ledgr has no tables for is refused rather than served from the nearest one. Guessing a bracket is how an employer becomes personally liable for under-withholding.
The EMP201 is lower than the payslips Draft payslips are excluded, and the return says so as a warning. Approve the run on Pay History.
e@syFile rejects the whole import One bad record fails the lot, by line number. Ledgr checks the set before it emits a file, and the commonest cause is two employee records sharing one identity number — which is refused when you capture it. See why a return will not download.
An employee has no identity number Legitimate for somebody on a passport, and a blank is never treated as a clash with another blank.
Leave balances look wrong They follow the BCEA: annual leave accrues, sick leave is a 30-day entitlement over a three-year cycle rather than per year, and family responsibility leave is three days a year. A sick-leave balance therefore does not reset every February.
Payroll cost does not split by branch The six employer-cost debits split by the employee's cost centre; the statutory and third-party credits stay pooled. Splitting PAYE and net pay by branch would read as more detail while meaning nothing, and the EMP201 is filed on one number regardless. Set the cost centre on the employee record, not the free-text department.
A payslip will not send Either email sending or the WhatsApp integration is not available, and the failure names which. Contact support if it persists.
An employee's garnishee order, union fee or loan did not come across with take-on Take-on carries year-to-date totals only — a recurring deduction is a standing instruction, not a total, so it has its own import. See bringing payroll across mid-year above.
The travel or mileage rate looks out of date It is keyed by year of assessment and resolved from the trip's date, so a prior-year trip logged late is paid at that year's rate. That is correct rather than stale.
A figure changed without an app update Statutory figures — brackets, rebates, UIF, SDL, the VAT rate, ETI bands — can be updated between app releases, and your app picks them up. That is why a rate can move the day SARS changes it.