# Wat ik van jou nodig heb (hosting / accounts / beslissingen)

> Levend document. Ik bouw zoveel mogelijk **om deze items heen** (seams/stubs), zodat
> aansluiten later alleen config is. Vul aan / lever aan waar je kunt; ik vink af.
> Legenda: ⛔ blokkeert · 🟡 nice-to-have / kan later · ✅ ontvangen.

_Laatst bijgewerkt: 2026-08-05 (§6 en §7b herschreven na de prijs-, trial- en Play-besluiten van die dag; de overige paragrafen zijn van 2026-07-08/11)._

---

## 1. Crash reporting (Wave 1 · S1) — ✅ KLAAR
- **Gedaan:** Sentry-project **`aqua-it-bv/mijn-pa`** (platform Flutter) aangemaakt via je `SENTRY_AUTH_TOKEN`; DSN opgehaald en in `~/.zprofile` als **`SENTRY_PA_DSN`** gezet; een test-event verstuurd en geverifieerd dat het binnenkomt (daarna resolved). Build-commando's geven `--dart-define=SENTRY_DSN=$SENTRY_PA_DSN` mee; de app schakelt de `SentryCrashReporter` automatisch in.
- **Optioneel later:** dSYM/Dart-symbol-upload in CI (sentry-cli) voor symbolicatie van release-builds; release/version-tagging.
- **✅ Afgerond 2026-08-15:** `SENTRY_PA_DSN` staat gezet en wijst naar de **EU-regio** (`o4511903858229248.ingest.de.sentry.io`, organisatie `aqua-it-bv-eu`). Crashrapportage werkt aantoonbaar — geverifieerd met een echte crash op 15 augustus 2026. De eerdere correctie van 25 juli ("er komt geen crashrapportage binnen") en de opmerking over de VS-regio zijn daarmee achterhaald. Zie TEN-228; de BYO-kant loopt via BYO-337.

## 2. Product-analytics (Wave 2 · N5) — ✅ KLAAR (op consent na)
- **Gedaan:** dedicated **PostHog-project "Mijn PA"** (id 201939, **EU**) dat jij aanmaakte; key + host in `~/.zprofile` (`POSTHOG_PA_KEY` / `POSTHOG_PA_HOST=https://eu.i.posthog.com`). `PosthogAnalytics` gewired achter de `analyticsProvider` (privacy-defaults: geen autocapture/lifecycle/replay, anonieme profielen). Test-event geverifieerd in het project. Build-commando's geven `POSTHOG_KEY`/`POSTHOG_HOST` mee.
- **Nog te beslissen vóór publieke release:** een **opt-in consent-gate** (AVG) — nu actief op de eigen/beta-builds waar de key wordt meegegeven. Ik bouw de consent-toggle wanneer we de release-/privacy-flow doen.
- **⚠️ Correctie 2026-07-25:** de consent-gate **bestaat al** — `analyticsConsent` staat standaard op `false` en `ConsentGatedAnalytics` blokkeert elk event. Maar `main.dart` initialiseert de PostHog-SDK **onvoorwaardelijk**, dus bij elke koude start gaat er al een request (inclusief IP) naar `eu.i.posthog.com` zónder toestemming. Sentry is bovendien helemaal niet consent-gated en heeft geen `beforeSend`-filter, terwijl `debugPrint` in release breadcrumbs wordt — dat kan gezinsdata in crashrapporten trekken. Zie [archive/sessions/besluitenlog-2026-07-25.md](archive/sessions/besluitenlog-2026-07-25.md) §K3.

## 3. Backend security-hardening deployen (Wave 2 · S7) — ✅ KLAAR
- **Gedaan (2026-06-14, met jouw akkoord):** `0003_security_hardening.sql` naar **live** gedeployd via de Management API en geverifieerd: `deleted_at`-filter in de `private.user_*`-RLS-helpers, `members_lock_identity`-trigger (id/auth_user_id/household_id immutable), en `handle_new_user` consumeert invites per-id. Bestaande members-RLS + helpers blijven intact (sanity-gecheckt). De live `storage.objects`-policies (4× attachments) zijn 1-op-1 gecodificeerd in `0004_storage_rls.sql`.
- **Rest van S7 (later):** sync-set purgen van soft-deleted rijen (apart, niet-blokkerend).
- **Nog samen te doen:** een **cloud-rondrit-test** (magic-link login + sync + gezin) op de telefoons om het end-to-end te bevestigen (zie #4).

## 4. Cloud-rondrit & gezin-delen testen (Wave 2 · N3/N4/S5) — ⛔
- **Nodig:** samen testen op de telefoons (magic-link login vanuit lokale modus, sync, gezin verlaten/joinen). Ik bouw de code; verificatie vereist jouw toestellen + e-mail.
- **Aan te leveren:** een testmoment (en evt. een 2e test-account/e-mail).
- **⚠️ Diagnose testersfeedback "uitnodiging komt niet binnen" (2026-06-14):** de Edge Function `invite-member` (v3) is **ACTIVE/gedeployd** en werkt; het probleem zit in de **e-mailbezorging**. De Supabase-auth-config heeft **geen custom SMTP** (`smtp_host = None`) → de **ingebouwde** mailservice wordt gebruikt, die (a) alléén naar **team-leden van het project** betrouwbaar bezorgt en (b) gelimiteerd is op **2 mails/uur** (`rate_limit_email_sent = 2`) en door Supabase expliciet "**dev-only, niet voor productie**" wordt genoemd. Dit raakt zowel uitnodigingen als magic-link-login. **Oplossing = custom SMTP (zie #11).** De app-kant is intussen gefixed: de knop toont nu een **inline fout/melding** i.p.v. stil te re-enablen, en uitnodigen is correct achter **echte cloud-modus** gezet (in lokale modus was er nog niets om naar uit te nodigen).

## 5. Managed AI als betaalde feature (Wave 3 · B3) — ✅ KLAAR (gating + spend-limit nog)
- **Gedaan (2026-06-14, met jouw `OPENROUTE_PA_KEY`):** Supabase Edge Function **`ai-proxy`** gedeployd die de OpenRouter-sleutel **server-side** houdt (als function-secret), de user-JWT valideert, en completions doorstuurt. App-kant: `ProxyAiClient` → ingelogde gebruikers gebruiken managed AI zonder eigen sleutel. ~~lokale gebruikers houden BYO-key~~ *(update 2026-07-11: BYO-keys zijn per owner-besluit 2026-07-04 volledig verwijderd — managed AI is het enige transport)*. Geverifieerd dat ongeauthenticeerde calls 401 geven.
- **Nog te doen / beslissen:**
  1. **Spend-limit** ✅ ingesteld ($30/mnd op de OpenRouter-key) — naast de `max_tokens`-clamp in de proxy.
  2. **Entitlement-gate**: managed AI pas vrijgeven voor de betaalde 'plus'-tier (hangt aan B5). *(Update 2026-07-11: grotendeels gedaan — de client is Plus-gated via `AiGate` (`lib/core/ai/ai_gate.dart`) en de proxy heeft per-user metering (`ai_usage_logs`) + FUP-blokkade van 2M tokens/maand (429). Rest: server-side Plus-check in de proxy zelf zodra RevenueCat/B5 er is.)*
  3. **Privacy-disclosure**: dat AI-content (bijv. gefotografeerde documenten) via de proxy naar OpenRouter gaat, expliciet in de privacyverklaring zetten.

## 6. Monetisatie / abonnement (Wave 3 · B5) — ✅ storekant KLAAR; alleen de app-wiring resteert

> **Bijgewerkt 11 augustus 2026 — het dashboardwerk is gedaan.** Geverifieerd tegen de RevenueCat-API,
> project `projb991ffa5` (Tendlo): de iOS-app draagt alle vier de producten
> (`tendlo_plus_solo_yearly`, `tendlo_plus_solo_monthly`, `tendlo_plus_family_yearly`,
> `tendlo_plus_family_monthly`), Google Play dezelfde vier als base plans, en er is een testwinkel.
> De offering `ofrng9e2a53a9e4` ("Tendlo Plus") heeft vier packages met de lookup keys
> `solo_yearly`, `solo_monthly`, `family_yearly` en `family_monthly`; het entitlement
> `entl9e757b20e7` bestaat. **Er wacht hier niets meer op de eigenaar.**
>
> Wat van buiten App Store Connect niet te verifiëren is: of de vier producten ook daadwerkelijk het
> gratis introductieaanbod van twee weken dragen. Dat hoeft ook niet handmatig bewaakt te worden —
> `plusTrialAvailableProvider` wordt afgeleid van of de aanbiedingen laden, dus de app belooft een
> proefperiode alleen wanneer die er werkelijk is.
>
> Wat resteert is app-zijdig: het aankooppakket, de paywall op het Plus-vlak en het afhandelen van
> de aankoopuitkomsten.

> **➡️ Doe-handleiding: [release/store-setup-handleiding.html](release/store-setup-handleiding.html)** — stap voor
> stap, met per stap waar je bent, wat je invult en hoe je ziet dat het gelukt is. Dat is het document dat je
> openslaat als je hieraan gaat zitten; de rest van deze paragraaf is de achtergrond.

**Update 2026-08-05 — de laatste open beslissingen zijn gesloten (eigenaar):**
- **Prijzen definitief.** Plus Solo **€39,99/jaar** en **€5,99/maand** · Plus Family **€59,99/jaar** en
  **€7,99/maand**. De eerder geadviseerde NL-prijstest (39,99 vs 44,99 / 59,99 vs 69,99) is bewust overgeslagen;
  deze vier punten gaan zo de stores in. Daarmee staat ook vast dat **Solo náást Family** blijft en dat het
  **maandabonnement bij launch meegaat** — dus vier producten, geen twee.
- **Trial: 14 dagen gratis, op alle vier de producten.** Was al spec (2026-06-17), nu definitief. Let op hoe dit
  bij Apple werkt: een trial is géén aparte functie maar een **introductory offer** van het type *Free* op elk
  product — dus vier keer aanmaken. Apple kent geen keuze "14 dagen"; je kiest **"2 Weeks"**. De proefperiode
  geldt **één keer per Apple-ID per abonnementsgroep**, niet per product.
- **Gezinsabonnement: élk lid van het huishouden krijgt Plus, óók tijdens de trial.** Bewust — de gezinservaring
  moet in de proefperiode volledig zijn. Kost geen extra bouwwerk: `tier='family'` in `plus_entitlements` geldt al
  huishouden-breed zonder begunstigde, en een trial-start komt bij RevenueCat binnen als `INITIAL_PURCHASE` en zet
  de entitlement dus net zo goed op actief.
- **Google Play wordt uitgesteld**; iOS gaat eerst helemaal af. §7b hieronder blijft staan voor wanneer je het
  oppakt (en is in de handleiding als Deel C overgenomen, inclusief de nuance dat een app wél te verplaatsen is
  maar alleen via een handmatig, door Google beoordeeld verzoek).

**Nog open (alleen jij kunt dit — dashboard-werk):**
1. **Paid Apps Agreement activeren** — bankrekening + belastingformulieren, van "Pending User Info" naar Active.
   *Eerst doen: Apple beoordeelt deze formulieren handmatig, en er is geen gepubliceerde doorlooptijd.* Let op de
   volgorde die Apple oplegt: tekenen → belastingformulier → bankrekening. Alleen de **Account Holder** mag de
   overeenkomst tekenen. Voor Aqua-IT B.V. is het belastingformulier een **W-8BEN-E**, in te vullen als
   vragenlijst in de console; vul het Nederlandse fiscale nummer (RSIN) als FTIN in, dan is een Amerikaans EIN
   níét nodig. Het formulier is ná verzending niet meer te wijzigen in App Store Connect.
   *(Deze hoek van App Store Connect heet inmiddels **Business**, niet meer "Agreements, Tax, and Banking".)*
2. **De vier abonnementen aanmaken in App Store Connect** — groep "Tendlo Plus", en daarin de vier producten
   met de proefperiode. De product-ID's moeten **exact** overeenkomen met wat er al in RevenueCat staat; ze zijn
   na aanmaken onveranderlijk. Op 2026-08-05 rechtstreeks uit de RevenueCat-API geverifieerd (iOS-app,
   `com.aquait.tendlo`):

   | Product | Product ID (iOS) | Duur | Prijs |
   |---|---|---|---|
   | Plus Solo — jaar | `tendlo_plus_solo_yearly` | 1 Year | €39,99 |
   | Plus Solo — maand | `tendlo_plus_solo_monthly` | 1 Month | €5,99 |
   | Plus Family — jaar | `tendlo_plus_family_yearly` | 1 Year | €59,99 |
   | Plus Family — maand | `tendlo_plus_family_monthly` | 1 Month | €7,99 |

   ⚠️ Een typefout kost niet alleen een handmatige koppeling: `revenuecat-webhook` leidt de tier áf uit het
   product-ID (bevat de naam `family` → family, anders solo). `tendlo_plus_famly_yearly` levert dus een gezin dat
   betaalt maar waarvan maar één persoon Plus krijgt. De Android-notatie met dubbele punt
   (`tendlo_plus_solo:yearly`) is een Play-base-plan en hoort **niet** in App Store Connect.
3. **Play Console-kant (§7b)** — uitgesteld, zie hierboven.

Daarna is de app-kant aan mij: `purchases_flutter` toevoegen, de paywall op de echte offering zetten en de
trial-CTA aanzetten (`plusTrialAvailableProvider` staat nu hard op `false`).

**Update 2026-07-11 (grote stap):**
- Server-side entitlements live: `plus_entitlements` (solo/family + begunstigde, migratie 0042), `revenuecat-webhook` edge function gedeployed + getest vanuit het RC-dashboard (200), ai-proxy dwingt Plus server-side af; app leest de tabel (`hasPlusProvider`), enforcement AAN; 3 bestaande huishoudens hebben een admin tester-grant (Family).
- RevenueCat: project hernoemd naar **Tendlo**; producten aangemaakt (`tendlo_plus_solo`/`tendlo_plus_family` × yearly/monthly voor iOS, Play en Test Store), gekoppeld aan entitlement `plus`; offering `default`.
- App Store Connect: app **Tendlo** aangemaakt (naam gereserveerd!, bundle `com.aquait.tendlo`, SKU tendlo-ios), DSA-verklaring als trader ingevuld, **In-App Purchase Key gevalideerd in RevenueCat** ("Valid credentials").
- **Nog open (eigenaar):** (1) bankrekening + belastingformulieren in ASC → Paid Apps Agreement van "Pending User Info" naar Active; (2) de 4 subscriptions aanmaken in ASC (groep "Tendlo Plus": solo_yearly €39,99 · solo_monthly €5,99 · family_yearly €59,99 · family_monthly €7,99); (3) Play Console-kant (§7b). Daarna kan de paywall (purchases_flutter) gebouwd worden. *(Stand 2026-08-05: nog steeds de openstaande punten, nu mét de definitieve prijzen/trial en een stap-voor-stap-handleiding — zie het blok bovenaan deze paragraaf. Punt 3 is uitgesteld.)*

### (historie) eerdere status
#### Monetisatie / abonnement (Wave 3 · B5) — 🟡 RevenueCat-backend KLAAR, store-kant open
- **Gedaan (2026-06-14, via `REVENUECAT_FULL` v2-key):** in RevenueCat-project **MyPA** (`projb991ffa5`) aangemaakt: entitlement **`plus`** ("Mijn PA Plus"), en de apps **iOS** (`com.aquait.mijnpa`) + **Android** (`com.aquait.mijnpa`).
- **Public SDK-keys** ✅ ontvangen + in `~/.zprofile` (`REVENUECAT_PA_IOS_KEY` = `appl_…`, `REVENUECAT_PA_ANDROID_KEY` = `goog_…`).
- **App-kant (purchases_flutter + entitlement + paywall) bewust uitgesteld tot:**
  1. **Definitieve bundle-id** vaststaat (zie #12 — jij bent nog namen aan het sparren). Store-subscription-producten hangen aan de definitieve id, dus dat eerst.
  2. **Subscription-producten** in App Store Connect én Play Console (product-ID's + prijzen) → dan maak ik offerings/packages in RevenueCat én de in-app paywall (een paywall zonder producten kan niets verkopen).
  3. **Store-credentials voor RevenueCat:** App Store Connect API-key (iOS) + Google Play **service-account** (Android, zie #7b).
  4. Prijsbeslissingen: free-tier-grenzen, jaarprijs solo, family-plan, AI-credits.
- _Zodra bundle-id + producten er zijn, is de app-kant snel: keys staan klaar._
- **(Achtergrond) RevenueCat vs alleen Apple/Google vs Stripe:** Apple/Google leveren de betaalrails (verplicht voor in-app digitale subs); RevenueCat is de laag erbovenop (één entitlement over iOS+Android, receipt-validatie, restore/grace/refunds, analytics). Stripe is **niet** toegestaan voor in-app digitale subs — alleen relevant voor een latere web-checkout.

## 7b. Google Play Console — correct opzetten (jouw vraag) — 💤 UITGESTELD (owner 2026-08-05)

> **Uitgesteld:** iOS gaat eerst helemaal af. Je hoeft hier nu niets te doen. De stappen blijven hieronder staan
> voor wanneer je het oppakt; ze zijn ook als Deel C in de [store-setup-handleiding](release/store-setup-handleiding.html)
> overgenomen, daar aangevuld met de actuele Play Console-paden (**Monetize with Play → Products → Subscriptions**,
> abonnement → base plan → offer) en met de nuance bij punt 1: een app is wél te verplaatsen, maar alleen via een
> handmatig verzoek dat Google beoordeelt (registratie-transactienummer van beide accounts, US$ 25 voor een nieuw
> doelaccount, ~2 werkdagen), en rapportages, promoties, Firebase-koppelingen en oude bestellingen gaan níét mee.

Je hebt al een Google Developer-account; zo zet je de app onder het **juiste** (zakelijke) account, niet je privé:
1. Open **play.google.com/console** en wissel **rechtsboven** naar het **Aqua-IT B.V.**-account (niet je persoonlijke). Een app hoort bij het account waarmee je 'm aanmaakt en is later **niet zomaar te verplaatsen** → kies dus eerst het juiste account.
2. **Create app** → naam (werktitel mag), taal, type **App**, **Gratis** (met in-app aankopen).
3. De **package name** (`com.aquait.mijnpa`) wordt bij de eerste upload vastgelegd en is permanent — laat 'm matchen met de iOS-bundle-id.
4. **Monetize → Products → Subscriptions** → maak het Plus-abonnement (base plan + prijzen).
5. Voor RevenueCat: maak in Google Cloud een **service-account** met toegang tot de Play Developer API, nodig 'm uit in Play Console (**Users & permissions**) met financiële rechten, en geef de JSON aan RevenueCat (App → Play credentials).
6. Dit is dashboard-werk in jouw account; ik kan het niet voor je doen, maar lever de keys/JSON aan en ik wire de rest.

## 7. App Store / Play readiness (Wave 3 · B6) — 🟡 (deels nu al)
- **Nodig:**
  - Apple Developer-account (heb je — signing-team `CKS7GP8VV5` werkt al) → wanneer naar **TestFlight/App Store**.
  - **Google Play Console**-account (€25 eenmalig) als Android publiek moet.
  - Store-assets: app-omschrijving (NL + later EN/DE), screenshots, keywords, leeftijdsclassificatie, support-URL.
  - **Privacy-nutrition-labels / Data Safety**: ik vul de technische kant in; jij bevestigt de claims.
- **Aan te leveren:** Play-account (indien gewenst) + store-teksten/keywords + support-e-mail.

## 8. Juridisch / AVG-GDPR (Wave 3 · N9/B4) — ⛔ voor publieke release
- **Nodig:**
  - Een **privacybeleid** + **gebruiksvoorwaarden** (tekst) en een **plek om die te hosten** (URL) — vereist door beide stores.
  - Akkoord op de **sub-processor-lijst** (Supabase, PowerSync, OpenRouter, RevenueCat, Sentry/analytics) en de DPA's.
  - Grondslag/aanpak voor **kinderdata** (gezin/co-ouderschap) onder AVG.
- **Hoe ik eromheen bouw:** ik bouw de in-app GDPR-self-service (export/verwijderen/"wat slaan we op") en een instelling die naar de policy-URL linkt; de URL/teksten lever jij.
- **Aan te leveren:** policy/terms-tekst (kan met een generator/jurist) + hosting-URL + akkoord sub-processors.

## 9. Internationalisatie / vertalingen (Wave 3-4 · B1/B2) — ✅ AANPAK BESLIST
- **Beslist (2026-06-15):** vertalen mag **via AI**, met een **natuurlijke/idiomatische**
  kwaliteitslat — niet letterlijk, maar het woord dat een moedertaalspreker op die plek
  logisch zou gebruiken. Geen aparte vertaler-in-de-loop nodig; ik lever én de
  string-extractie én de EN/DE-vertalingen.
- **Gedaan:** i18n-infra (B1) + Taken-slice in NL/EN/DE (B2). Talen nu: NL (default), EN, DE.
- **Resteert (gewoon werk, geen owner-input meer):** de uitrol — overige ~750 strings +
  41 persisted-enum-labels per feature converteren (zie `lib/l10n/README.md`), en daarna
  een taalkiezer-UI zodra een betekenisvolle oppervlakte vertaald is.

## 10. Beta-test (Wave 3 · N8) — 🟡
- **Nodig:** een lijstje **TestFlight-testers** (e-mails) en/of Play closed-track-testers; idealiter een paar echte gezinnen buiten jullie.
- **Aan te leveren:** 5-15 tester-e-mails wanneer we zover zijn.

## 11. Domein & e-mail — ✅ Custom SMTP LIVE op **tendlo.app** (Resend)
- **Geüpgraded (2026-06-16):** afzender is nu het merk-eigen domein
  **`Tendlo <no-reply@tendlo.app>`**. tendlo.app is via de Resend-API toegevoegd
  (EU-regio) en **verified**; DNS (DKIM `resend._domainkey`, SPF+MX op `send`, plus
  **DMARC** `_dmarc p=none`) is via de **Porkbun-API** gezet. Supabase SMTP gebruikt een
  **dedicated, tot tendlo.app-beperkte Resend-sending-key** (niet meer de snapsnel-key —
  die veroorzaakte een 500 vanaf het nieuwe domein). Test-magic-link + directe Resend-mail
  naar robin@aqua-it.com: HTTP 200. Veel betere bezorging (merk-match + uitgelijnde
  SPF/DKIM/DMARC) dan de oude `no-reply@snapsnel.nl`.
- **Auth-mails gebrand (2026-06-16):** de 5 gebruiker-gerichte Supabase-auth-templates
  (bevestiging, inloglink, uitnodiging, wachtwoord-reset, e-mailwijziging) zijn van de
  kale Engelse defaults vervangen door **gebrande, tweetalige (NL + EN) Tendlo-mails**
  (trio-mark + wordmark, merk-kleuren, echte CTA-knop, "niet aangevraagd? negeer"-voet).
  Dit verbetert merkbeleving én spam-score (gestructureerde HTML i.p.v. kale link).
  Geverifieerd: verse signup → confirmation-mail "Bevestig je e-mailadres voor Tendlo ·
  Confirm your email" via Resend **delivered**.
- **Eerder (2026-06-16, opgelost):** tijdens de SMTP-setup gaf één PATCH (alleen `smtp_pass`)
  kort het hele SMTP-blok leeg → in dat venster ging één "Confirm your email" nog via de
  **ingebouwde** Supabase-mailer (`noreply@mail.app.supabase.io`). Na het volledige
  SMTP-blok te herstellen gaan **alle** auth-mails (confirmation + magic-link + invite)
  weer via Resend/tendlo.app; bevestigd in de Resend-log.
- **Eerder (2026-06-15):** Custom SMTP eerst op `no-reply@snapsnel.nl` gezet (Resend);
  werkte technisch maar gaf merk-mismatch/spam-risico → vervangen door tendlo.app.
- **Restpunt 1:** DMARC staat op `p=none` (alleen monitoren). Na een paar weken zonder
  problemen kan dit naar `p=quarantine`. `rua`-rapporten gaan naar postmaster@tendlo.app.
- **Restpunt 2:** nieuw verzenddomein heeft nog geen reputatie ("warming") → eerste mails
  kunnen in junk landen tot er volume/engagement is. Lost zichzelf grotendeels op; geen actie.

## 12. App-naam & bundle-id — ✅ doorgevoerd (naam **Tendlo**), 🟡 paar follow-ups voor jou
- **Naam = "Tendlo".** Display-naam overal doorgevoerd (app, onboarding, lock-screen,
  AI-prompts, iOS/Android labels, ARB nl/en/de). Huisstijl (teal-inkt + terracotta)
  en het trio-logo/splash zijn geactiveerd. Zie `design/brand/BRAND.md`.
- **Bundle-id gewijzigd:** `com.aquait.mijnpa` → **`com.aquait.tendlo`** (iOS + Android
  `applicationId`; Android `namespace` + Kotlin-package bewust behouden). URL-scheme →
  `io.supabase.tendlo`. **Supabase redirect-allowlist** door mij bijgewerkt via de
  Management API (de oude `io.supabase.mijnpa` blijft voorlopig óók toegestaan, dus
  bestaande magic-links breken niet).
- **RevenueCat — ✅ door mij omgezet** (v2 API, project `projb991ffa5`): app
  `Tendlo (iOS)` bundle_id en `Tendlo (Android)` package_name → `com.aquait.tendlo`
  (+ hernoemd). Het zijn dezelfde apps, dus je **public SDK-keys blijven geldig**
  (`REVENUECAT_PA_IOS/ANDROID_KEY`). Geen actie nodig; products/entitlements wiren we
  bij B5. (Intern project-label bleef "MyPA" — niet gebruikerszichtbaar.)
- **Nog door jou te doen:**
  - **Juridische clearance** van de naam (zie `design/brand/naming-tendlo.md`) blijft
    jouw spoor — vóór publieke launch.
  - **Domeinen/handles:** overweeg `tendlo.app`/`.nl`/`.eu` + @tendlo vast te leggen
    (OpenRouter-attributie verwijst nu naar `tendlo.app`).
  - **iOS-signing:** automatic signing registreert de nieuwe App-ID bij de eerste build
    (loopt) — geen actie nodig tenzij die build faalt.
- **Permanentie:** de bundle-id ligt pas écht vast ná de eerste TestFlight/Play-upload;
  tot dan kan 'm nog wijzigen.

---

### Snelste "unblock" als je weinig tijd hebt
1. ~~SENTRY_DSN~~ ✅ · ~~PostHog~~ ✅ · ~~Supabase 0003 deploy~~ ✅ — gedaan.
2. **RevenueCat public SDK-keys** (uit dashboard: `appl_…` + `goog_…`) → app-kant van abonnementen wiren.
3. **Bundle-id bevestigen** (`com.aquait.mijnpa` ok? — #12) → deblokkeert store-uploads.
4. ~~**Prijs + free-tier-grenzen** (beslissing)~~ ✅ beslist (prijzen definitief 2026-08-05) → nu is de volgende stap de **Paid Apps Agreement** activeren; die heeft doorlooptijd bij Apple, dus daar begin je mee ([handleiding](release/store-setup-handleiding.html)).
5. **OpenRouter-key** ✅ ontvangen → managed-AI proxy (B3) kan ik bouwen.

## 13. Autonome sessie 2026-07-08 — punten die op jou wachten
- **Share Extension (delen-knop iOS):** eenmalig het extension-target aanmaken via de
  Xcode-GUI (~5 min; plan + alle vervolg-stappen liggen klaar). Zonder dit blijft de
  "deel naar Tendlo"-feature geparkeerd.
- ~~**GLM als derde executor**~~ ✅ OPGELOST — commando is `glm` (Claude Code-harness →
  z.AI, model `glm-5.2`), `Z_AI_API_KEY` staat al in `~/.zprofile`. Smoke-test groen;
  aanroep zoals codex (`glm -p "…"`). Draait mee in de rotatie.
- ~~**Notificatiegeluiden helder/zacht**~~ ✅ FUNCTIONEEL KLAAR — `helder`/`zacht` als
  `res/raw/*.mp3` (Android) + `Runner/sounds/*.caf` (iOS, in Copy Bundle Resources)
  gebundeld; `NotificationSound.androidResource/iosResource` bedraad. Dit zijn
  gesynthetiseerde *default*-tonen (helder = tweeklank-bel, zacht = zachte enkele toon) —
  vervang de bestanden gerust door eigen geluiden als de smaak anders is (zelfde
  bestandsnamen, geen codewijziging nodig).
- **Vandaag fase 1/2:** jullie test-oordeel over afvinken/Klaar-bak; fase 2 wordt
  autonoom gebouwd (ontwerp was goedgekeurd) en kan daarna bijgestuurd.
- **B5/RevenueCat:** ~~ongewijzigd owner-geblokkeerd (store-producten/prijzen)~~ → **stand 2026-08-05:** prijzen en
  trial zijn beslist; wat rest is dashboard-werk in App Store Connect, stap voor stap in
  [release/store-setup-handleiding.html](release/store-setup-handleiding.html). Zie §6.
Voortgang/status van de sessie: docs/design/VOORTGANG-SESSIE.md.
