Beveiliging
Waar je gegevens staan, hoe we ze versleutelen, wie erbij kan en met welke sub-verwerkers we werken. Precies het soort regels dat je óók in de privacyverklaring verwacht; die pagina linkt hiernaartoe en herhaalt het niet meer.
1. Waar je gegevens staan
BTW Vriend is een webapplicatie. Je browser praat met de app op app.btwvriend.nl, de app praat met een database binnen de Europese Unie. Je ziet drie dingen aan de techniek:
- App-hosting op Vercel. Hier draait de code die jij in je browser gebruikt.
- Database en bestanden op Supabase (PostgreSQL 15), in een Europese regio. Je facturen, bonnen en bankregels staan daar.
- Transport over HTTPS met HSTS van twee jaar (
max-age=63072000; includeSubDomains). Daarbovenop stuurt elke pagina een Content-Security-Policy mee die bepaalt welke scripts, iframes en verbindingen mogen laden. We draaien die policy zowel enforcend als in report-only, zodat we drift zelf in de gaten houden.
Verder stuurt elke pagina een strikte set browser-headers mee: X-Frame-Options: DENY (jouw pagina niet in een frame bij iemand anders), X-Content-Type-Options: nosniff, een restrictieve Referrer-Policy en Permissions-Policy. Dat voorkomt een hele categorie klikfraude- en meelezen-trucs.
2. Back-ups en herstel
Je gegevens zijn op drie manieren gedekt tegen verlies:
- Supabase draait automatische back-ups van het beheerde Postgres-cluster. Dat gebeurt los van jou en los van ons.
- Elk kwartaal doen we een hersteltest: een back-up wordt in een los project teruggezet en één administratie wordt vergeleken op uitgaven, facturen, bankregels en rubriek-sommen. Zo weten we dat de back-up terug te zetten is, niet alleen dat hij er is.
- Een nachtelijke canary loopt om 03:30 UTC door balans, rubrieken en tabel-integriteit, en belt indien iets niet klopt.
Jij hebt daarnaast je eigen export: via Instellingen → Gegevens vraag je een ZIP aan met 25 tabellen en twee bestandsmappen (receipts/ en invoices/). Dat is de AVG-export; hij is volledig genoeg om je boekhouding in een ander pakket te herbouwen.
3. Versleuteling
- Onderweg: TLS/HTTPS op elke verbinding. Niemand leest mee tussen jouw browser en de app.
- In rust: versleutelde opslag in de database (encryption at rest). Bonnen en factuur-PDF's leven in privé-buckets; links naar die bestanden verlopen na één uur.
- Betalingen: creditcard- of bankgegevens staan nergens bij ons. Betalingen gaan via Stripe; wij zien alleen de abonnementsstatus.
4. Wie erbij kan
Je logt in met e-mailadres en wachtwoord via Supabase Auth. Jouw administratie is afgeschermd met Row Level Security op databaseniveau: ook als iemand ergens anders zou proberen in te breken op de query-laag, krijgt die geen gegevens van een andere gebruiker te zien.
- Admin-accounts hebben TOTP (tweefactor) verplicht, afgedwongen op AAL2. Een admin zonder tweede factor komt niet verder dan het inschrijfpad. Herstelcodes bestaan uit zes codes, zijn gehasht opgeslagen en zijn niet terug te lezen.
- Admin-tokens staan in
sessionStorage, niet inlocalStorage. Een CI-regel waakt dat die keuze niet per ongeluk teruggaat. - Secrets (API-sleutels, service-accounts) leven in Supabase Vault en in de Vercel-omgevingsvariabelen, en op lokale machines alleen in
~/.config/btwvriend-secrets/met rechten 0600. Nooit in de repo, nooit in chat, nooit in configbestanden. We draaien elk kwartaal een rotatie.
5. Wat we bij een incident doen
Zie je iets dat niet klopt (een vreemde mail, iets vreemds in je overzicht, een foutmelding die blijft terugkomen)? Mail support@btwvriend.nl. Je krijgt op werkdagen tussen 9 en 17 uur dezelfde dag antwoord.
Komen jouw persoonsgegevens door een datalek bij ons in beeld, dan volgen we de AVG-meldingsplicht: binnen 72 uur bij de Autoriteit Persoonsgegevens en, als jouw gegevens zijn geraakt, bij jou. Daarbovenop houden Supabase en Vercel ieder hun eigen incidentproces, waarvan de uitkomst naar ons terugkomt.
6. Sub-verwerkers
Dit zijn de partijen die namens BTW Vriend een deel van je gegevens verwerken. Elke partij werkt onder een verwerkersovereenkomst (zie /verwerkersovereenkomst).
| Partij | Rol | Regio |
|---|---|---|
| Supabase | Database (Postgres 15), auth, bestandsopslag, edge functions, vault | EU |
| Vercel | App-hosting (frontend, headers, CSP) | n.v.t. |
| OpenAI | AI (GPT-4o) voor Bram-chat, categorie-voorstel en bonnen-scan. Elke call draait met store: false. | VS |
| Resend | Transactionele e-mail (facturen, herinneringen, systeemmail) | Ierland (EU) |
| Stripe | Abonnementsbetalingen (iDEAL, SEPA, kaart), Checkout en Billing-portal | EU-entiteit |
| Umami (self-hosted op Vercel) | Website-analytics zonder cookies en zonder persoonsgegevens; alleen op btwvriend.nl, niet in de app | EU |
7. Verder lezen
- Privacyverklaring : welke gegevens we verwerken en op welke grondslag.
- Verwerkersovereenkomst : hoe wij als verwerker omgaan met de persoonsgegevens die jij in BTW Vriend zet.
- Bram : wat Bram doet, met welke gegevens, en hoe je toestemming geeft of intrekt.
- Koppelingen : hoe je bankregels, bonnen en facturen in BTW Vriend krijgt.