Belgian payroll in Odoo — 13th month, holiday pay and ONSS
Belgian payroll is one of the most complex in Europe. Running it inside Odoo is doable, often elegant, and occasionally painful. This post is the field guide our consultants use when wiring Odoo Payroll for Belgian clients.
We have implemented and supported Belgian payroll on Odoo for SMEs in services, manufacturing and retail. The platform handles the mechanics — gross to net, ONSS, withholding tax, holiday pay, end-of-year bonus — but the real work is in configuration, integrations and the social secretariat handover.
This is not the official Odoo manual; it is the practical view from running real Belgian payslips through real production systems. We will cover where Odoo wins, where it needs help, and the operational habits that keep year-end calm.
We focus on Belgium specifically because the country has its own particular rules: ONSS, Bedrijfsvoorheffing / Précompte professionnel, holiday pay computed on the previous year's salary, the 13th month bonus, meal vouchers, eco vouchers, and the social secretariat ecosystem (SD Worx, Securex, Liantis, Partena…).
Architecture — Odoo, the social secretariat, and the bank
Almost every Belgian SME runs payroll through a social secretariat: SD Worx, Securex, Liantis, Partena. Odoo Payroll fits in three patterns: full Odoo (rare), Odoo as front-end with secretariat as engine (common), or secretariat as system of record with read-back into Odoo (common for larger SMEs).
We pick the pattern based on company size, internal HR skills, and how comfortable the client is with payroll operational risk. The wrong pattern adds work for years; the right pattern fits hand in glove with finance and HR.
- Pattern A: Odoo runs payroll fully (small companies, simple cases)
- Pattern B: Odoo as front-end, secretariat as engine (most common)
- Pattern C: Secretariat as source of truth, Odoo reads back (larger SMEs)
- Choose pattern based on size, HR skills and risk appetite
- Wrong pattern = years of friction; right pattern = clean monthly cycle
ONSS, withholding tax and the gross-to-net engine
Odoo handles the gross-to-net mechanics for Belgium: ONSS (employer and employee), Bedrijfsvoorheffing / Précompte professionnel, occasional special contributions, and the various exemptions. Localisation packs are updated by Odoo at each fiscal year — we still verify against the secretariat outputs every January.
The trap is custom rules invented locally over the years. If your secretariat applies a particular exemption or a specific scale, document it explicitly and verify the rule survives every minor Odoo upgrade.
- ONSS computed automatically with localisation pack
- Bedrijfsvoorheffing / Précompte professionnel scales updated yearly
- Special contributions covered out of the box
- Verify against secretariat output every January
- Document any custom rule explicitly and re-test at each upgrade
Holiday pay, 13th month and the year-end specifics
Holiday pay in Belgium is computed on the previous year's salary, paid in May or June for white-collar workers, with specific rules for new joiners and leavers. The 13th month is paid in December, with rules per joint committee. Both are configurable in Odoo — and both are where most rule errors hide.
We always run a parallel calculation in May (holiday pay) and December (13th month) the first year a client moves to Odoo. The numbers must match the secretariat to the cent. If they do not, we fix the configuration, not the output.
- Holiday pay computed on previous year's salary
- Specific rules for joiners and leavers — review annually
- 13th month per joint committee — verify your sector rule
- Run parallel computation in May and December the first year
- Fix the configuration when numbers diverge — never the output
Meal vouchers, eco vouchers and benefits in kind
Belgian payroll touches a long tail of benefits: meal vouchers, eco vouchers, mobility budget, company car (with CO₂-based BIK), warrants, group insurance, hospitalisation. Each has its own tax and ONSS treatment. Odoo handles most natively but the configuration is tedious.
We always document the BIK and benefit configuration in a one-page table per company. When something changes — and it does, every year — the change is small and traced. Without that table, every payroll question becomes archaeology.
- Meal vouchers computed automatically with thresholds
- Eco vouchers handled per joint committee
- Company car BIK based on CO₂ and catalogue value
- Group insurance and hospitalisation per employer policy
- Maintain a one-page BIK and benefit table per company
DMFA, Belcotax and the year-end statutory exports
At year end, Belgian payroll produces statutory exports: DMFA (quarterly), Belcotax-on-web (yearly), individual wage statements. These are typically generated by the social secretariat, but Odoo carries the source data. The data quality in Odoo determines how painful the year-end is.
We treat year-end as a process that starts in October, not in late December. Master data clean-up, joint committee verification, leaver reconciliation, and a dry run of the exports avoid the January crunch.
- DMFA quarterly, Belcotax yearly — secretariat usually handles
- Source data quality in Odoo determines year-end pain
- Start year-end process in October, not December
- Reconcile leavers and joiners cleanly before quarter end
- Dry-run the exports before the statutory deadline
Belgian payroll mistakes we keep seeing
Five patterns from real Belgian Odoo payroll incidents.
- Going live without parallel-running with the secretariat for at least one full quarter.
- Skipping joint committee configuration — sector rules differ widely.
- Treating BIK and meal vouchers as edge cases — they touch every payslip.
- Discovering the May holiday pay error in May instead of February.
- Year-end run as a December crunch instead of an October process.
How to measure that Belgian payroll in Odoo is healthy
Numbers we monitor monthly and quarterly.
- Variance between Odoo payslips and secretariat output — should be zero.
- Number of manual payroll corrections per month — trending down.
- DMFA submission on time, every quarter — green every time.
- Holiday pay May variance — zero by year two.
- Time from last working day of month to payslips signed — bounded.
How we run Belgian payroll go-lives
We always run at least one full quarter in parallel with the social secretariat before turning Odoo into the system of record. The first month finds configuration gaps, the second confirms the fix, the third gives confidence.
We then schedule a year-end rehearsal in October, six weeks before year close, including a dry run of the 13th month and the export to the secretariat. This converts year-end from a crunch to a routine.
- One full quarter parallel run with the secretariat before cutover
- Joint committee configuration verified per company per role
- BIK and benefit table maintained as living document
- October year-end rehearsal with 13th month dry run
- Quarterly health check between secretariat and Odoo numbers
Belgian payroll go-live checklist
Walk this list before turning Odoo into the system of record.
- Joint committee per role verified
- BIK and benefit table documented and signed off
- One full quarter parallel run with the secretariat completed
- May holiday pay rule tested with joiners and leavers
- 13th month rule tested per joint committee
- Year-end calendar with statutory deadlines published
- Roll-back path agreed if cutover finds material variance
Belgian payroll on Odoo — boring on purpose
When Belgian payroll on Odoo runs well, it is invisible. Payslips appear on time, ONSS is paid on time, Bedrijfsvoorheffing is paid on time, the secretariat sees the same numbers we see. That invisibility is the goal.
Reaching it requires patience: configure carefully, run parallel with the secretariat, verify every May and every December the first year. After that the system runs on its own, and the team focuses on people, not on spreadsheets.
If you are starting a Belgian payroll project in Odoo or wrestling with one already live, we are happy to spend a half-day reviewing the configuration with your HR lead and secretariat contact.
Frequently asked questions
Can Odoo replace my social secretariat?
In some cases yes — for very small companies with simple structures, Odoo can fully run Belgian payroll. In most SMEs the secretariat brings legal expertise, regulatory monitoring and submission services that are hard to replicate internally. The common pattern is Odoo as front-end and the secretariat as engine.
How does Odoo handle the May holiday pay calculation?
It computes holiday pay on the previous year's salary, with rules for joiners and leavers. The localisation pack covers the standard cases. We always run a parallel computation against the secretariat the first year — the variances surface configuration mistakes that would otherwise hide for months.
Do I need a separate module for the 13th month?
No — it is part of the standard Belgian payroll configuration. What does need attention is the rule per joint committee. Different sectors have different formulas for the 13th month; pick the right one and verify with the secretariat.
How do meal and eco vouchers work in Odoo Belgium?
Both are handled natively. Meal vouchers are computed per worked day with the employer/employee split and the tax-exempt threshold. Eco vouchers follow the joint committee rules. Configure once, verify with the secretariat once, then trust the engine.
What is the realistic go-live timeline for Belgian payroll on Odoo?
For an SME of 20-100 employees, plan three months from kickoff to cutover, with one full quarter of parallel running afterwards before retiring the secretariat back-office (if you ever do). For more than 100 employees or multi-entity companies, plan six months. Anything shorter usually surfaces in May.
Want to discuss what this means for your own Odoo project? We're happy to talk.
