Belgian Construction Withholding 30bis for Odoo Online — SaaS version with no Python code: pre-payment check, social security and tax withholding, works declaration and on-site attendance register.
Overview
Construction Subcontracting — Belgium (the so-called “30bis” regime)
Belgian localization of the dyo_soustraitance foundation, for Odoo 19 Community.
What the regime says. Article 30bis of the Belgian Act of June 27, 1969 requires the principal, before each payment to its contracting party in the construction sector, to check whether that party has social security debts (ONSS) or tax debts (SPF Finances). If so, the principal must withhold part of the amount due and pay it to the relevant authority. The check is made against a public database.
A consultation has no period of validity. Article 30bis §4 requires a check "at each payment"; Article 55 of the Code du recouvrement (CRAF, Belgian tax collection code) says the same for the tax component; the ONSS states "at the signing of the contract and before each invoice payment". A consultation is therefore valid for one payment, and for that payment only.
Where things go wrong in practice. The company checks the database when the contract is signed, prints the result, and pays for months without checking again. The module makes that oversight impossible: payment is refused when the check is missing, when none was made at the conclusion of the contract, or when the one relied on has already covered a previous payment — with the reason, reference and date written out. Joint and several liability and a surcharge equal to the amount not paid over are at stake (Art. 30bis §5).
What the module adds to the base
a Belgian verification source — a lookup in the public withholding obligation database, with its reference and date;
the detailed result: social security debt (ONSS), tax debt (SPF Finances), or neither. Saying “non-compliant” without saying which is refused: they are two separate withholdings, paid to two separate administrations;
the withholding calculation — the sum of the applicable rates according to the debts found, and the maximum withholding when no valid lookup covers the payment;
the enterprise number (BCE/KBO) on the subcontractor's record;
the works declaration to the ONSS (Belgian National Social Security Office), linked to the project, with its two thresholds: €30,000 excl. VAT with no subcontractor at all, €5,000 excl. VAT as soon as a single one is involved, and a declaration is due whatever the amount once there are two subcontractors. Until it is filed, no payment on the project can be validated — failure to declare costs 5% of the total undeclared amount (art. 30bis §8);
the on-site attendance register — who came, on which day, for which employer, from what time to what time.
Rates, the two reporting thresholds and the register threshold are company settings, not constants in the code: they change, and a business must be able to update them without waiting for a new release. Check the shipped values with your payroll service provider (secrétariat social) before relying on them.
On the other hand, no validity period for a check can be configured, because none exists: the rule is “when the contract is concluded, then before each payment”.
What the module does not do
No automatic connection to the public database or to the ONSS portal: the lookup and the declaration are done on the official portals, and their result is recorded here with its reference. No remittance to the authorities — the withholding is calculated and tracked, while its payment is handled in Accounting.
Specifications
| Price | €149 excl. VAT |
|---|---|
| License | OPL-1 |
| Odoo series | 19.0: published on the Odoo Apps Store; 20.0: published on the Odoo Apps Store |
| Version | 1.1.0 |
| Edition | Odoo Online (SaaS) and Odoo.sh |
| Technical name | dyo_soustraitance_be_online |
| Domain | Construction and real estate |
Price excluding VAT as displayed on the Odoo Apps Store; purchase and installation are done on the Store or through your Omnifloo instance.