Case

Et manipulationssikkert lodtrækningssystem til en tankstationskæde: 16.000 deltagere, ingen app at downloade

En tankstationskæde i Argentina ville afholde lodtrækninger for sine kunder på tværs af stationerne. Vi designede hele systemet: ekspedienterne genererer QR-koder, der udløber, kunderne deltager fra deres egen telefon uden at installere noget, og ejeren gennemfører reviderbare lodtrækninger fra et live-dashboard.

Overblik

Kunde
Tankstationskæde, Argentina
Vores rolle
Løsningsdesign, UX, udvikling, idriftsættelse og løbende support
Type
Kundeprojekt
Stack
Next.js, React, TypeScript, Tailwind CSS, shadcn/ui, Supabase (PostgreSQL, Auth, Row Level Security), Zod, Vitest, Vercel
Status
I produktion

Opgaven

Kunden kom til os med et mål, ikke en kravspecifikation: at belønne kunderne med lodtrækninger på flere stationer. Hvordan det skulle fungere, var op til os.

Det lød som en formular: kunderne tilmelder sig, og nogen trækker en vinder. Da vi gravede i det, viste de reelle krav sig at være sværere:

  • Kun rigtige kunder skulle kunne deltage. En deltagelse skulle være knyttet til et faktisk besøg på en station, ikke til et link delt i en gruppechat.
  • Personalet er ikke teknisk. Ekspedientens del skulle klares med ét tryk.
  • Kunderne installerer ikke noget. Ingen app, ingen konto.
  • Der skulle være tillid til det. En lodtrækning virker kun, hvis folk tror på, at den er fair, så den skulle være svær at snyde og nem at revidere.

Det var ikke en formular. Det var et integritetsproblem.

Løsningen vi designede

Ét system, tre roller.

  1. Ekspedienten åbner appen på sin telefon og trykker én gang. En QR-kode dukker op, gyldig i fem minutter. En dagstæller viser, hvor mange deltagelser ekspedienten har genereret.
  2. Kunden scanner den med sin egen telefon og udfylder en kort formular, der valideres i realtid. Ingen download, ingen tilmelding.
  3. Administratoren styrer stationer, lodtrækninger og ekspedienter, følger deltagelsen på et dashboard med KPI’er, grafer og en søgbar deltagerbase og gennemfører selve lodtrækningen.
SkærmbilledeEkspedientens QR-skærm
SkærmbilledeKundens formular på mobilen
SkærmbilledeAdministratorens dashboard

Under motorhjelmen

  • Engangstokens, der udløber. Hver QR-kode indeholder et SHA-256-token, der udløber efter fem minutter og forbruges atomisk, så det hverken kan genbruges eller forfalskes.
  • Adgangskontrol på to niveauer. Rollebaseret routing for administratorer og ekspedienter plus PostgreSQL Row Level Security på et skema med 8 tabeller, triggere og funktioner.
  • Hærdede offentlige endpoints. Rate limiting og Zod-validering på alle API-ruter, der modtager kundedata.
  • Testet før lancering. Unit- og integrationstests med Vitest.

Efter lanceringen

Da en enkelt lodtrækning passerede 1.000 deltagere, blev dashboardet ved med at vise præcis 1.000. Årsagen var Supabases standardgrænse for, hvor mange rækker en forespørgsel returnerer. Vi flyttede optællingen ind i en PostgreSQL-funktion, der aggregerer på serveren og returnerer én række pr. lodtrækning i stedet for hver eneste deltager. Vi validerede det lokalt og sendte det derefter i produktion.

Leverancen omfattede en demo på stedet, en brugermanual og et overdragelsesdokument.

Resultater

  • 16.000

    deltagere

  • Flere filialer

    lodtrækninger på tværs af kundens stationer

  • I produktion

    med løbende support

Det tager vi med os

Projekter, der ser små ud, gemmer ofte på det egentlige krav. Her var det tillid. Vi gav en lodtrækningsapp samme sikkerhed, som vi ville give et betalingsflow, for for kunden er en lodtrækning, der føles fusket, værre end slet ingen lodtrækning.

Næste skridt

Har I en proces, der sidder fast?

Fortæl os om den, så designer vi værktøjet, der løser den.