Ga naar hoofdinhoud

BetMetrics

Weten of je goed gokt, of alleen geluk had.

betmetrics.eu/dashboard

Dashboard

Laatste 90 dagen

Net P&L

+ € 1.284

sinds 1 jan

ROI

6,4 %

op € 20.100 inzet

Strike Rate

41,7 %

132 van 317

Avg Odds

2,64

decimaal

Bankroll

Gespeelde dagen

Gevuld = gespeeld · groen = winst

Nagebouwd uit de codebase, met demodata — de echte schermen zitten achter een login. Labels, indeling en kleuren zijn die van het product.
Klant
BetMetrics — eigen product
Jaar
2026
Rol
Productontwerp, Datamodel, Frontend, Backend, OCR-integratie
Sector
Sportweddenschappen — performance-analyse

Gebruikte technologie

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • Supabase
  • PostgreSQL
  • Supabase Edge Functions
  • Claude (vision)
  • Zustand
  • Recharts
  • Radix UI

De uitdaging

Wie serieus op sport wedt, weet meestal niet of hij wint. Hij weet wat er op zijn bookmakeraccount staat, en dat is iets anders: dat saldo verzwijgt hoeveel je hebt ingelegd, hoe vaak je stortte, en of de winst uit inzicht kwam of uit één meevaller.

Het antwoord daarop is bijhouden, en daar loopt het altijd stuk. Een weddenschap heeft een sport, een competitie, een wedstrijd, een markt, een selectie, een quotering, een inzet, een bookmaker en een uitslag die pas uren later binnenkomt — en bij een combinatiebet geldt dat voor elk been apart. Dat handmatig in een spreadsheet zetten houdt niemand vol. De spreadsheet stopt na drie weken, en daarmee stopt het antwoord ook.

Strategie

Het knelpunt is de invoer, niet de analyse. Rekenen kan software prima; het probleem is dat er niets te rekenen valt als niemand zijn weddenschappen invoert. Alle belangrijke keuzes in dit product volgen daaruit.

De invoer is een screenshot. Van je betslip heb je al een foto — die maak je toch. Die gaat naar een Supabase Edge Function die hem door een vision-model haalt en er de losse velden uit terugleest: datum, sport, wedstrijd, markt, selectie, quotering, inzet, bookmaker, en bij een combinatie ook elk been afzonderlijk.

Maar het model krijgt niet het laatste woord. Elk gelezen veld komt terug mét een betrouwbaarheidsscore, en belandt in een formulier dat je bevestigt in plaats van in de database. Daarbovenop legt de historietabel per wijziging vast waar een waarde vandaan kwam — OCR, handmatig, import of CSV. Bij een product waar de cijfers het hele punt zijn, moet je van elk getal kunnen navertellen hoe het er is gekomen.

Er wordt bewaard wat pijnlijk is, niet alleen wat vleit. Per weddenschap gaat de slotquotering mee, waardoor closing line value te berekenen is: heb je ingezet tegen een betere prijs dan de markt uiteindelijk gaf. Dat is de maat die geluk van inzicht scheidt. In dezelfde geest staat er een Z-score naast je rendement, met het label erbij: significant, niet significant, of simpelweg "te weinig weddenschappen". Een tracker die je na twintig bets vertelt dat je een winnaar bent, is een tracker die liegt.

Het bankroll is een grootboek, geen getal. Stortingen en opnames staan als losse transacties met het saldo erna, zodat rendement en maximale terugval blijven kloppen op het moment dat je geld bijstort.

Het werkt op de telefoon met slecht bereik. Weddenschappen worden ingevoerd in het café en in het stadion, niet achter een bureau. Mutaties die niet weg kunnen, gaan in een wachtrij op het toestel zelf en worden later alsnog verstuurd.

Ontwerp & interface

Een donkere, dichte interface met winst in groen en verlies in rood — de enige plek waar kleur betekenis draagt, en overal ondersteund door het getal zelf, zodat de aflezing niet van kleur afhangt.

Op mobiel een balk onderin, op desktop een zijbalk: dezelfde routes, maar bereikbaar met de duim waar dat moet. Het dashboard opent met vier kerncijfers — netto resultaat, rendement, trefpercentage, gemiddelde quotering — en daaronder de kapitaalcurve en een kalender die per dag laat zien of er gespeeld is en wat het opleverde.

De uitgebreide statistieken staan bewust op een eigen pagina. Sharpe-ratio, standaarddeviatie, maximale terugval en CLV horen erbij, maar niet op het scherm waar je binnenkomt.

betmetrics.eu/stats

Z-Score

1,12

Oordeel

Need more bets

317 weddenschappen is te weinig om dit rendement significant te noemen

Yield

6,4 %

Total Stakes

€ 20.100

Units W/L

+ 12,8

Max Drawdown

− € 940

Sharpe Ratio

0,42

Std Dev (Returns)

1,83

Avg CLV

+ 1,9 %

Total EV

+ € 780

Avg Hold Time

31 u

Cashout Impact

− € 112

Rendement per sport

Voetbal+ 8,1 %
Tennis+ 2,4 %
Basketbal− 3,7 %
IJshockey− 9,2 %
Nagebouwd uit de codebase, met demodata. Dezelfde functie levert het rendement per sport, per bookmaker of per markt — segmenteren werkt over elk veld van een weddenschap.

Add Bet

Upload a bet slip for OCR or fill in manually

Bet slip parsed. Review and save below.

Bet Details

Date

2026-09-14

Bet Type

Single

Sport

Football

Competitie

Premier League

Event

Man City vs Arsenal

Markt

Match Winner

Selectie

Man City

Odds (Decimaal)

1.85

Inzet

€ 25,00

Bookmaker

Bet365

Save Bet

Nagebouwd uit de codebase — demodata

Bets

AllOpenWonLostCashout
WonFootball

Man City

Man City vs Arsenal

+ € 21,25

LostFootball

Over 2.5 goals

PSV - Ajax

− € 15,00

CashoutTennis

Sinner to win

Sinner vs Alcaraz

+ € 8,40

OpenBasketbal

Lakers -4.5

Lakers vs Celtics

Unsettled

Nagebouwd uit de codebase — demodata

Bouw & techniek

Next.js met de App Router; alles achter de login zit in een eigen routegroep met Supabase voor authenticatie, database en opslag. Rijbeveiliging staat in de database zelf aan, dus een gebruiker kan alleen zijn eigen weddenschappen opvragen — dat is een regel in Postgres en niet een controle in de frontend die je kunt omzeilen.

De vision-aanroep loopt via een Supabase Edge Function in plaats van vanuit de browser. Daardoor blijft de API-sleutel serverkant en kan een gebruiker hem niet uit de netwerkinspectie plukken.

Alle statistiek zit in één losse, pure module: winst, rendement, yield, trefpercentage, gemiddelde quotering, units, standaarddeviatie, Sharpe, kapitaalcurve, maximale terugval, Kelly, CLV, verwachte waarde, Z-score, gemiddelde houdtijd en de invloed van cashouts. Los van React, los van de database, dus per functie te controleren — wat nodig is, want dit is de rekenkern waar een gebruiker beslissingen op neemt.

Segmentatie werkt over elk veld van een weddenschap. Dezelfde functie levert je rendement per sport, per bookmaker of per markt, zonder dat daar per segment een query voor geschreven hoeft te worden. Import en export gaan via CSV, zodat je eigen data er ook weer uit kan.

Resultaat

Er staan ruim 7.000 gebruikers op het platform.

Dat is het enige cijfer dat we hier noemen. Wat mensen met hun eigen data doen weten we niet, en dat is ook niet aan ons: het product laat expres zien wanneer een reeks te kort is om iets uit te concluderen, en dan past het ons niet om over onze eigen cijfers wél grote uitspraken te doen.

Volgende case

04

Havenlijn

Volgende stap

Vertel wat je wilt bouwen.

Eén gesprek van een half uur is meestal genoeg om te weten of het kan, wat het ongeveer kost en hoe lang het duurt.