Overview
The calculator implements the SARS progressive personal income tax system for the 2026/2027 tax year. Each slice of income is taxed at the marginal rate for its bracket; only the portion within a bracket is taxed at that bracket's rate. Age-based rebates and thresholds reduce tax for qualifying individuals.
Calculation Sequence
- Input Normalisation: If monthly provided, derive annual (×12).
- Threshold Gate: If annual ≤ age threshold → tax = 0.
- Progressive Pass: Sum marginal tax for each bracket portion.
- Rebate Application: Subtract age-based rebate; floor at 0.
- Monthly Figures: Annual tax ÷ 12 → monthly PAYE.
- UIF: 1% of monthly income capped at R177.12.
- Net Monthly: Gross monthly − PAYE − UIF.
- Effective Rate: Annual tax ÷ annual income.
Ordering matters: rebates apply after progressive accumulation, not per bracket.
Progressive Algorithm
For each tax bracket, only the segment of income inside that bracket's bounds is taxed at its marginal rate. This prevents over-taxing earlier income.
// Pseudocode (simplified)
function calculateAnnualTax(annualIncome, ageGroup) {
if (annualIncome <= THRESHOLDS[ageGroup]) return 0;
let tax = 0;
for (const bracket of TAX_BRACKETS) {
if (annualIncome > bracket.min) {
const taxable = Math.min(annualIncome, bracket.max) - bracket.min;
tax += taxable * bracket.rate;
}
}
tax -= REBATES[ageGroup];
return Math.max(0, tax);
}
Bracket iteration is linear (O(n)) with n = number of brackets (constant for a tax year).
Worked Example: R45,000 Monthly (R540,000 Annual)
Income spans four brackets. Table shows the taxable slice and tax per slice before the age rebate.
| # | Range | Rate | Taxable | Tax |
|---|---|---|---|---|
| 1 | R0–245,100 | 18% | R245,100 | R44,118 |
| 2 | R245,101–383,100 | 26% | R138,000 | R35,880 |
| 3 | R383,101–530,200 | 31% | R147,100 | R45,601 |
| 4 | R530,201–540,000 | 36% | R9,800 | R3,528 |
| Total Before Rebate | R129,127 | |||
| Minus Rebate (Under 65) | −R17,820 | |||
| Final Annual Tax | R111,307 | |||
Age-Based Rebates & Thresholds
Rebates reduce tax payable after progressive calculation; thresholds exclude lower earners from tax entirely.
Tax Rebates (Annual)
- Under 65: R17,820
- 65–74: R27,585 (primary + R9,765)
- 75+: R30,834 (primary + R9,765 + R3,249)
Tax Thresholds (Annual)
- Under 65: R99,000
- 65–74: R153,250
- 75+: R171,300
UIF Calculation
The Unemployment Insurance Fund (employee portion) is:
UIF = min(grossMonthly × 0.01, R177.12)
Employer matches this amount (not reflected in the calculator output).
Effective Tax Rate
Shows actual burden relative to gross annual income—not the marginal rate of the highest bracket reached.
Effective Rate = (Annual Tax ÷ Annual Income) × 100
Because earlier portions are taxed at lower rates (and rebates subtract a fixed value), the effective rate is always lower than the top marginal rate for that income.
Mathematical Precision & Rounding
- Calculation Precision: Full IEEE 754 double precision.
- Display: Rounded to 2 decimals for currency readability.
- Bracket Bounds: Lower bound inclusive; upper bound exclusive.
- Negative Guard: Post-rebate tax floored at 0.
Limitations & Scope
- No provisional tax handling.
- No deductions (retirement, medical credits) yet.
- UIF shows employee portion only.
- Outputs are indicative; consult SARS for formal assessments.
Data Sources & Verification
All brackets, rebates and thresholds sourced from official SARS 2026/2027 publications. Internal verification uses scripted test cases and a detailed bracket breakdown harness (see repository scripts) to confirm alignment with the progressive formula.
Last reviewed 2026-06-13.