Privacybeleid — Duimstok
Dit is een conceptversie. Het definitieve beleid, juridisch getoetst, volgt vóór de app in de winkel staat.
Dit beleid beschrijft wat Duimstok doet met gegevens van de vakman die de app gebruikt en van diens klant, wiens gesprek wordt opgenomen.
Rollen
De precieze verdeling van verwerkingsverantwoordelijkheid is een juridische afweging, geen feit dat uit de code volgt; het antwoord volgt nog. De praktische situatie is:
- De vakman voert het gesprek met zijn klant, vraagt vooraf toestemming voor de opname en vult de klantgegevens in. Voor die opname en die klantgegevens wordt de vakman behandeld als verwerkingsverantwoordelijke.
- De exploitant van Duimstok verwerkt die gegevens namens de vakman (transcriptie, extractie, prijsberekening, opslag) en is verwerkingsverantwoordelijke voor het account van de vakman zelf (e-mailadres, bedrijfsgegevens, prijzenboek).
Welke gegevens
Accountgegevens van de vakman — e-mailadres (uit Firebase Auth), bedrijfsnaam, KvK-nummer, btw-nummer, adres, telefoonnummer en het eigen uurtarief.
Klantgegevens — naam, adres, e-mailadres, telefoonnummer en notities van de klant bij wie de vakman een offerte opstelt, ingevuld door de vakman zelf.
De geluidsopname van het gesprek — de stem van de klant en alles wat in het gesprek gezegd wordt. Dit zijn gegevens van iemand die zelf geen gebruiker van de app is en vooraf om toestemming is gevraagd.
Tekeningen van de klus — een plattegrond of bouwtekening van de huidige of de gewenste situatie die de klant aan de vakman gaf, als afbeelding of pdf. Het stempel van een architect kan de naam en het adres van de klant dragen. Duimstok leest maten, ruimtes, symbolen en aantekeningen van de tekening af; die lezing wordt bij de tekening bewaard.
Wat uit de opname wordt afgeleid — het uitgetypte transcript, de daaruit geëxtraheerde werkomschrijving en hoeveelheden, de berekende offerte en de offerte-pdf.
De offerte op de klantpagina — de offerte gaat naar de klant als een link met een lange willekeurige code erin. Op die pagina ziet hij de omschrijving van het werk, de hoeveelheden, de prijzen per eenheid, de btw, het totaalbedrag, tot wanneer de offerte geldig is, de bedrijfsgegevens van de vakman en zijn eigen naam en adres zoals de vakman die heeft ingevuld. Hij ziet daar niet de geluidsopname, de uitgetypte tekst of de citaten uit het gesprek waar de offerteregels op rusten. Geeft hij akkoord of wijst hij de offerte af, dan worden zijn naam en het moment daarvan vastgelegd, en bij een afwijzing ook de reden als hij die opgeeft — dat veld is niet verplicht. Het moment waarop hij de offerte voor het eerst opent wordt één keer vastgelegd en daarna niet meer bijgewerkt; er wordt geen teller van latere keren bekeken bijgehouden.
De offertemail — mailt Duimstok de offerte naar de klant, dan wordt eerst een concept van die mail vastgelegd: het onderwerp, de tekst en het e-mailadres van de klant. De vakman keurt het concept goed voordat het verstuurd wordt. Meldt de mailprovider daarna dat de mail niet aankwam of als spam is gemeld, dan wordt die melding vastgelegd met het account, de mail waar hij over gaat, de soort melding en het moment — nooit met een e-mailadres.
De mails aan de klant — naast de offertemail kan Duimstok de klant namens de vakman een herinnering, een mail met vragen of een bevestiging van de start van het werk sturen. Die mails nemen dezelfde route als de offertemail — via Lettermint of vanuit de gekoppelde Gmail of Microsoft-mailbox van de vakman — en gaan pas weg nadat de vakman het concept heeft goedgekeurd.
De vragenpagina — heeft de vakman nog vragen voor zijn klant, dan krijgt de klant een link naar een pagina onder /vragen/ met een lange willekeurige code erin. Daar typt hij zonder account zijn antwoorden: hoogstens 10 antwoorden van elk hoogstens 1000 tekens. Die antwoorden worden namens de vakman verwerkt en komen bij hem terecht als voorstel dat hij zelf goedkeurt. Om te voorkomen dat iemand zo'n link raadt, geldt voor deze pagina dezelfde snelheidsbegrenzing als voor de offertepagina.
Berichten via WhatsApp — koppelt de vakman zijn eigen WhatsApp Business-nummer aan Duimstok, dan kan Duimstok de offerte, een herinnering, vragen en een startbevestiging ook via WhatsApp aan de klant sturen, steeds pas nadat de vakman het bericht heeft goedgekeurd. Wat de klant via WhatsApp terugstuurt, komt bij Duimstok binnen: tekst, spraakberichten en foto's, met zijn telefoonnummer, het moment en de bezorgstatus (verstuurd, afgeleverd, gelezen). Omdat de vakman zijn eigen nummer en zijn eigen WhatsApp-app blijft gebruiken, ziet Duimstok ook de berichten die hij zelf vanuit die app aan de klant stuurt; alleen één-op-één-gesprekken, nooit groepsgesprekken. Een spraakbericht wordt uitgetypt, een foto komt bij de klus, en een antwoord wordt een voorstel dat de vakman zelf goedkeurt — een bericht van de klant verandert nooit vanzelf de offerte. Een sjabloonbericht gaat alleen naar een klant die zelf eerst de vakman via WhatsApp schreef of van wie de vakman bevestigt dat hij akkoord gaf.
De thread met Duimstok — de berichten die de vakman aan Duimstok typt en de antwoorden van Duimstok, de uitgetypte woorden van beide kanten in een gesprek met Duimstok, en de kaarten die Duimstok daarbij laat zien. Daarnaast per bericht of gesprek een registratie van gebruik en kosten, zonder tekst. Van een gesprek dat een offerte wordt, blijven ook de woorden van Duimstok bij de klus bewaard.
Technische gegevens — crashmeldingen (Firebase Crashlytics), App Check/Play Integrity-signalen die verifiëren dat een verzoek van de echte app komt, het pushnotificatie-registratietoken van het apparaat van de vakman zelf (zodat de server weet waar hij een seintje naartoe moet sturen zodra de offerte klaarstaat) en per verwerkingsstap een registratie van het gebruikte model, het aantal tokens, de kosten en de duur. Die laatste registratie bevat geen gespreksinhoud. Om te voorkomen dat iemand geldige offertelinks kan raden, telt de server hoeveel verzoeken er bij het openen van een offerte binnenkomen. Die teller staat onder een onomkeerbare hash van het IP-adres van de bezoeker en van de link zelf — het adres en de link staan er niet leesbaar bij, en bij een IPv6-adres wordt alleen het netwerkdeel gehasht. Er hangt geen naam, account of klus aan zo'n teller, en hij vervalt een uur nadat hij begon en wordt daarna automatisch verwijderd.
Gegevens van een geïnteresseerde — het e-mailadres dat iemand op de website invult om een seintje te krijgen zodra de app beschikbaar is, het moment van versturen en waar het formulier stond. Alleen gebruikt om dat ene bericht te sturen, verder nergens voor. Hoe lang dit bewaard blijft, volgt nog.
Mail op het Duimstok-adres — laat de vakman Duimstok iets regelen bij een leverancier, bijvoorbeeld een puincontainer, dan krijgt zijn bedrijf een eigen mailadres bij Duimstok. Leveranciers antwoorden daarop, en soms gebruikt ook een klant dat adres. Van elke mail die daar binnenkomt, bewaart Duimstok de afzender, het onderwerp, de tekst, de bijlagen en de uitslag van de spamcontrole. Van mail die als spam of als vervalst wordt herkend, bewaart Duimstok alleen die gegevens over de mail, niet de tekst. Een mail van een onbekende afzender wordt niet door een taalmodel gelezen; de vakman beslist zelf wat ermee gebeurt. Alleen de tekst van een antwoord op een aanvraag van Duimstok gaat naar Anthropic, om er de beschikbaarheid, de datum, de prijs en eventuele vragen uit af te lezen. Bijlagen worden bewaard, maar door geen taalmodel gelezen en nooit doorgestuurd. Zoekt Duimstok de gegevens van een leverancier op, dan gaan alleen de bedrijfsnaam, de plaats en de soort leverancier de zoekopdracht in, nooit gegevens van een klant.
Doelen en grondslag
De gegevens worden verwerkt om een offerteconcept op te stellen die de vakman controleert voordat hij hem verstuurt. De klant wordt vóór de opname mondeling om toestemming gevraagd door de vakman zelf — de app dwingt dat af met een schakelaar in het opnamescherm, en de server weigert een opname zonder bevestigde toestemming. Naam en moment van akkoord op de klantpagina worden vastgelegd om te kunnen aantonen dát en wanneer de klant akkoord ging; een opgegeven reden van afwijzing zodat de vakman weet waarom; het eerste-open-moment zodat de vakman weet dat de offerte is aangekomen. Verder wordt er niets mee gedaan — geen profiel, geen bezoekersstatistiek. Crashmeldingen worden verwerkt om de app werkend te houden. Welke AVG-grondslag per verwerking precies geldt (toestemming van de klant voor de opname, uitvoering van de overeenkomst voor het account, gerechtvaardigd belang voor crashmeldingen) is een juridische afweging; het antwoord volgt nog.
Verwerkers en doorgifte
| Verwerker | Wat | Waar |
|---|---|---|
| Google/Firebase — Firestore, Storage, Cloud Functions | Account, klantgegevens, opname, transcript, offerte | EU (België) |
| Google/Firebase — Auth, Crashlytics, App Check | E-mailadres en account-ID, crashmeldingen, integriteitssignalen van het apparaat | Google's wereldwijde infrastructuur, niet regio-gebonden — verwerking buiten de EU is mogelijk |
| OpenAI | Transcriptie van de opname en van een ingesproken bericht, en het gesprek met Duimstok: de spraak zelf en het live uittypen ervan | Verenigde Staten, via subverwerkers |
| Anthropic | Extractie van werkomschrijving en hoeveelheden uit het transcript, het lezen van een tekening en het voorstellen van werk daaruit, de assistent Duimstok, het opstellen van mails aan de klant en het verwerken van antwoorden op open vragen, het lezen van antwoorden van leveranciers op het Duimstok-adres en het opzoeken van een leverancier op het web met alleen bedrijfsnaam, plaats en soort | Opslag altijd in de Verenigde Staten; de inferentie wisselt onder de standaardroutering tussen de Verenigde Staten, Europa, Azië en Australië, en een optie voor alleen de EU bestaat niet |
| GitHub | De foutmelding van een productiefout (functienaam en logboodschap), automatisch aangemaakt als issue bij herhaalde of ernstige fouten — nooit een opname, transcript of offerte | Verenigde Staten |
| Lettermint | Het e-mailadres en de naam van de klant en de offertemail zelf, wanneer Duimstok de offerte namens de vakman mailt; de mail aan en van leveranciers, en alle mail die binnenkomt op het Duimstok-adres van de vakman | Nederland |
| Google — Gmail | De offertemail en het adres van de klant, wanneer de vakman zijn eigen Gmail heeft gekoppeld en de offerte daarvandaan gaat | Google's wereldwijde infrastructuur — verwerking buiten de EU is mogelijk |
| Microsoft — Microsoft 365 en Outlook.com | De offertemail en het adres van de klant, wanneer de vakman zijn eigen Microsoft-mailbox heeft gekoppeld en de offerte daarvandaan gaat | Afhankelijk van het account van de vakman — verwerking buiten de EU is mogelijk |
| Meta — WhatsApp Business Platform (Cloud API) | De WhatsApp-berichten tussen de vakman en zijn klant, met het telefoonnummer van de klant, spraakberichten en foto's, wanneer de vakman zijn WhatsApp-nummer aan Duimstok heeft gekoppeld | Meta's wereldwijde infrastructuur — verwerking buiten de EU, ook in de Verenigde Staten, is mogelijk |
| Kadaster/PDOK — Locatieserver | Wat de vakman in het adresveld typt, om er een Nederlands adres bij te zoeken | Nederland |
Met OpenAI en Anthropic zijn de verwerkersovereenkomsten geaccepteerd. Bij beide is dat meegegaan met de voorwaarden bij het API-account zelf — geen los ondertekend document. Voor Anthropic staat de toezegging dat de invoer niet wordt gebruikt om modellen te trainen in de voorwaarden zelf: sectie B bepaalt dat Anthropic geen modellen mag trainen op de inhoud die een klant via de dienst aanlevert. Voor OpenAI staat diezelfde toezegging óók in de voorwaarden zelf: sectie 4.2 bepaalt dat OpenAI de aangeleverde inhoud alleen gebruikt om de dienst te leveren en niet om die dienst te ontwikkelen of te verbeteren — waar het trainen van modellen onder valt — tenzij de klant daar uitdrukkelijk mee instemt, en sectie 17 rekent zowel de invoer als de uitvoer tot die inhoud, dus ook de opname die de app voor transcriptie opstuurt. Bij een transcriptieverzoek gaat er geen toestemming voor zulk gebruik mee. Nog open: een zero-retention-aanvraag bij OpenAI (nooit automatisch, apart aan te vragen via support/sales).
Met Lettermint geldt de verwerkersovereenkomst automatisch voor elk account, via de voorwaarden bij het account zelf (https://lettermint.co/dpa) — net als bij OpenAI en Anthropic geen los ondertekend document; een tegengetekend exemplaar is optioneel aan te vragen.
Verwerking uitsluitend binnen de EU is niet gegarandeerd: voor een klant in de EER of Zwitserland wordt de overeenkomst met OpenAI aangegaan met OpenAI Ireland Ltd. in plaats van het Amerikaanse OpenAI OpCo, LLC, maar die contractpartij schakelt zelf subverwerkers in — waaronder Amerikaanse, zoals OpenAI OpCo, LLC zelf — die de daadwerkelijke verwerking mogen uitvoeren. Voor Anthropic is dit rechtstreeks nagevraagd bij Anthropic support: onder de standaardroutering global kan de inferentie plaatsvinden in de Verenigde Staten, Europa, Azië of Australië, de opslag gebeurt altijd in de Verenigde Staten, en een optie voor alleen de EU bestaat niet. Duimstok stelt de parameter inference_geo, waarmee die routering te kiezen is, nergens in, dus geldt de standaardroutering.
Het gesprek met Duimstok. Praat de vakman met Duimstok, dan gaat het geluid van zijn telefoon naar een doorgeefserver van Duimstok in de EU-regio en van daar rechtstreeks naar OpenAI, dat het gesprek voert met het model gpt-realtime en de woorden van de vakman live uittypt met gpt-4o-mini-transcribe. Naast het geluid gaan mee: de instructies voor Duimstok, de werkzaamheden uit het prijzenboek zonder bedragen — alleen omschrijving, eenheid en vak —, de context van de dag met de datum en klantnamen per stand van hun klus of mail, bij een gesprek over een klus de titel, de klantnaam, de fase en de open acties, en de laatste berichten uit de thread met Duimstok. Elke regel van die context en van die berichten wordt eerst nagekeken: staat er een bedrag, e-mailadres of telefoonnummer in, dan wordt de hele regel vervangen door een vaste tekst die zegt dat er iets is weggelaten; uit het prijzenboek valt een regel met een bedrag weg. Zoekt Duimstok tijdens het gesprek iets op, dan gaat ook dat resultaat mee, bijvoorbeeld de naam en het adres van een klant — nooit het e-mailadres of telefoonnummer. Wat de vakman zegt, wordt daarnaast als gewone opname bewaard. Moet er van het gesprek een offerte komen, dan typt OpenAI die opname net als die van een klantgesprek uit met whisper-1, zodat elke offerteregel naar het gesprek herleidbaar blijft; wordt het gesprek geen offerte, dan worden de opname en het gesprek gewist zodra het gesprek eindigt. Spreekt de vakman een bericht aan Duimstok in in plaats van het te typen, dan typt OpenAI het uit met whisper-1; dat geluid wordt niet bewaard.
De assistent bij Anthropic. Typt de vakman een bericht aan Duimstok, dan gaat dat naar Anthropic, samen met dezelfde nagekeken context van de dag en de laatste berichten uit de thread. Tijdens een gesprek roept de doorgeefserver Anthropic aan voor dezelfde hulpmiddelen. Laat de vakman Duimstok een offertemail, een herinnering, een mail met vragen of een startbevestiging opstellen, dan gaan alleen de naam van de klant, de bedrijfsnaam en de omschrijvingen van het werk naar Anthropic, en valt elke tekst met een cijfer daarin weg — nooit een e-mailadres of bedrag. Voor een vrije mail aan de klant gaan de naam van de klant, de bedrijfsnaam en wat de vakman wil zeggen in zijn eigen woorden mee, zonder filter vooraf; een concept dat terugkomt met een bedrag, een link of een e-mailadres erin wordt geweigerd. Een antwoord op een open vraag — van de vakman of van de klant op de vragenpagina — gaat zoals het getypt is naar Anthropic, samen met de vraag en de offerteregels zonder bedragen, om er een voorstel van te maken dat de vakman zelf goedkeurt.
WhatsApp bij Meta. Koppelt de vakman zijn WhatsApp-nummer, dan lopen de berichten tussen hem en zijn klant via het WhatsApp Business Platform van Meta naar Duimstok. De versleuteling van WhatsApp loopt daarbij tot de servers van Meta, die de berichten namens de vakman ontvangen en aan Duimstok doorgeven; Meta kan ze daar dus lezen. Duimstok stuurt via Meta alleen berichten die de vakman heeft goedgekeurd. Buiten 24 uur na het laatste bericht van de klant is dat altijd een vooraf door Meta goedgekeurd sjabloon, waarin de naam van de klant, de link naar de offerte, het totaalbedrag, de geldigheid of de startdatum door Duimstok zelf worden ingevuld — nooit door een taalmodel. Binnen die 24 uur kan het ook een gewoon bericht zijn dat Duimstok voor de vakman opstelde. Een spraakbericht van de klant gaat naar OpenAI om het uit te typen, net als een ingesproken bericht van de vakman; de tekst van een bericht van de klant gaat naar Anthropic om er een voorstel of een conceptantwoord van te maken, en een concept met een bedrag, een link of een datum erin wordt geweigerd. Duimstok gebruikt voor WhatsApp alleen de diensten van Meta voor het versturen en ontvangen van berichten, en deelt niets met Meta voor advertenties. Met welke Meta-entiteit de overeenkomst geldt, wat de verwerkersvoorwaarden van Meta voor dit platform precies toezeggen en welk mechanisme de doorgifte naar de Verenigde Staten dekt, volgt nog.
Welk mechanisme de doorgifte naar de Verenigde Staten dekt, verschilt per verwerker. Voor Anthropic noemt de verwerkersovereenkomst standaardcontractbepalingen (SCC's). Bij OpenAI verwerkt OpenAI Ireland Limited de gegevens uit de EER, met welke OpenAI-entiteit de overeenkomst ook is gesloten, en geeft die gegevens buiten de EER alleen door aan andere OpenAI-bedrijven of derden op basis van overeenkomsten met SCC's of van een adequaatheidsbesluit van de Europese Commissie. Schedule 1 §8 van diezelfde overeenkomst noemt Module Twee en Module Drie van de SCC's, maar alleen voor gegevens uit het Verenigd Koninkrijk (§4.2); voor gegevens uit de EER legt de overeenkomst niet vast welke module of welk adequaatheidsbesluit OpenAI Ireland Limited per doorgifte gebruikt.
De EU-regio staat alleen vast voor de servers, de database en de opslag. Firebase Auth, Crashlytics en App Check zijn niet aan een regio gebonden en draaien op Google's wereldwijde infrastructuur, dus ook mogelijk buiten de EU. De grondslag voor die doorgifte volgt nog.
Voor het adresveld wordt gebruikgemaakt van de PDOK Locatieserver van het Kadaster: alleen wat de vakman in dat veld typt gaat naar die dienst, samen met het gekozen suggestie-id, om er een adres bij te vinden. Er gaat geen naam, telefoonnummer, e-mailadres of opname mee, en de coördinaten die de dienst zou kunnen teruggeven worden nooit opgevraagd, dus ook nooit bewaard. Het is een open Nederlandse dienst van de overheid, zonder sleutel of account.
Gebruik van Google-gegevens
Koppelt de vakman zijn eigen Gmail, dan vraagt Duimstok bij Google alleen de toestemming gmail.send: uitsluitend versturen, namelijk de offertemail namens de vakman. Duimstok leest, doorzoekt, labelt of wijzigt geen enkel bericht in zijn mailbox en vraagt geen andere Gmail-toestemming aan. Daarnaast vraagt Duimstok openid en email, alleen om te weten welk e-mailadres er gekoppeld is.
Wat Duimstok daarvan bewaart, is de toegangssleutel waarmee de mail later verstuurd kan worden — het zogeheten refresh-token — en het e-mailadres van het gekoppelde account. Het token wordt versleuteld opgeslagen met een sleutel die in Cloud KMS wordt beheerd en staat alleen op de server, nooit in de app; het kortlevende toegangstoken dat Google per keer afgeeft wordt niet bewaard. Ontkoppelt de vakman zijn Gmail in de app, dan trekt Duimstok eerst de toegang bij Google in en verwijdert daarna het token en het adres.
Gegevens die Duimstok via Google-API's ontvangt, worden niet gebruikt voor advertenties, niet door medewerkers van Duimstok gelezen en niet gebruikt om modellen te trainen of te verbeteren. Ze dienen alleen om de offertemail namens de vakman te versturen.
Duimstok's use and transfer of information received from Google APIs to any other app will adhere to the Google API Services User Data Policy, including the Limited Use requirements.
Dat beleid van Google staat op https://developers.google.com/terms/api-services-user-data-policy.
Bewaartermijnen
De geluidsopname wordt na 90 dagen automatisch verwijderd — dat is de opslagregel — en de daadwerkelijke verwijdering door Cloud Storage kan tot ongeveer een dag later plaatsvinden. Het transcript, de extractie en de offerte worden na diezelfde 90 dagen, gerekend vanaf het gesprek, automatisch verwijderd door een dagelijkse opruimtaak — zo blijft elke offerteregel herleidbaar naar het gesprek zolang die zelf nog bestaat, en verdwijnt hij op hetzelfde moment als de opname waarnaar hij verwijst. Wat bewaard blijft: de klantgegevens, de notities van de vakman, de offerte-pdf die daadwerkelijk verstuurd is, de verstuurde offerteversie, het antwoord van de klant — akkoord of afwijzing — met zijn naam, het moment daarvan en een eventuele reden van afwijzing, het moment waarop hij de offerte voor het eerst opende, de foto's en de registratie van modelgebruik en kosten zonder gespreksinhoud. Deze gegevens vallen onder de administratie van de vakman en blijven daarom bewaard, net als de verstuurde pdf — dezelfde belofte die de app de klant zelf al doet. De 90 dagen blijven gelden voor de opname, het transcript, de extractie en de werkkopie van de offerte. Een verstuurde versie is daarmee een bevroren kopie van de offerteregels inclusief het korte citaat uit het gesprek waar elke regel op rust, en dat citaat blijft dus langer bewaard dan de 90 dagen die voor het transcript gelden; of dat zo moet blijven is een juridische afweging.
Wat Duimstok van een tekening heeft afgelezen, wordt na dezelfde 90 dagen, gerekend vanaf het moment dat de klus werd aangemaakt, gewist door dezelfde dagelijkse opruimtaak. Het bestand van de tekening zelf blijft bewaard als administratie van de vakman, net als de foto's.
Het onderwerp en de tekst van een offertemail worden 90 dagen nadat de mail is afgehandeld — verstuurd, geannuleerd, mislukt, verlopen of met onbekende afloop — automatisch gewist door dezelfde dagelijkse opruimtaak. Wat daarna blijft staan: het e-mailadres van de klant, de status, het moment van versturen, de link en de offerteversie waar de mail over ging, en een foutcode als het versturen misging. Een concept dat nog op goedkeuring wacht of net verstuurd wordt, wordt niet gewist. Een melding van de mailprovider over een mail die niet aankwam of als spam is gemeld, wordt na 30 dagen automatisch verwijderd; dat kan tot ongeveer een dag later gebeuren.
Elk bericht in de thread met Duimstok en elke registratie van gebruik en kosten daarvan wordt 90 dagen nadat het is geschreven automatisch verwijderd; dat kan tot ongeveer een dag later gebeuren. De woorden van Duimstok uit een gesprek dat een offerte werd en de vragen en antwoorden van de vragenpagina worden, net als het transcript, 90 dagen na het gesprek gewist door dezelfde dagelijkse opruimtaak. Wordt een gesprek met Duimstok geen offerte, dan worden de opname, de klus met de woorden van Duimstok en de uitgetypte woorden van dat gesprek in de thread gewist zodra het gesprek eindigt; alleen de registratie van gebruik en kosten blijft, ook die 90 dagen.
Een WhatsApp-bericht — tekst, foto, spraakbericht en de uitgetypte tekst daarvan — wordt 90 dagen nadat het binnenkwam of verstuurd werd automatisch verwijderd, ook de foto die bij de klus werd gezet. Wat de vakman en zijn klant in hun eigen WhatsApp hebben staan, blijft daar staan; Duimstok wist alleen zijn eigen kopie. Een voorstel dat uit een bericht ontstond en dat de vakman toepaste, maakt deel uit van zijn offerte en volgt de bewaartermijn van de offerte.
Een mail die binnenkomt op het Duimstok-adres — de tekst en de bijlagen — wordt 90 dagen nadat hij binnenkwam automatisch verwijderd. De zin uit zo'n mail die Duimstok als bron in de tijdlijn van een opdracht zette, en een afgelezen inkoopprijs, blijven staan zolang de opdracht bij de klus bestaat.
Rechten
De vakman en zijn klant hebben recht op inzage, correctie, verwijdering, bezwaar en dataportabiliteit. In de app kan de vakman een losse job — met opname, transcript, offerte en de verstuurde offerteversies — verwijderen via de verwijderknop bij een klus, of zijn hele account inclusief alle opnames verwijderen via de verwijderknop bij zijn account. Met een klus verdwijnen ook de offertemails die over die klus gingen. Net zo verdwijnen de woorden van Duimstok uit het gesprek over die klus, de vragen en antwoorden van de vragenpagina, en de berichten in de thread die bij die klus horen: de uitgetypte woorden van dat gesprek en de meldingen die Duimstok erover schreef. Berichten die de vakman los aan Duimstok typte, horen niet bij één klus; die blijven staan tot hun 90 dagen om zijn of tot het account wordt verwijderd. Met het account verdwijnen ook de hele thread met Duimstok, alle offertemails, de gekoppelde mailbox met de toegangssleutel ervan, en de meldingen van de mailprovider. Vóór dat verwijderen wordt de toegang tot een gekoppelde Gmail bij Google ingetrokken. Bij Microsoft kan dat niet: Microsoft biedt daar geen manier voor, dus Duimstok wist alleen zijn eigen, enige kopie van de sleutel; de vakman kan de app zelf uit zijn Microsoft-account verwijderen. Het ontkoppelen van een mailbox in de app doet hetzelfde voor die ene mailbox. Play vereist dat accountverwijdering ook buiten de app kan worden aangevraagd, via een webadres; dat webadres is /account-verwijderen (https://duimstok.web.app/account-verwijderen na een uitrol).
Ontkoppelt de vakman zijn WhatsApp-nummer in de app, dan meldt Duimstok zich bij Meta af voor dat nummer en wist het de toegangssleutel. Met het account verdwijnen de hele koppeling en alle WhatsApp-berichten; daarvóór verdwijnt elk bericht vanzelf na 90 dagen. De gesprekken in de WhatsApp-app van de vakman zelf blijven bestaan; die vallen niet onder Duimstok.
Met een klus verdwijnen ook de opdrachten die Duimstok voor die klus regelde, met hun tijdlijn. Met het account verdwijnen alle mail op het Duimstok-adres en de bijlagen ervan, en de leveranciers die de vakman bewaarde. Het Duimstok-adres zelf wordt nooit opnieuw uitgegeven: het blijft gereserveerd, maar zonder verwijzing naar de vakman.
Beveiliging
Status, transcript, extractie en de eerste offerte kunnen alleen door onze servers worden geschreven, nooit door de app zelf; de toegangsregels van de opslag dwingen dat af. Elk verzoek van de app aan de servers wordt met App Check gecontroleerd, zodat alleen de echte app iets kan vragen. API-sleutels staan uitsluitend op de server (Firebase Secret Manager) en komen nooit in de app terecht. De link naar de klantpagina bevat een willekeurige code die niet te raden is en vervalt na de geldigheidsdatum van de offerte; wie de link heeft kan de offerte bekijken, de klant heeft zelf geen account en komt niet bij de onderliggende database. Koppelt de vakman zijn boekhoudpakket — Moneybird, e-Boekhouden.nl, Jortt of straks SnelStart — dan worden de toegangssleutels van die koppeling uitsluitend op de server bewaard. Ze komen nooit op zijn telefoon terecht, ook niet als hij zelf is ingelogd, en worden gewist zodra hij zijn account verwijdert. De toegangssleutel van een gekoppeld WhatsApp-nummer wordt op dezelfde manier versleuteld bewaard als die van een gekoppelde mailbox, met een sleutel in Cloud KMS, en staat alleen op de server.
Contact
Vragen en klachten over dit beleid, en verzoeken om inzage, correctie of verwijdering, gaan naar support@duimstok.app; dat is ook het adres voor vragen over de app. Verwerkingsverantwoordelijke is Larij, handelend onder de naam Duimstok, KvK-nummer 86928953, postadres Salomeschouw 39, 2726 JN Zoetermeer. Een klacht kan ook worden ingediend bij de Autoriteit Persoonsgegevens.
Versie
Conceptversie van 17 oktober 2026.
Waar dit op gebaseerd is
- Privacybeleid — DRAFT — deze tekst in docs/PRIVACY.md is geschreven vanuit de repository en is niet juridisch getoetst; de publieke pagina wordt gegenereerd door tool/build-privacy-page.mjs naar website/public/privacy.html
- Rollen —
TODO (eigenaar/jurist) - Welke gegevens — users/uid/jobs/jobId/drawings, readJobDrawing
- Welke gegevens — sendQuote schrijft quoteVersions met shareToken en validUntil; de link volgt het pad /offerte/; de klantpagina zelf komt uit de reeks #561 t/m #568 en is nog in aanbouw
- Welke gegevens — users/uid/proposals; mailEvents geschreven door mailRelayWebhook
- Welke gegevens — approveProposal verstuurt reminder_mail, questions_mail en start_mail via functions/src/jobs/job-mail-send.ts
- Welke gegevens — functions/src/share/questions-view.ts; MAX_ANSWER_FIELDS en MAX_ANSWER_LENGTH in functions/src/share/questions-page.ts; de vragen en antwoorden staan in questionSets onder de klus; firestoreRateLimiter in functions/src/share/trigger.ts
- Welke gegevens — docs/design/whatsapp/technical-design.md, besluiten 44–50 in docs/design/agent-assistent/decisions.md; berichten onder customers/customerId/messages en de koppeling onder whatsapp/ zijn alleen door de server te schrijven, whatsappOptIn in firestore.rules; de koppeling zelf is in aanbouw in de reeks #1671
- Welke gegevens — assistantMessages en assistantEvents onder users/uid; turns onder jobs/jobId, geschreven door functions/src/realtime/session.ts
- Welke gegevens — rate-limit.ts telt in publicQuoteRateLimits, met een SHA-256-hash als document-id en een venster van RATE_LIMIT_WINDOW_MS; expireAt is het TTL-veld uit firestore.indexes.json
- Welke gegevens —
TODO (eigenaar/jurist) - Welke gegevens —
interestSignups, geschreven doorregisterInterest - Welke gegevens — §18 van docs/design/agent-assistent/technical-design.md en besluiten 88–114 in docs/design/agent-assistent/decisions.md; in aanbouw in de epic Zelfstandig regelen, issue #2211
- Doelen en grondslag —
createJob - Doelen en grondslag —
TODO (eigenaar/jurist) - Verwerkers en doorgifte — europe-west1
- Verwerkers en doorgifte — antwoord Anthropic support, 2026-08-31
- Verwerkers en doorgifte — issue #57, 2026-08-28
- Verwerkers en doorgifte — Anthropic Commercial Terms of Service, effective 2025-06-17, sectie B: "Anthropic may not train models on Customer Content from Services", geciteerd in issue #886 op 2026-08-31
- Verwerkers en doorgifte — OpenAI Services Agreement, effective 2026-01-01, sectie 4.2 "OpenAI Obligations": "OpenAI will not use Customer Content to develop or improve the Services, unless Customer explicitly agrees to such use", met sectie 17: "Customer Content" means the Input and the Output, aangeleverd door de eigenaar in issue #957 op 2026-09-04
- Verwerkers en doorgifte — functions/src/transcription/whisper.ts stuurt alleen het audiobestand, het model, de taal, het antwoordformaat en een prompt
- Verwerkers en doorgifte — antwoord Lettermint support, 2026-10-16, op issue #1305
- Verwerkers en doorgifte — issue #57, comment 2026-08-28
- Verwerkers en doorgifte — antwoord Anthropic support op een rechtstreekse vraag, 2026-08-31, issue #886
- Verwerkers en doorgifte — geen treffer voor inference_geo in de repository, nagekeken op 2026-09-29
- Verwerkers en doorgifte — functions/src/realtime/openai.ts; de relay draait op Cloud Run in europe-west1, tool/deploy-gateway.mjs
- Verwerkers en doorgifte — buildSessionConfig en priceBookCatalogue in functions/src/realtime/instructions.ts, safeText in functions/src/assistant/guard.ts, functions/src/assistant/context.ts
- Verwerkers en doorgifte — functions/src/assistant/customers.ts
- Verwerkers en doorgifte — functions/src/realtime/session.ts schrijft naar users/uid/recordings/jobId; finishConversationJob, discardConversationJob en sweepInterruptedConversations
- Verwerkers en doorgifte — dictateMessage in functions/src/assistant/dictate.ts
- Verwerkers en doorgifte — sendAssistantMessage met CLAUDE_MODEL claude-opus-5-5 in functions/src/extraction/claude.ts
- Verwerkers en doorgifte — mailDraftInput en jobMailDraftInput in functions/src/extraction/mail-draft.ts
- Verwerkers en doorgifte — functions/src/extraction/customer-mail-draft.ts met validateDraft
- Verwerkers en doorgifte — processQuestionAnswer in functions/src/jobs/question-answer.ts en functions/src/extraction/question-answer.ts
- Verwerkers en doorgifte — canSendFreeForm in functions/src/whatsapp/window.ts; §4 en §5 van docs/design/whatsapp/technical-design.md; in aanbouw in de reeks #1671
- Verwerkers en doorgifte —
TODO (eigenaar/jurist) - Verwerkers en doorgifte — de inschrijving bij Meta, issue #1672
- Verwerkers en doorgifte — issue #57, 2026-08-16
- Verwerkers en doorgifte — OpenAI Data Processing Addendum v.010126, §4.1 "EEA and Swiss Data": "it will do so on the basis of agreements containing SCCs that ensure appropriate safeguards for the protection of Customer Data are in place or an adequacy decision issued by the European Commission under Article 45 GDPR", aangeleverd door de eigenaar in issue #57 op 2026-08-30, verwerkt voor issue #886 op 2026-10-07
- Verwerkers en doorgifte —
europe-west1, gezet infunctions/src/index.ts - Verwerkers en doorgifte —
TODO (eigenaar/jurist) - Verwerkers en doorgifte — lib/services/address_suggestions.dart, issue #983 op 2026-09-04
- Gebruik van Google-gegevens — functions/src/mail/gmail.ts, GMAIL_SCOPES; de enige aanroep naar Gmail is users.messages.send
- Gebruik van Google-gegevens — sealSecret in functions/src/kms/envelope.ts met functions/src/kms/cloud-kms.ts; mailboxSecrets is voor elke client gesloten; mailbox bewaart status en adres; disconnectMailbox roept GOOGLE_REVOKE_URL aan vóór het verwijderen
- Bewaartermijnen —
storage.lifecycle.json - Bewaartermijnen —
purgeExpiredJobContent - Bewaartermijnen — recordConsentScriptBody
- Bewaartermijnen —
TODO (eigenaar/jurist) - Bewaartermijnen — purgeExpiredJobContent raakt quoteVersions niet
- Bewaartermijnen — purgeExpiredJobContent wist reading op de documenten in drawings
- Bewaartermijnen — purgeExpiredProposalDrafts draait in dezelfde dagelijkse taak als purgeExpiredJobContent; mailEvents.expireAt is het TTL-veld uit firestore.indexes.json, met het venster RELAY_HARD_BOUNCE_WINDOW_MS
- Bewaartermijnen — expireAt op assistantMessages en assistantEvents is het TTL-veld uit firestore.indexes.json, gezet op RETENTION_MS in functions/src/assistant/thread.ts
- Bewaartermijnen — purgeExpiredJobContent wist turns en questionSets
- Bewaartermijnen — discardConversationJob zet de kostenregel in assistantEvents en roept deleteJob aan; sweepInterruptedConversations ruimt een afgebroken gesprek later op
- Bewaartermijnen — besluit 50 in docs/design/agent-assistent/decisions.md; expireAt op messages is het TTL-veld uit firestore.indexes.json, gezet op WHATSAPP_MESSAGE_RETENTION_MS; de media en de foto bij de klus wist purgeExpiredWhatsAppMedia in dezelfde dagelijkse opruimtaak
- Bewaartermijnen — expireAt op inboundMail als TTL-veld en purgeExpiredInboundMail voor de bijlagen, §18.2 van docs/design/agent-assistent/technical-design.md; in aanbouw in de epic Zelfstandig regelen
- Rechten —
deleteJobdoet een recursieve verwijdering van het job-document, en verwijdert ook de bestanden van de tekeningen van die job uit de opslag - Rechten —
deleteAccount - Rechten — deleteJob verwijdert de proposals met dat jobId
- Rechten — deleteJob verwijdert de job recursief met turns en questionSets, en de assistantMessages met dat jobId
- Rechten — deleteAccount roept createMailboxTokenRevoker aan vóór het verwijderen en ruimt proposals, mailbox, mailboxSecrets, mailEvents, assistantMessages en assistantEvents op; disconnectMailbox doet dat per mailbox; microsoft.ts heeft geen revoke-endpoint
- Rechten — disconnectWhatsApp en deleteAccount in §3 van docs/design/whatsapp/technical-design.md; in aanbouw in de reeks #1671
- Rechten — deleteProject en deleteAccount in §18.2 van docs/design/agent-assistent/technical-design.md, het register mailAddresses houdt het adres zonder uid; in aanbouw in de epic Zelfstandig regelen
- Beveiliging — mintShareToken met randomBytes 32 en validUntil; quoteVersions is alleen leesbaar voor de eigenaar
- Beveiliging — integrationSecrets is voor elke client gesloten, lezen noch schrijven; account verwijderen ruimt de hele subboom onder users/uid mee op, inclusief die geheimen
- Beveiliging — whatsapp/ in firestore.rules is voor de app niet te schrijven; de sleutel zelf staat in een document dat de app ook niet kan lezen, §3 van docs/design/whatsapp/technical-design.md
- Versie — opgesteld voor issue #137, gecorrigeerd voor issue #183 — de EU-claim gold ten onrechte ook voor Auth, Crashlytics en App Check — taalkundig gecorrigeerd voor issue #454, aangevuld voor issue #486 — het contactadres, aangevuld voor issue #568 — de klantpagina, aangevuld voor issue #601 — de snelheidsbegrenzing, aangevuld voor issue #631 — de boekhoudkoppeling, bijgewerkt voor issue #57 — de verwerkersovereenkomsten met OpenAI en Anthropic, gecorrigeerd voor issue #832 op 2026-08-30 — de verwerkingslocatie van Anthropic en het doorgiftemechanisme, gecorrigeerd voor issue #833 op 2026-08-30 — de onbewezen bewering over de inhoud van die overeenkomsten, gecorrigeerd voor issue #543 op 2026-08-30 — het contactadres is
duimstok.appgeworden, nietduimstok.nl, bijgewerkt voor issue #899 op 2026-09-01 — de toezegging dat Anthropic niet op klantdata traint is vastgesteld met brontekst; voor OpenAI blijft het een aanname zonder brontekst, aangevuld voor issue #983 op 2026-09-04 — de adressuggestiedienst van het Kadaster, bijgewerkt voor issue #957 op 2026-09-04 — de toezegging dat OpenAI de invoer niet voor het ontwikkelen of verbeteren van de dienst gebruikt is vastgesteld met brontekst, aangevuld voor issue #1339 op 2026-09-27 — de offertemail, de bewaartermijn van de mailtekst en het verwijderen van mailbox en meldingen van de mailprovider, aangevuld voor issue #1558 op 2026-09-29 — de Limited Use-verklaring voor Google-gegevens, aangevuld voor issue #1550 op 2026-09-30 — het gesprek met Duimstok, de assistent, de vragenpagina en de mails aan de klant, en de verwerkingslocatie van Anthropic vastgesteld met het antwoord van Anthropic support van 2026-08-31, aangevuld voor issue #1685 op 2026-10-03 — WhatsApp als kanaal, Meta als verwerker, en de bewaartermijn van WhatsApp-berichten uit besluit 50, bijgewerkt voor issue #886 op 2026-10-07 — het doorgiftemechanisme van OpenAI vastgesteld met §4.1 van de OpenAI-verwerkersovereenkomst, aangevuld voor issue #1801 op 2026-10-07 — de reden van afwijzing op de klantpagina, aangevuld voor issue #2014 op 2026-10-10 — tekeningen van de klus, het lezen ervan bij Anthropic, de bewaartermijn van de lezing en het verwijderen van tekeningen, aangevuld voor issue #2140 op 2026-10-13 — de verwerkingsverantwoordelijke, het KvK-nummer en het postadres, aangeleverd door de eigenaar in issue #1305, aangevuld voor issue #2211 op 2026-10-14 — mail op het Duimstok-adres van klanten en leveranciers, het lezen van antwoorden van leveranciers en het opzoeken van een leverancier bij Anthropic, Lettermint als ontvanger, en de bewaartermijn van 90 dagen voor die mail en de bijlagen, bijgewerkt voor issue #2344 op 2026-10-17 — de verwerkersovereenkomst met Lettermint via de accountvoorwaarden