Payroll โ Pay calculations (tax, super, leave)¶
Manual test plan for the correctness of the numbers: PAYG tax withholding, superannuation, leave accrual, and termination/ETP tax. Read How testing works first.
Everything here is ๐ด money/compliance-critical โ a wrong figure misreports withholding or super to the ATO. Each case is: set an employee up a certain way, run a Draft pay run, and check the calculated Tax and Super on the employee's pay-run detail before finalising.
How to know the expected number
For PAYG, verify against the ATO's public Tax withheld calculator (ato.gov.au) using the same gross, category, scale and pay frequency. For super, the expected figure is gross-subject-to-super ร SG rate. Where an expected value needs the ATO tax tables or a specific scenario setup, the case is marked ๐ง Needs developer setup โ ask a developer to confirm the expected value.
A. PAYG tax withholding¶
A1 โ Tax-free threshold (Scale 2) vs no-threshold (Scale 1) ๐ง Needs developer setup¶
Steps 1. Create two identical employees on the same gross weekly wage โ one claiming the tax-free threshold (Scale 2), one not (Scale 1). 2. Run a weekly pay for both.
โ Pass if the no-threshold employee has more tax withheld, and both match the ATO calculator for that gross/scale/weekly.
โ Fail if either figure differs from the ATO calculator by more than rounding โ ๐ด Blocker.
A2 โ No-TFN withholding ๐ง Needs developer setup¶
Steps 1. Set an employee with no TFN and no exemption; run a pay.
โ Pass if withholding is at the no-TFN rate (47% resident / 45% foreign) on the gross.
โ Fail if a no-TFN employee is taxed at normal rates โ ๐ด Blocker.
A3 โ Pay frequency scaling ๐ง Needs developer setup¶
Steps 1. Same annual-equivalent pay, run as weekly, fortnightly, and monthly.
โ Pass if each period's withholding matches the ATO calculator for that frequency (the app converts to a weekly equivalent and back).
โ Fail if a frequency is materially off โ ๐ด Blocker.
A4 โ Tax offset reduces withholding ๐ง Needs developer setup¶
Steps 1. Set a tax offset amount on an eligible employee (scale T/D or Medicare exemption F/H); run a pay.
โ Pass if withholding is reduced by the pro-rated offset; an offset on an ineligible scale is ignored.
โ Fail if the offset is applied on an ineligible scale, or not applied when eligible โ ๐ด Blocker.
A5 โ Medicare levy surcharge / reduction ๐ง Needs developer setup¶
Steps 1. Set a Medicare levy surcharge tier, then a Medicare levy reduction (with dependants), on eligible employees; run pays.
โ Pass if the surcharge increases and the reduction decreases withholding for eligible categories/scales only, matching expected values.
โ Fail if surcharge/reduction applies to ineligible employees or the amount is wrong โ ๐ด Blocker.
A6 โ Senior/Pensioner with STSL ๐ง Needs developer setup¶
Steps 1. Set a Seniors/Pensioner employee with an STSL (study loan); run a pay.
โ Pass if the STSL supplement is added on top of the senior withholding.
โ Fail if STSL isn't added, or is added when there's no loan โ ๐ด Blocker.
A7 โ Unknown/edge tax combination fails safe ๐ง Needs developer setup¶
Steps 1. Ask a developer to configure an unusual/unmapped tax category + scale combination; run a pay.
โ Pass if withholding falls back to a safe high rate (47%) โ never $0.
โ Fail if an unmapped combination results in $0 tax โ ๐ด Blocker (silent under-withholding).
B. Working Holiday Maker (WHM) tax¶
B1 โ Registered WHM employer rate ๐ง Needs developer setup¶
Steps 1. With Registered WHM employer on (Payroll Settings) and an employee on income type WHM, run a pay under the first income tier.
โ Pass if withholding uses the WHM schedule (15% in the first tier), stepping up by year-to-date tiers.
โ Fail if the WHM rate/tiers are wrong โ ๐ด Blocker.
B2 โ Unregistered WHM employer ๐ง Needs developer setup¶
Steps 1. With Registered WHM employer OFF, run a WHM employee's pay.
โ Pass if withholding uses foreign-resident rates (not 15%).
โ Fail if an unregistered employer withholds at 15% โ ๐ด Blocker.
B3 โ WHM with no TFN ๐ง Needs developer setup¶
Steps 1. WHM employee with no TFN; run a pay.
โ Pass if withholding is at the flat 45%.
โ Fail if it's not 45% โ ๐ด Blocker.
C. Superannuation guarantee¶
C1 โ Standard SG on ordinary earnings¶
Steps 1. Run a pay for an employee on the default SG rate (12%).
โ Pass if super = gross-subject-to-super ร 12% (rounded), showing on the pay-run employee detail.
โ Fail if the super figure is wrong โ ๐ด Blocker.
C2 โ Manual super override wins¶
Steps 1. Set a manual super value on the pay-run employee.
โ Pass if the manual value is used instead of the calculated one (a manual value of 0 is treated as "no override").
โ Fail if the override is ignored โ ๐ด Blocker.
C3 โ Under-18 under 30 hours is exempt ๐ง Needs developer setup¶
Steps 1. Set an employee under 18 working fewer than 30 hours/week; run a pay. Then bump to 30+ hours.
โ Pass if super is 0 under 30 hours, and payable at 30+ hours.
โ Fail if super is charged under-18 & under-30h, or skipped at 30+h โ ๐ด Blocker.
C4 โ Negative super clamps to zero ๐ง Needs developer setup¶
Steps 1. Create a reversal/adjustment producing a negative super base; run the pay.
โ Pass if super is 0 (never negative).
โ Fail if a negative super is produced โ ๐ด Blocker.
C5 โ Maximum contribution base (known gap) ๐ง Needs developer setup¶
Steps 1. Run a pay for a very high earner above the quarterly maximum super contribution base.
โ Pass if super is capped at the quarterly maximum. Known limitation: the maximum-contribution-base cap is currently not implemented โ super is charged on the full gross. Record the actual behaviour and flag it.
โ Fail if โ record as a ๐ด Blocker compliance gap (over-contribution for high earners) and confirm with the team whether it's accepted for this release.
C6 โ Leave loading is taxed and supered ๐ง Needs developer setup¶
Steps 1. Pay annual leave for an employee with leave loading enabled.
โ Pass if a loading line is auto-added (percentage of annual-leave gross) and it is included in both tax and super bases.
โ Fail if loading is missing or excluded from tax/super โ ๐ด Blocker.
D. Leave accrual¶
D1 โ Per-pay accrual¶
Steps 1. Run a weekly pay for an employee on PerPay accrual.
โ Pass if annual leave accrues entitlement รท 52 (fortnightly รท 26, monthly รท 12) and the balance updates.
โ Fail if the accrued amount is wrong โ ๐ด Blocker (leave liability).
D2 โ Per-hour-worked accrual¶
Steps 1. Employee on PerHourWorked with a set standard weekly hours; run a pay with recorded hours.
โ Pass if accrual = (entitlement รท (standard hours ร 52)) ร hours worked; a 0 standard-hours casual accrues nothing.
โ Fail if the accrual is wrong โ ๐ด Blocker.
D3 โ Taking leave reduces the balance¶
Steps 1. Pay an annual-leave pay item; check the balance.
โ Pass if the balance drops by the hours taken (cash-out and unused-leave-on-termination also reduce annual).
โ Fail if the balance doesn't reduce correctly โ ๐ด Blocker.
D4 โ Personal leave FY reset (annual does not reset) ๐ง Needs developer setup¶
Steps 1. On an employee with reset personal leave each FY on, run a pay in the new FY (crossing 1 July).
โ Pass if the personal leave balance resets at FY rollover but annual leave carries forward (Fair Work).
โ Fail if annual leave resets, or personal doesn't when configured โ ๐ด Blocker.
D5 โ Opening balance applied once¶
Steps 1. Set an opening balance; run several pays.
โ Pass if the opening balance is added once (first record), not every pay.
โ Fail if the opening balance is re-applied each pay โ ๐ด Blocker.
E. Termination & ETP¶
E1 โ Unused leave on termination โ marginal vs redundancy ๐ง Needs developer setup¶
Steps 1. Terminate with a normal reason and pay unused leave; then terminate another with Genuine Redundancy.
โ Pass if normal termination taxes unused leave at marginal rates (Lump Sum T) while redundancy uses the flat 32% method (Lump Sum R).
โ Fail if the wrong method/rate is used โ ๐ด Blocker.
E2 โ Genuine redundancy tax-free split ๐ง Needs developer setup¶
Steps 1. Pay a genuine redundancy amount with several completed years of service.
โ
Pass if the tax-free portion is base + per-year ร completed years (current FY figures), the remainder becomes an ETP, and an amount fully within the tax-free limit has no ETP tax.
โ Fail if the tax-free split is wrong โ ๐ด Blocker.
E3 โ ETP codes and caps ๐ง Needs developer setup¶
Steps 1. Pay ETPs under different ETP codes (e.g. R, O, D) with and without prior ETP amounts / other YTD income.
โ Pass if the ETP cap ($245k, reduced by prior ETP for the same termination) and whole-of-income cap ($180k, reduced by other YTD income for O/P) are applied; below-cap uses the concessional rate, above-cap the top rate; no-TFN uses the flat rate.
โ Fail if a cap or rate is wrong โ ๐ด Blocker.
E4 โ Missing date of birth on a termination ๐ง Needs developer setup¶
Steps 1. Terminate an employee with no date of birth and pay an ETP.
โ Pass if the behaviour is defined and documented (the system defaults DOB internally). Record the withholding and confirm it's the intended treatment.
โ Fail if a missing DOB produces an obviously wrong preservation-age treatment โ ๐ด Blocker.
F. Pay-period & rounding edge cases¶
F1 โ 53-week / 27-fortnight extra withholding ๐ง Needs developer setup¶
Steps 1. Ask a developer to set up a 53rd weekly (or 27th fortnightly) pay in a year; run it.
โ Pass if the additional withholding amount (per the ATO extra-pay-period table) is added for higher earners.
โ Fail if the extra withholding isn't applied โ ๐ด Blocker.
F2 โ Rounding direction¶
Steps 1. Compare a few calculated figures to hand-calculated values.
โ Pass if PAYG rounds to the nearest dollar (away from zero), super rounds to cents, and leave to hours โ no systematic drift.
โ Fail if figures are consistently rounded the wrong way โ ๐ Major.