Hoe dit gebouwd is

Beveiliging en je gegevens

Laatst bijgewerkt: 28 augustus 2026 · Deze pagina beschrijft hoe het product vandaag werkt, niet hoe we willen dat het werkt

Je geeft een website je beleggingsgeschiedenis, dus je hebt er recht op te weten wat daarmee gebeurt. Deze pagina vertelt wat we opslaan, wat we nooit zien, hoe je account beschermd is en waar alles draait. Waar iets zwakker is dan je zou aannemen, staat dat er ook.

We komen nooit bij je brokeraccount

Er zit nergens in het product een broker-login. Je downloadt zelf een export bij je broker en uploadt dat bestand. We vragen nooit om een brokerwachtwoord, we hebben geen token en geen API-sleutel voor je account, en geen enkel stuk code kan een order plaatsen, geld verplaatsen of je saldo bij de broker lezen. Dat is een eigenschap van hoe het product gebouwd is, geen belofte over ons gedrag: de verbinding bestaat niet.

Wat we uit een export bewaren

Een broker-export is een brede tabel. We lezen een vaste set kolommen en bewaren één regel per transactie, met deze velden: de datum en tijd, het type, de ISIN, het tickersymbool, de productnaam, het aantal, de koers, de valuta, het bedrag, het bedrag omgerekend naar euro's, de kosten, de gebruikte wisselkoers en één vrij tekstveld. Dat laatste veld is de omschrijvingsregel die je broker op de regel zet, bijvoorbeeld een notitie bij een dividend of bij een corporate action, en hij wordt afgekapt op 500 tekens.

Elke regel gaat door een controlestap voordat hij wordt opgeslagen. Een ISIN die niet de vorm van een ISIN heeft, wordt niet als tekst bewaard maar vervangen door een sleutel die van het tickersymbool is afgeleid. Een valutacode die geen geldige ISO 4217-code is, wordt leeggemaakt in plaats van opgeslagen. Namen en notities worden ingekort en ontdaan van besturingstekens. Datums buiten een verstandig venster worden er weer binnen getrokken. Die stap bestaat om te voorkomen dat een vreemde export de berekening breekt, en heeft als bijeffect dat ongewone inhoud in een kolom niet ongeschonden in de database terechtkomt.

Upload je ook een portefeuille-overzicht, de momentopname van wat je nu bezit, dan bewaren we vijf dingen per regel: de instrumentsleutel, de naam, het aantal, de koers en de waarde. Elke andere kolom in dat bestand wordt genegeerd.

Het bestand zelf bewaren we niet. Het wordt in het geheugen gelezen en daarna losgelaten; wat overblijft is de bestandsnaam, de broker die herkend is, het aantal regels en eventuele waarschuwingen, zodat je uploadgeschiedenis leesbaar is.

Wat we nooit krijgen

We krijgen nooit een brokerwachtwoord of een broker-login. Kaartgegevens gaan naar Stripe en bereiken onze servers nooit. Het product vraagt nooit om je naam, je adres, je geboortedatum of een bankrekeningnummer, en de importeurs lezen die kolommen niet, ook niet als een broker ze in het bestand zet. Het enige persoonlijke gegeven dat het account nodig heeft is een e-mailadres, naast je taal- en valutavoorkeur.

Er is één uitzondering die genoemd moet worden. Voor een bestandsformaat dat we niet herkennen, wijs je de kolommen één keer zelf toe. Die kolommapper bewaart precies de kolommen die je aanwijst, dus wijs je een kolom aan waar iets persoonlijks in staat, dan is dat wat er wordt opgeslagen.

Wachtwoorden en sessies

Je kunt op drie manieren inloggen: met Google, met een e-mailadres en een wachtwoord, of met een inloglink die we je mailen, en dan is er helemaal geen wachtwoord. Stel je wel een wachtwoord in, dan wordt het opgeslagen als een PBKDF2-HMAC-SHA256-hash met 480.000 iteraties en een verse willekeurige salt per wachtwoord. Het wachtwoord zelf wordt nergens vastgelegd. Het aantal iteraties staat in de hash zelf, zodat het later omhoog kan zonder iemand buiten te sluiten: een oude hash wordt stil vervangen zodra die persoon de volgende keer inlogt. De minimumlengte is 10 tekens, en één IP-adres krijgt 25 wachtwoordpogingen per uur.

Een sessie is een ondertekende cookie. Hij is HttpOnly, dus geen enkel script kan hem lezen, hij is SameSite=Lax, en hij is Secure zodra de site over https draait, wat in productie altijd zo is. Hij gaat 180 dagen mee en wordt ververst zolang je de app blijft gebruiken. In de cookie zit ook een teller die bij je account hoort, en uitloggen verhoogt die teller, dus uitloggen beëindigt elke sessie die je waar dan ook hebt en niet alleen die vóór je neus.

Onderweg en in de browser

De site wordt over https geserveerd. Hij stuurt Strict-Transport-Security mee met een max-age van een jaar inclusief subdomeinen, zodat een browser die de site eenmaal heeft gezien het niet opnieuw over gewoon http probeert. De content security policy laat alleen scripts van ons eigen domein toe, en daarom staat er geen enkel script van derden op de site of in het dashboard. Inframen wordt geweigerd via zowel X-Frame-Options als frame-ancestors, content-type-sniffing staat uit, de referrer wordt bij navigatie naar een andere site ingekort, en locatiebepaling, microfoon en camera worden geweigerd. Twee dingen verlaten de pagina richting een andere partij. Het lettertype wordt bij Google Fonts opgehaald, en browserfouten gaan naar Sentry in zijn Europese regio, zodat een pagina die het bij jou begeeft voor ons zichtbaar is. Sentry staat samen met de andere verwerkers in het privacybeleid genoemd.

Waar het draait

De API, beide geplande taken en de database met zijn volume draaien op Railway in EU West Metal, Amsterdam (europe-west4-drams3a), en dat is sinds 28 augustus 2026 zo. De website wordt door Vercel geserveerd, het netwerk loopt via Cloudflare, betalingen gaan via Stripe en e-mail via Resend. Wie van hen wat verwerkt staat in het privacybeleid.

Wat een deellink laat zien, en wat niet

Een deellink is optioneel en staat uit tot je hem aanzet. Doe je dat, dan wordt een willekeurige token het adres van een pagina die alleen te lezen is; zet je hem uit, dan is dat adres meteen ongeldig.

Bezoekers zien je posities en hoe die het deden, niet je kassaldo of je stortingen. Het is de moeite waard precies te zijn over wat die zin dekt. De pagina verbergt je kassaldo, hij verbergt elke inleg die je hebt gedaan, en hij verbergt de totalen die daaruit berekend worden. Wat hij niet verbergt is de waarde van elke positie: elke positie wordt gedeeld inclusief het bedrag in euro's, dus wie de link heeft kan die bedragen optellen en komt zo uit op de waarde van je belegde portefeuille. Is dat een getal dat je liever niet publiceert, zet de link dan niet aan.

De voorbeeldafbeelding die chat-apps en sociale netwerken bij een deellink tonen, bevat alleen percentages.

Je gegevens meenemen, en ze verwijderen

Exporteren is één knop onder Accountinstellingen. Je krijgt alles als JSON: je accountgegevens, elke opgeslagen transactie met al zijn velden, je uploadgeschiedenis en je instellingen.

Verwijderen is ook één knop, met een getypte bevestiging. Het haalt je transacties, uploads, opgeslagen kolommappings, portefeuille-momentopnames, beginposities, instellingen en het account zelf weg. Twee kleine registers blijven met opzet staan, en allebei bevatten ze niets anders dan een onomkeerbare gezouten hash van je e-mailadres plus de datum waarop een gratis proefperiode begon. Het ene wordt na een jaar opgeruimd; het andere blijft, omdat een register dat verloopt dezelfde persoon een oneindige reeks gratis proefperiodes zou geven. Geen van beide is terug te rekenen naar een adres.

Aanmelden en misbruik

Registreren met een wegwerp-e-maildomein wordt geweigerd, tegen een blocklist van 8.335 domeinen. Doorstuur- en aliasdiensten worden eerst gecontroleerd en zijn uitdrukkelijk toegestaan: Apple Hide My Email, Firefox Relay, DuckDuckGo, SimpleLogin en addy.io werken gewoon, omdat de mensen die ze gebruiken precies de mensen zijn voor wie deze pagina geschreven is.

Wat we niet met je gegevens doen

Er zijn geen advertenties en we verkopen geen gegevens. Nergens op de site staat een analysedienst van derden, een trackingpixel of een advertentiecookie; de content security policy hierboven zou er een blokkeren als die per ongeluk werd toegevoegd. Sentry ontvangt foutmeldingen, nooit paginaweergaven. Wat we wel meten zijn zes mijlpalen per account, bijvoorbeeld dat er een eerste bestand is geüpload en dat de vergelijking is getoond, vastgelegd op onze eigen servers als een mijlpaal en een datum. Je abonnement is wat dit betaalt.

Een beveiligingsprobleem melden

Mail naar security@bullbenchmark.com met wat je gevonden hebt en hoe je het nadoet. Dat adres wordt door een mens gelezen en je krijgt antwoord. Twee verzoeken: draai geen geautomatiseerde scans op de live dienst, en gebruik niet het account of de gegevens van iemand anders om een vondst te laten zien. Een beschrijving is genoeg om het zelf na te doen.

Vragen die geen beveiligingsmelding zijn gaan naar support@bullbenchmark.com. Wat we juridisch met persoonsgegevens doen staat in het privacybeleid; de overeenkomst zelf staat in de algemene voorwaarden.