2026 · Marketplace · the Netherlands

jouwdrank.nl, a marketplace for drinks with the rules in the code

Licensed liquor stores and local brewers sell online here, each under its own licence. The platform mediates; the shop remains the seller. Selling alcohol online is tightly regulated, so the rules live in the code itself, with tests as proof. I do the design, the architecture and the build.

In development and not yet live with real payments. Everything below is built and guarded by tests. The connections to the payment provider, iDIN and the carrier are ready behind a switch and go live at launch.

6 of 24places per shop on the first page, with 10 or 10,000 products
1payout, even when it starts twice at the same moment
18+on every box with alcohol, shipping only after confirmation
13.6 to 5.9 shomepage LCP in the lab measurement

The same space for the smallest shop

In an audit, a shop with 10,000 products took 21 of the 24 places on the first page of a search, and a shop with 10 products got none. The size of a range should give no head start, so that changed.

Without a search term, shops take turns. In the test with shops of 10, 100, 1,000 and 10,000 products, each gets exactly 6 places. With a search term, relevance comes first and equally relevant results alternate by shop; the test then requires 5 to 7 places per shop, and an exact name match stays on top.

Money that moves only once

An order is only marked as paid when the amount received is exactly what is due. If it differs, the admin gets an alert and nothing changes.

A payout is claimed in the database first and only then requested from the payment provider, with a fixed idempotency key. Two simultaneous payouts become one. A double click on pay opens one payment, and two webhooks arriving at the same moment give one status change and one confirmation mail.

An order from three shops of 45, 80 and 25 euros is split to the cent. The test payment is refused on the server as soon as real payments are on.

Age protection in layers

A single tick box is too easy to get around. At checkout, iDIN confirms through the customer’s own bank only whether they are 18 or older, and nothing else.

Every box with alcohol gets an 18+ label, four per A4 sheet, printed from the seller portal. A shop can only mark an order as shipped after confirming the label is on, and that moment is stored as evidence. At launch, the carrier’s age check at the door is added.

Permissions per role, guarded by a test

Every route and every server action is listed in an authorisation matrix with the role allowed to call it. A new route without a rule fails the test. The same test checks that every admin, seller and customer endpoint actually runs the check for its role.

Quality that holds back the deploy

Playwright walks the customer journey and the seller portal, axe-core checks accessibility and Lighthouse guards minimum scores. The deploy to staging waits for all three.

Homepage LCP went from 13.6 to 5.9 seconds in the lab measurement, a category page from 4.4 to 2.5. Photos that loaded too early now load lazily and were recompressed.

What is still open

A load test with concurrent checkouts and a penetration test are still planned. Until they exist, this page makes no claims about scale.

Work