v0.1.6
Releasedatum: 3 mei 2026
Nieuwe Functies
EU-Conforme Prijsverlagingen
- Producten hebben een nieuwe schakelaar "Vorige prijs tonen" op het productformulier om in te stellen dat een prijsverlaging wordt weergegeven
- De doorgehaalde prijs in de winkel gebruikt nu de laagste prijs van de afgelopen 30 dagen, conform de EU Omnibus-richtlijn — en niet de handmatig ingevoerde vorige prijs
- Het productformulier waarschuwt wanneer er geen kortingsbadge wordt getoond (omdat de huidige prijs niet lager is dan het 30-daagse minimum), zodat beheerders weten dat hun verlaging niet zichtbaar zal zijn
- Prijswijzigingen worden automatisch geregistreerd en een wekelijkse opruimtaak verwijdert geschiedenis ouder dan 90 dagen
Prijs per Eenheid
- Producten kunnen nu een hoeveelheid en eenheid declareren (kg, g, L, ml, m, cm, m²), en de winkel toont een regel "per kg" / "per L" / etc. onder de prijs op kaarten, productpagina, collectie en zoekresultaten
- Producten die per stuk worden verkocht ("per item") zijn vrijgesteld van prijs per eenheid, zoals vereist door de richtlijn
- De prijs per eenheid wordt geëxporteerd naar de Google Merchant-feed als
unit_pricing_measureenunit_pricing_base_measure
Prijzen Inclusief BTW in de Winkel
- Alle prijzen in de winkel (kaarten, productpagina, winkelwagen, checkout, ordermails) zijn nu altijd inclusief btw, zoals vereist voor B2C-verkoop in de EU
- De productpagina toont een melding wanneer een belastingregel land-specifieke afwijkingen heeft, om aan te geven dat het uiteindelijke bedrag mogelijk wordt herberekend bij de checkout zodra het factuurland van de klant bekend is
- Het productformulier in het beheergedeelte heeft een nieuwe belastingvoorbeeldweergave die toont wat elk land berekend krijgt wanneer een belastingregel land-specifieke afwijkingen heeft
Factuuradres in Checkout
- De checkout-flow heeft een nieuwe stap voor het factuuradres: behoud het verzendadres (standaard), kies een opgeslagen adres of voer een nieuw adres in
- Klanten kunnen optioneel een aangepast factuuradres opslaan in hun adresboek voor toekomstige bestellingen
- Het wijzigen van het factuurland wist de geselecteerde betaalmethode en eventuele lopende Stripe PaymentIntent, zodat de belasting opnieuw wordt berekend voor het nieuwe land
- Orderbevestigingsmails en de orderhistoriepagina van de klant tonen verzend- en factuuradres apart wanneer ze verschillen
- De orderweergave in het beheergedeelte toont verzending en facturering naast elkaar
Verbeteringen
Analytics Dashboard
- Tabellen op de pagina's Verkeer, Producten en Verlaten Winkelwagens gebruiken nu paginering aan de serverzijde, zodat grote winkels responsief blijven
- De UI van de funnel-grafiek is verfijnd voor een duidelijkere visualisatie van afhakers
- Sessies van ingelogde admins worden uitgesloten van analytics zodat de cijfers de werkelijke klantactiviteit weerspiegelen
- Paginapaden worden genormaliseerd zodat dezelfde logische pagina niet meer over meerdere rijen wordt verspreid
Bestellingen
- Nieuw filter voor de oorsprong van bestellingen in de bestellijst scheidt checkoutbestellingen van handmatig aangemaakte bestellingen
- Bij het aanmaken van handmatige bestellingen worden placeholder-e-mails geblokkeerd wanneer een echte klant-e-mail beschikbaar is, zodat meldingen in de juiste inbox terechtkomen
Onboarding
- De stap Talen selecteert nu standaard Engels, Spaans, Nederlands en Portugees (voorheen alleen Engels); admins kunnen de lijst nog steeds aanpassen
Stabiliteit van de Checkout
- Advisory locks en serialiseerbare snapshot-updates beschermen gelijktijdige checkoutacties tegen race conditions
- Datums in de checkout-datumkiezer en ordermails respecteren nu de locale van de klant
Verzending en Locale
- Minimale orderdrempels voor verzending worden nu vergeleken met subtotaal + btw minus eventuele productkortingen, zodat het overeenkomt met wat de klant ziet in het besteloverzicht (verzendkortingscoupons worden uitgesloten van de korting)
- Op de server gerenderde winkelpagina's en ordermails bepalen de taal via de opgeslagen voorkeur van de klant, daarna de
locale-cookie, daarna de eerste door de winkel ingeschakelde taal, met Engels als fallback — zodat een verouderde cookie geen taal meer rendert die de winkel inmiddels heeft uitgeschakeld
Operations
- Een nieuwe optionele env var
ENABLE_AUTH_RATE_LIMITlaat operators het rate limit van Better Auth uitschakelen in CI- en testomgevingen; het productiegedrag verandert niet tenzij de variabele expliciet wordt ingesteld
Bugfixes
- Het samenvoegen van winkelwagens valideert nu de voorraad voor beide kanten en informeert klanten wanneer hoeveelheden worden aangepast
- Een waarschuwingsmelding verschijnt twee minuten voordat de reservering van de winkelwagen verloopt
- Stripe webhook-handlers (gelukt en mislukt) zijn nu idempotent en gebruiken atomic guards om dubbele verwerking te voorkomen
- Coupons toepassen en verwijderen worden geserialiseerd via de checkout-lock; coupons voor eenmalig gebruik per klant tellen geen geannuleerde of mislukte betalingen meer mee
- Hervalidatie van verzendcoupons wordt overgeslagen wanneer de klant van land verandert voordat een verzendmethode is gekozen
- De bezoekers-cohort wordt vastgelegd in de order-snapshot zodat aankoop-events aan de serverzijde in de juiste cohort blijven
- De Annuleren-knop op het bewerkingsformulier voor gebruikers reset velden nu zonder ze als gewijzigd te markeren
Beveiligingsfixes
- Het iframe-kanaal van de page builder is nu beperkt tot postMessage van dezelfde origin
- Adres-PATCH- en DELETE-operaties zijn nu eigendomsgebonden op SQL-niveau
- Per-IP rate limiting wordt nu toegepast op het Stripe webhook-endpoint
- Aggregaatqueries van analytics gebruiken nu geparametriseerde
make_interval()-aanroepen in plaats van string-interpolatie - De timestamp-tolerantie van Stripe
constructEventis vastgezet op 300 seconden Order.stripePaymentIntentIdheeft nu een unieke index en de webhook gebruiktfindUniquevoor extra veiligheid