The Problem
Every payroll system must answer one fundamental question before it can calculate anything: how does this country's tax model work? The answer shapes everything downstream — how income is annualized, how deductions are sequenced, how mid-year changes are handled, and how the system reconciles monthly withholding against annual liability.
Progressive tax systems — where higher income is taxed at higher rates through a series of brackets — are the most common model in Europe. But "progressive" covers an enormous range of implementations. Luxembourg uses 23 brackets with rates from 0% to 42%. Germany uses a polynomial formula (the PAP) that produces a smooth curve rather than discrete steps. The UK uses cumulative PAYE with separate band structures for England, Scotland, and Wales. Each of these is "progressive," but each requires fundamentally different calculation logic.
The complexity multiplies when progressive systems interact with tax credits. The Netherlands grants an arbeidskorting (employment tax credit) that phases out above a threshold. This phase-out creates effective marginal tax rates above the statutory maximum. An employee earning EUR 1 more can lose EUR 0.06 of credit and pay EUR 0.4950 in statutory tax — an effective marginal rate of 55.5% in a country where the top statutory rate is 49.50%. The payroll system must model this correctly, or the monthly withholding will systematically diverge from the annual liability.
The silent failure mode: A missing bracket in a progressive tariff lookup doesn't throw an error — it shifts all income above that bracket into the next available rate. In Luxembourg's 23-bracket barème, omitting the 9% bracket (EUR 13,230 to EUR 15,432) means that income in that range is taxed at 11% instead. For a single employee earning EUR 60,000/year, the annual over-withholding is approximately EUR 44. Multiply by 500 employees and the error is EUR 22,000/year — invisible in individual payslips, obvious in aggregate.
Mixed systems add another dimension. Spain's Régimen de Impatriados (Beckham Law, Art. 93 LIRPF) allows qualifying expatriates to opt for a flat 24% rate on income up to EUR 600,000 and 47% above that — while regular employees are subject to the standard IRPF progressive tariff with rates from 19% to 47%. The payroll system must support both paths in parallel, for employees on the same payroll, in the same company, in the same period.
Flat tax systems appear simpler but create their own challenges. A true flat tax (one rate, no brackets) requires no annualization — but no European country actually implements a pure flat tax for employment income. Every "flat" system has exemptions, deductions, or credits that introduce progressivity. The distinction matters for payroll architecture: a system designed around flat-rate assumptions will struggle when the "flat" rate turns out to have hidden bracket behavior.
How It Works
Understanding the tax model of each country is not academic — it determines the calculation architecture. Here's how the major models work in practice.
Luxembourg: 23-bracket barème
Luxembourg's income tax uses a barème (tariff schedule) published annually by the Administration des contributions directes (ACD). The 2026 barème has 23 brackets, starting at 0% for income up to EUR 12,438 and reaching 42% for income above EUR 220,788. Each bracket specifies a range and a marginal rate; the tax is the sum of the marginal tax for each bracket the income passes through.
For a monthly payroll, the annual barème is applied to annualized monthly income (monthly gross × 12), the annual tax is computed, and then divided by 12 to produce the monthly withholding. Tax class (1, 1a, 2) determines which barème variant applies and which deductions are available.
| Bracket | From (EUR) | To (EUR) | Rate |
|---|---|---|---|
| 1 | 0 | 12,438 | 0% |
| 2 | 12,438 | 14,508 | 8% |
| 3 | 14,508 | 16,578 | 9% |
| 4 | 16,578 | 18,648 | 10% |
| … | … | … | … |
| 22 | 220,788 | — | 42% |
The barème is a progressive lookup — the engine must distribute the taxable income across all brackets and sum the marginal tax for each. This is fundamentally different from a threshold lookup (which returns a single rate for the matching bracket). Using the wrong lookup type produces wildly incorrect results: a threshold lookup on EUR 50,000 would return the rate for the single matching bracket (e.g., 30%), while a progressive lookup correctly distributes across all lower brackets first.
United States: Federal + state + local stacking
The US tax model is progressive at every level, but the levels stack. Federal income tax (FIT) uses 7 brackets (10% to 37%) with bracket widths that depend on filing status (Single, Married Filing Jointly, Head of Household, etc.). On top of FIT, most states impose their own income tax — some progressive (California: 9 brackets, 1% to 13.3%), some flat (Pennsylvania: 3.07%), some zero (Texas, Florida).
Several cities and counties add local taxes: New York City (3.078% to 3.876%), Philadelphia (3.75%), and dozens of Ohio municipalities. The payroll system must determine which state(s) and locality(ies) apply based on the employee's work location and residence, then calculate each layer independently.
The stacking creates a multiplicative complexity problem. An employee working in New York City faces:
- Federal income tax: 7 brackets, 10% to 37%
- New York State income tax: 9 brackets, 4% to 10.9%
- New York City income tax: 4 brackets, 3.078% to 3.876%
- Social Security: 6.2% up to the wage base (EUR 176,100 in 2026)
- Medicare: 1.45% + 0.9% Additional Medicare above EUR 200,000
The top combined marginal rate for a high-earning NYC employee exceeds 52%. Each layer uses different brackets, different filing-status adjustments, and different annualization rules. Federal uses the IRS Publication 15-T percentage method; New York State has its own withholding tables; NYC uses yet another formula.
Germany: PAP polynomial algorithm
Germany does not use a traditional bracket table. The Programmablaufplan (PAP), published annually by the Federal Ministry of Finance (BMF), defines a polynomial formula that produces a smooth tax curve. The 2026 PAP includes the Vorsorgepauschale (social insurance deduction), the Grundfreibetrag (basic allowance of EUR 12,336), and the Solidaritätszuschlag (solidarity surcharge at 5.5% of LSt, with a mitigation zone).
The PAP is not a lookup table — it's an algorithm. The tax amount for a given annual income is computed through a series of conditional formulas that produce a continuous curve. This means there are no discrete bracket boundaries where the marginal rate jumps. Instead, the effective rate increases smoothly from 14% (at the Grundfreibetrag) to 42% (above EUR 68,480) and 45% (above EUR 277,826, the Reichensteuersatz).
For payroll, the PAP is run twice per period: once for regular income (laufender Arbeitslohn) and once with the addition of any one-time payments (sonstige Bezüge). The difference between the two runs gives the tax on the one-time payment. This dual-run approach is unique to Germany and has no equivalent in bracket-based systems.
Netherlands: 3 Schijven + credit phase-outs
The Dutch loonbelasting (wage tax) uses three brackets (schijven) in 2026:
| Schijf | From (EUR) | To (EUR) | Rate |
|---|---|---|---|
| 1 | 0 | 38,441 | 35.82% |
| 2 | 38,441 | 76,817 | 37.48% |
| 3 | 76,817 | — | 49.50% |
Three brackets appear simple compared to Luxembourg's 23. But the Netherlands compensates with a system of tax credits (heffingskortingen) that introduce hidden complexity. The algemene heffingskorting (general tax credit) and arbeidskorting (employment tax credit) are not flat amounts — they phase out as income increases.
The arbeidskorting in 2026 follows a four-segment schedule: it increases with income up to approximately EUR 39,958 (maximum credit of approximately EUR 5,599), then decreases at 6.51% for each euro above that threshold, reaching zero at approximately EUR 124,935. This phase-out means that in the phase-out range, the effective marginal rate is the statutory rate plus 6.51%:
- Income in Schijf 2 (37.48%) + arbeidskorting phase-out (6.51%) = 43.99% effective marginal rate
- Income in Schijf 3 (49.50%) + arbeidskorting phase-out (6.51%) = 56.01% effective marginal rate
The 56.01% effective rate exceeds the top statutory rate of 49.50% by over 6 percentage points. A payroll system that applies only the bracket rates and adds the credit as a flat deduction will under-withhold for employees in the phase-out range.
United Kingdom: Cumulative PAYE with regional variants
The UK uses a cumulative PAYE system. Instead of calculating tax per period in isolation, the system tracks cumulative pay and cumulative tax year-to-date. Each period, it calculates the tax due on cumulative pay and subtracts the tax already withheld. This self-correcting mechanism means that mid-year salary changes, bonuses, and absences are automatically smoothed — the system converges toward the correct annual liability without requiring explicit retro corrections.
Since devolution, Scotland and Wales have their own income tax rates for non-savings, non-dividend income. England and Northern Ireland share the same bands:
| Band | England/NI | Scotland |
|---|---|---|
| Personal Allowance | 0% up to £12,570 | 0% up to £12,570 |
| Starter | — | 19% (£12,571 – £14,876) |
| Basic / Scottish Basic | 20% (£12,571 – £50,270) | 20% (£14,877 – £26,561) |
| Intermediate | — | 21% (£26,562 – £43,662) |
| Higher / Scottish Higher | 40% (£50,271 – £125,140) | 42% (£43,663 – £75,000) |
| Advanced | — | 45% (£75,001 – £125,140) |
| Additional / Top | 45% (above £125,140) | 48% (above £125,140) |
Scotland has 6 bands versus England's 3. The payroll system determines which schedule applies based on the employee's tax code prefix: S for Scotland, C for Wales, no prefix for England/NI. A K code indicates negative allowance (the employee owes tax on benefits in kind). The PAYE system must handle all these variants within the same cumulative framework.
Spain: IRPF tramos + Régimen de Impatriados
Spain's standard IRPF uses a split structure: the escala estatal (state scale) and the escala autonómica (regional scale) are applied independently and summed. The combined rates for 2026 range from 19% (first EUR 12,450) to 47% (above EUR 300,000). The regional component varies by autonomous community — Catalonia and Andalusia have different regional scales.
The Régimen de Impatriados (Art. 93 LIRPF, commonly called the Beckham Law) creates a parallel tax path. Qualifying expatriates pay a flat 24% on employment income up to EUR 600,000 and 47% on the excess. No progressive brackets, no personal deductions, no regional scale. The payroll system must determine which regime applies per employee and route the calculation accordingly.
Belgium: BV Schalen + Werkbonus
Belgian bedrijfsvoorheffing (BV, payroll tax) is computed from tariff scales (schalen) published in Bijlage III by the FOD Financiën. The scales are not simple bracket tables — they incorporate the employee's family situation (single/married, number of dependents) directly into the rate table. The same gross income produces different BV amounts for a single employee versus a married employee with two children.
The werkbonus (employment bonus) reduces employee social security contributions for low-wage workers. For employees earning below approximately EUR 2,970/month, a portion of the RSZ employee contribution (13.07%) is refunded. The werkbonus phases out linearly above a threshold, creating a marginal rate effect similar to the Dutch arbeidskorting. The BV calculation must account for the werkbonus reduction in the net-to-gross chain.
Portugal: IRS withholding with bracket smoothing
Portuguese IRS (income tax) withholding uses tables published by Despacho that map monthly income ranges to withholding percentages. These tables effectively produce a stepped approximation of the progressive annual tariff. The annual IRS tariff has 9 brackets (from 13.25% to 48%), but the monthly withholding tables are pre-computed to avoid requiring the employer to annualize and de-annualize each month.
The smoothing introduces rounding: the monthly withholding percentage is a discrete value (e.g., 22.5%, 25.0%) that approximates the true progressive liability. This means that the sum of 12 months of withholding may not exactly match the annual tax due — the employee reconciles the difference in the annual tax return (declaração de IRS).
Where It Gets Tricky
The individual models above are well-documented. The real payroll failures happen at the edges — where the model breaks down, where assumptions don't hold, or where a data error has outsized consequences.
Missing bracket: the silent catastrophe (Luxembourg)
Luxembourg's 23-bracket barème is stored as a progressive lookup. Each bracket is a row in a data table: rangeValue (lower bound), value (marginal rate). If a bracket is missing — say the 9% row (EUR 14,508 to EUR 16,578) is omitted from the 2026 data — the progressive lookup distributes income directly from the 8% bracket to the 10% bracket.
Income between EUR 14,508 and EUR 16,578 is now taxed at 10% instead of 9%. The over-withholding per employee is:
(16,578 − 14,508) × (10% − 9%) = EUR 2,070 × 1% = EUR 20.70/year
For a single employee, this is invisible. For a 500-employee payroll, it's EUR 10,350/year. The error doesn't trigger any validation failure — the progressive lookup produces a valid number. The number is simply wrong. The only way to catch this is a systematic completeness check against the official ACD publication: every bracket must be present, in order, with the correct rate.
The 2026 audit uncovered exactly this pattern. Two brackets were missing from a preliminary data regulation, carried forward from a prior year's template. The per-employee impact was small; the aggregate impact across a multi-entity payroll would have been significant. This is why data regulation compliance requires online verification against official gazettes — integration tests alone cannot catch missing data.
Credit phase-out: the hidden marginal rate (Netherlands)
The Dutch arbeidskorting phase-out is not just a calculation detail — it's a tax policy feature that payroll systems frequently misimplement. The phase-out rate of 6.51% applies per euro of income above the phase-out threshold. This means:
- An employee earning EUR 50,000 has a lower arbeidskorting than an employee earning EUR 40,000
- The credit reduction is proportional to the income above the threshold — it's not a cliff
- The effective marginal rate in the phase-out range is the bracket rate plus the phase-out rate
A payroll system that computes the arbeidskorting once at the start of the year (based on estimated annual income) and applies it as a flat monthly deduction will produce incorrect withholding for any employee whose income changes mid-year. The credit must be recalculated each period based on the YTD income trajectory.
For employees near the phase-out boundaries, the monthly withholding can fluctuate significantly — a overtime payment in one month can reduce the arbeidskorting for that month disproportionately, creating a visible pay reduction that confuses employees even though it's mathematically correct.
Scottish prefix: the identity-driven tariff (United Kingdom)
The UK PAYE system determines which tax schedule to apply based on a single character in the employee's tax code. An S prefix means the Scottish 6-band schedule applies. No prefix means the English/NI 3-band schedule. A C prefix means the Welsh schedule (currently identical to England, but legally separate and independently adjustable).
The complexity: HMRC communicates tax codes via the P9 notification. If HMRC issues a tax code without the S prefix for a Scottish employee (e.g., due to a delayed address update), the payroll system applies English rates. For a Scottish employee earning £50,000, the tax difference between English and Scottish rates is approximately £640/year. The payroll system has no way to detect this error — it's following the tax code exactly as provided by HMRC.
The cumulative PAYE mechanism does self-correct when HMRC updates the tax code, but the correction may lag by several months. During that period, every payslip is incorrect — and the employee may face a sudden large adjustment when the code is corrected mid-year.
Dual path: Impatriados vs. standard IRPF (Spain)
The Spanish Régimen de Impatriados creates a bifurcation in the payroll system. For qualifying employees, the entire IRPF calculation is replaced: no progressive brackets, no personal/family deductions, no regional scale. Instead, a flat 24% applies up to EUR 600,000 and 47% above that.
The tricky part: the determination of eligibility is not a payroll decision — it's a tax authority ruling. The employee must apply to AEAT, and the regime applies from the tax period in which the employment starts. If the ruling arrives after payroll has already been running for several months under the standard IRPF regime, the system must retroactively recalculate all prior periods under the flat-rate regime and process the delta.
For a high-earning expatriate, the difference between the standard IRPF (up to 47% marginal from EUR 12,450) and the Impatriados flat 24% is substantial. A salary of EUR 150,000 produces approximately EUR 43,000 in IRPF under the standard regime versus EUR 36,000 under Impatriados — a EUR 7,000 annual difference. The retro adjustment for 6 months of backdated regime change would be approximately EUR 3,500, flowing into a single payslip.
Belgium: BV family-situation dependency
Belgian BV scales are unique in that the family situation is embedded directly in the tariff table. The same gross income of EUR 3,500/month produces different BV for:
- Single, no dependents: highest BV rate
- Married, one income: reduced BV (splitting benefit)
- Married, two incomes: intermediate rate
- With 2 dependent children: further reduction
A change in family situation (marriage, birth, divorce) mid-year requires switching to a different BV scale immediately. Unlike a bracket change (which is a different rate on the same structure), this is a complete table swap. The payroll system must maintain multiple BV scale variants and select the correct one per employee per period.
How PE Solves It
Payroll Engine's tax calculation architecture is built on a principle: the engine provides the framework, the regulation provides the model. The engine doesn't assume progressive or flat — it supports both through the same lookup and algorithm infrastructure.
1. Lookup-driven tariffs
PE supports two fundamental lookup types for tax tariffs:
- Progressive: Distributes income across all brackets and sums the marginal tax. Used for Luxembourg barème, Dutch schijven, Spanish IRPF tramos, Belgian BV schalen, Portuguese IRS brackets.
- Threshold: Returns the value for the single matching bracket. Used for flat-rate selections, credit ceilings, and parameters where only the matching tier matters.
Both lookup types consume the same data format — a list of rangeValue / value pairs. The difference is entirely in the engine's interpretation. This means a country regulation author defines a tariff by populating a lookup table and specifying its type. No code change, no algorithm override.
For Germany's PAP, the lookup system is not sufficient — the polynomial algorithm requires a dedicated calculation implementation. PE handles this through per-country algorithm modules that are invoked by the regulation. The PAP implementation receives its parameters (Grundfreibetrag, SolZ-Freigrenze, etc.) from lookup data regulations, but the calculation itself is an algorithm, not a table traversal.
2. Per-country algorithm implementations
Each country's tax model is implemented as a dedicated calculation module, invoked by the regulation's wage type chain. The module receives all inputs from the regulation layer (case fields, lookups, prior wage types) and returns the tax amount. The engine doesn't interpret the tax model — it executes whatever calculation the regulation specifies.
This architecture supports the full range of models:
| Country | Model type | Implementation pattern |
|---|---|---|
| LU | 23-bracket progressive | Progressive lookup + annualize/de-annualize |
| US | Stacked progressive (federal + state + local) | Three independent progressive lookups, filing-status driven |
| DE | PAP polynomial | Dedicated algorithm module with lookup parameters |
| NL | 3-bracket + credit phase-outs | Progressive lookup + credit calculation with phase-out formula |
| UK | Cumulative PAYE with regional bands | Tax-code-driven band selection + cumulative YTD tracking |
| ES | Split state/regional + flat impatriados | Dual progressive lookups + regime flag for Beckham Law |
| BE | Family-situation-dependent BV scales | Multi-variant lookup selected by family status case fields |
| PT | Pre-computed withholding tables | Threshold lookup on monthly income bands |
3. Data regulation satellites with validFrom versioning
Every parameter that changes annually — brackets, rates, thresholds, credit amounts, phase-out boundaries — is stored in a data regulation satellite with a validFrom date. The engine resolves the correct parameter set based on the payrun period, not the execution date.
This design has three critical benefits:
- Annual updates are data changes. When the Dutch government publishes the 2027 schijven and arbeidskorting parameters, the update is a new data regulation with
validFrom: 2027-01-01. No code change, no redeployment. - Historical accuracy. A retro correction for January 2025 automatically uses the 2025 brackets, even when processed in June 2026. The engine resolves the
validFromagainst the original period, not the current period. - Multi-year coexistence. The 2025 and 2026 data regulations exist simultaneously. A payrun for December 2025 and a payrun for January 2026 both execute correctly using the same regulation code base with different parameter sets.
4. Annual update = new lookup entries, not code changes
The separation between engine logic and regulation data means that the annual tax update cycle is fundamentally different from a code release. When the Luxembourg ACD publishes the 2027 barème:
- A new data regulation satellite is created with
validFrom: 2027-01-01 - All 23 bracket entries are populated from the official publication
- A compliance audit verifies every value against the ACD source
- Integration tests confirm that the lookup produces the correct tax for sample incomes
- The data regulation is deployed — no engine code is touched
This is not just a deployment convenience — it's a compliance architecture. The person who updates the Luxembourg barème doesn't need to understand the engine's lookup algorithm. They need to accurately transcribe 23 rows from the ACD publication. The engine's progressive lookup logic has already been validated; only the data is new.
Architecture pattern: PE treats tax models as regulation configuration, not engine features. A 23-bracket barème and a 3-bracket schijf use the same progressive lookup engine. A polynomial PAP and a pre-computed withholding table both consume parameters from data regulation satellites. The engine provides the calculation primitives; the regulation assembles them into a country-specific model. Adding a new country's tax model is a regulation authoring task — it does not require changes to the calculation engine.
Test Case References
The following integration tests validate the tax model implementations described in this article:
| Test | Country | Scenario |
|---|---|---|
WT-TC5100-LU-RetenueSalaires-* |
LU | 23-bracket barème: progressive tax across all brackets for tax classes 1, 1a, 2 |
WT-TC5100-US-* |
US | Federal + state income tax: stacked progressive tariffs with filing-status selection |
WT-TC5100-DE-Lohnsteuer-* |
DE | PAP 2026 algorithm: polynomial tax with Vorsorgepauschale, SolZ mitigation, Steuerklassen I–VI |
WT-TC5130-NL-LoonheffingNetto-* |
NL | 3-schijf loonbelasting with arbeidskorting and algemene heffingskorting phase-outs |
WT-TC5100-UK-* |
UK | Cumulative PAYE: English 3-band, Scottish S-prefix 6-band, K-code negative allowance |
WT-TC5150-ES-* |
ES | IRPF tramos: state + regional scales, Régimen de Impatriados flat 24%/47% |
WT-TC5100-BE-BVBruto-* |
BE | BV tariff scales by family situation: single, married-one-income, married-two-incomes, with dependents |
All test cases listed above are integration tests that run against a live Payroll Engine backend. They validate the full tax calculation chain — from gross income through bracket allocation, credit application, and net computation — using country-specific parameters from versioned data regulation satellites.
See how PE handles this
Explore the full technical implementation — progressive lookups, PAP algorithms, credit phase-outs, and data regulation versioning across all 12 countries.
Request a Demo →
Luxembourg
United States
Germany
Netherlands
United Kingdom
Spain
Belgium
Portugal