Two deadlines set by law, and a lot of work still done in Excel
From 1 January 2026 the Belgian government requires electronic invoices for all business-to-business receipts. France follows on 1 September 2026, and the rest of the European Union after that. HEMA sells to business customers in both countries, and had no way to issue an electronic invoice.
The two countries are not one problem. Different identifiers, different mandatory fields, a different payload, a separate account on the invoicing network. France is stricter than Belgium.
In parallel, HEMA employees were running core processes on spreadsheets. Product specifications were assembled by print-screening PDFs into Excel, a hundred articles or more per project. The range calendar for every shelf, store and country lived in one Excel file covering two years.
Every new internal app also meant starting the infrastructure discussion again. HEMA needed one approved way to build them.
Two workstreams, one team
First the invoicing system, because the date was set by law. Then the template that the internal web apps are built on, and the apps themselves.
Split it in two
A front end where the business customer enters the receipt, and a back end that holds the business logic and talks to the invoicing platform. Two applications, one flow.
Belgium first, by 1 January
A two-step form: business details and receipt search, then a success page. The receipt is validated against HEMA’s own purchase data before an invoice is created.
Then France, on the same API
Four steps, a second set of identifiers, a separate account on the invoicing platform and a different payload. The front end still calls one API. The country code decides the rest.
Listen for returns
A purchase produces an invoice, a return produces a credit note. A Kafka event triggers the handler, and the credit note is generated without anyone asking for it.
Watch the cents
HEMA’s purchase data service totals to two decimals, the invoicing platform to five. We moved to five decimals and monitor every invoice for what is left. Above half a cent, finance gets an email.
Get one standard approved
A mono repo with front end and back end together, hosted zones and DNS, Azure AD single sign-on, and the whole thing signed off by HEMA’s standards process.
Build the next app
The first app on the template handles product specifications. Same infrastructure, same components, no new discussion about how to host it.
Take the manual step out
Enter an article number, the app finds the PDF in SharePoint and decomposes it: images, text, attributes, all into the article record. The user checks it instead of rebuilding it.
Then the range calendar
Same template, same tech. A range calendar with real data instead of a two-year spreadsheet, with requests and approvals for when a product goes on a shelf.
Five things in production or on their way
E-invoicing Belgium
Since the mandate started on 1 January 2026. One identifier per customer: VAT, CBE or GLN.
E-invoicing France
Deployed for the 1 September 2026 deadline. Multiple identifiers per customer: VAT, SIREN, SIRET, CBE, and a check on network registration.
The app template
A standardised mono repo signed off through HEMA’s standards process, reusable for every internal app that follows.
Product specification app
Designer groups are testing it now. Up to fifty images decomposed from a single PDF, and around a hundred PDFs handled at once.
Range calendar app
Which product sits on which shelf, in which week, in which store and country. Requested and approved in the app instead of argued over in Excel.
The systems, and the standard under them
Self-service invoicing for business customers
Enter the receipt details, have them validated against HEMA’s purchase data, receive a compliant electronic invoice. Two steps in Belgium, four in France.
One back end, per-country routing
Node.js on AWS Lambda. Validation and creation APIs, separate accounts, keys and party IDs per country, and the payload mapping each one requires.
Credit notes on returns
A Kafka topic carries the event, a Lambda handler picks it up and generates the credit note.
Rounding monitor with alerting
A DynamoDB stream listener recalculates both totals per invoice and emails HEMA’s finance team when the difference passes half a cent.
The internal app template, and the apps on it
An approved mono repo with front end, back end, DNS and single sign-on, plus the product specification app and the range calendar built from it.
Engineers inside HEMA’s landscape, not next to it
We work in HEMA’s own design system, its cloud accounts and its standards process. That is why a regulatory deadline and an internal app can be handled by the same team.
Compliance treated as engineering
Two mandates read, two identifier sets mapped, one API kept stable. The country code is where the difference lives, so the next country is configuration and a payload, not a rewrite.
Third parties handled honestly
We cannot change how a vendor rounds a total. We can recalculate it, set a threshold, alert the people who care, and document what is out of our hands for whoever picks it up next.
Build the first one twice as well
Two weeks went into the OpenNext and CloudFront setup, among the first at HEMA. Every internal app since has started from it.
More of our work
All cases →Which country is next on your list?
Tell us where you sell business to business and what your invoicing runs on today. We will tell you what compliance takes.


