Mattias Desmet
For psychologist and author Mattias Desmet, we built a bilingual website as understated as a typed letter — with a shop underneath and a system that takes over the entire workshop administration: registration, online payments through Stripe, cross-border VAT, invoices and Peppol via Billit.
Visit the website
Mattias Desmet is a professor of clinical psychology at Ghent University, a speaker, and the author of The Psychology of Totalitarianism — a book that has since appeared in an impressive list of languages, from Korean to Hebrew. He also teaches workshops in Belgium and the Netherlands on what he calls The Act of Speech: the art of speaking sincerely and freely.
The brief had two sides. On the one hand, a website that gives his work and his voice a calm, dignified home: workshops, events, publications, books, Substack. On the other, an engine underneath that takes over the administration of all those workshops — from the first click on “register” to the invoice in the books, across the border and with every VAT rule that comes with it.
We did both, from the first sketch to the last line of Peppol.
The design: paper, ink and a single red thread
Someone who writes about the spoken word deserves a website that doesn’t shout. We started from the image of a typed letter: off-white paper, deep black ink and headings set in Special Elite, a typeface with the slight irregularity of an old typewriter. Body copy is set in an italic Lora — Mattias’s own voice — while a restrained Helvetica keeps labels and structure in place.
There is exactly one colour. Red is reserved for TAoS, short for The Act of Speech, and runs through the entire site as a common thread.
The intro. When you open the site, the words “The Act of Speech” type themselves out, letter by letter, over a portrait by Selina De Maeyer. The initials turn red, the rest fades away, and the four red letters slide together into TAoS as the image turns white. Then the menu types itself in. It plays once per visit — anyone who wants to see it again simply clicks the small replay icon.
Bilingual, and in his own hands. The site is fully available in Dutch and English. The homepage isn’t a classic hero but the menu itself, set large like a table of contents; Mattias decides in the panel which pages it lists. Workshops, events and books each get an overview with filters — own organisation or guest appearance, theme day, lecture or trip, or by language.
Registration without detours
Every workshop is a series with its own dates, location, price and a maximum number of places. Once that limit is reached, the form automatically makes way for “Fully booked”; Mattias can also close a series with a single switch.
Not every series opens to everyone straight away. A workshop can be announced with an opening date, while anyone holding a priority link can already register. A follow-up series never opens to the public at all: visitors apply first, and only after approval do they receive the link that lets them in.
The form itself thinks along. Register on behalf of a company and the business fields appear, with the label adapting to your country: enterprise number in Belgium, KVK number in the Netherlands. The price is split live into amount, VAT and total, so there are no surprises at checkout.
The shop: online payments through Stripe
Behind the site sits a fully fledged shop. Workshops, events and donations are all paid online through Stripe Checkout, with Bancontact, iDEAL and card. After the form, participants go straight to checkout — and an abandoned payment is never a lost registration: the same link simply picks it up again.
We don’t rely on a visitor returning to the site to know a payment went through. Only when Stripe confirms it through a signed webhook does the registration switch to “confirmed” — and the rest of the chain rolls on by itself.
Invoicing that puts the accountant at ease
An invoice isn’t just any PDF. Numbers have to run consecutively, without gaps, even when two people pay at exactly the same moment. That’s why every invoice number is issued atomically: the yearly counter is locked, the PDF is first assembled in a holding area and only then written to its final place. Every step ends up in an audit log.
The invoice itself follows the house style and goes straight to the participant. Prefix, starting number, company details and a BCC for the accountant are managed by Mattias in the panel; invoicing, Billit and VAT validation each have their own master switch.
VAT across the border. The hardest part wasn’t in the code but in the rules. A private individual pays the listed price including VAT; a company sees VAT added on top. For a workshop in the Netherlands, a private individual is charged Dutch VAT through OSS, while a Dutch company with a valid VAT number gets the VAT reverse-charged — after a live VIES check. A Dutch company attending a Belgian workshop, on the other hand, simply pays Belgian VAT, because admission to an event is taxed where it takes place.
And where an automatic invoice would be wrong — a Belgian company at a Dutch workshop — the form blocks online registration and explains why. Mattias then issues that one invoice himself in Billit.
Billit & Peppol
Since 2026, e-invoicing between Belgian businesses has been mandatory. Alongside every PDF, the site therefore builds a UBL file to the Peppol BIS 3.0 standard and sends it straight to Billit. Every invoice lands in the books automatically, and for companies with a Peppol address, Billit delivers it right away over the Peppol network.
VAT numbers are validated along the way through Vatly, with a cache so that a slow or faltering VIES service never holds up a registration. And should delivery to Billit ever fail, the invoice still exists and the error is neatly logged.
Management in his own hands
All registrations come together in a single overview, reachable only after logging in to the panel. Changing a status, marking a payment, creating an invoice manually or moving someone off the waiting list takes one choice per row. Per workshop or for everything at once, Mattias exports the list as CSV or as a genuine Excel file, built with a lightweight generator of our own.
Under the hood, registrations and invoices are stored as separate files, independent of the site’s pages. That keeps storage robust — and our deployments never touch that accounting data.
Books and support
Every edition of every book has its own page with cover, publisher, year and ISBN, and the overview filters by language. An order button per edition leads to the right publisher or bookshop, and a stock status — pre-order, sold out or coming soon — keeps visitors honestly informed. The catalogue is built so that a dedicated webshop can slot in later without a rebuild.
Anyone who wants to support Mattias’s work can do so with a donation of their choice. It also runs through Stripe, but deliberately separate from registrations: no invoice, no place counting, just an amount and a thank-you.
Newsletter & Substack
At the bottom of every page sits a single field: your email address. The form talks directly to Laposta, responds instantly without reloading — even if you’re already subscribed — and still works with JavaScript switched off. Spambots are caught by an invisible honeypot field.
Mattias writes his longer essays on Substack, in three languages. The site links to the Dutch, English and French publications, so every reader lands in the right language straight away.
The result
A website that sounds the way Mattias speaks: understated, precise and held together by a single red thread. And underneath, a system that quietly takes over an entire administration. Since launch, the invoices have been rolling out on their own — numbered consecutively, VAT-correct across two countries and booked automatically in Billit — without a single figure being retyped.
Search engines receive every workshop and event as structured data, visitors are counted in a privacy-friendly way, and Mattias puts new series online himself. And if anything ever needs adjusting, he knows where to find us.
A website with a black belt
Website, community & AI →