GoDating

Data Protection Impact Assessment — GoDating

Version: 1.1 · updated 2026-05-05 · for open Denmark beta Controller: PX7 Digital · Hyltebjerg Allé 43, 2720 Vanløse, Danmark · [email protected] Scope: All processing performed by the GoDating product surfaced at godating.app and godating.dk.

This DPIA exists because GoDating processes special-category personal data at scale: photos used for visual identification, profile data used for affective matching, and a current verification-selfie workflow that may reveal special-category traits. A future provider-side biometric path remains optional and inactive at launch. Article 35 GDPR is still triggered by the present processing posture.


1. Description of processing

1.1 Data categories

CategoryExamplesWhere storedRetention
Account identifiersemail, email_hash (HMAC-SHA256), locale, roleD1 usersUntil deletion request + 30 d soft-delete grace
Profile contentdisplay name, DOB, age-confirmed flag, area, postal code, gender identity, shown-as, interested-in, relationship intention, bioD1 profiles, profile_prompt_answersSame as account
Photosup to 6 JPEG/HEIC; SHA-256 of original; EXIF stripped before storageR2 godating-prod-profile-photos; references in D1 profile_photosSame as account; R2 grace 30 d after soft-delete
Verification selfieone still selfie with a prompted gesture; selfie SHA-256; perceptual-hash similarity aids; moderator decisionR2 godating-prod-profile-photos / verification bucket path; D1 verification_requestsSelfie deleted within 90 d of approve/reject/withdrawal; decision outcome retained with account
Behaviourallikes, passes, blocks, reportsD1 profile_actions, user_blocks, user_reports, user_action_budgets24 months rolling, then aggregated only
Communicationschat messages (text), safety signals on chat (NSFW classifier scores), per-message metadataD1 chat_messages, chat_message_metadata, chat_safety_signals12 months rolling; safety signals retained for the lifetime of the chat thread
Date plansproposed dates, accepted/declined state, optional venueD1 date_plans12 months rolling
Moderation evidencereported content, reviewer decisions, admin audit trailD1 moderation_actions, user_moderation_actions, admin_audit_log, admin_support_notes5 years (regulatory + DSA evidence preservation)
Authentication stateone-time email confirmation tokens, magic-link session cookies (httpOnly+Secure), social-sign-in linkagesD1 user_email_confirmations, user_social_accounts, user_profile_access_linksTokens expire ≤ 15 min; sessions ≤ 14 d sliding
Notification opt-inspush subscription endpoints, recap email preferencesD1 push_subscriptions, notification_preferences, weekly_recap_preferences, notification_deliveriesUntil unsubscribe
Cross-handle integration dataIntus profile import consents and the imported subsetD1 intus_consents, intus_imported_profiles, intus_pending_imports, intus_visibility_settingsTied to the Intus consent record; revoked on Intus side propagates within 24 h
Operational telemetryclient error events with userId, route, stackD1 client_error_events90 d rolling
Vector representations128-dim cosine vectors derived from values_json + relationship_signals_json for ANN matchingCloudflare Vectorize godating-prod-compatRefreshed every sweep cycle; deleted on account deletion
Behavioural-pool snapshotsdaily discovery pool per user (KV)Cloudflare KV PROFILES_RATE_LIMIT namespace and successor pool namespace7 d rolling
Future external biometric provider (not active)hosted liveness or identity-verification flow if GoDating later activates oneProvider not selected; not yet collectedProvider retention will be documented before activation; see §6

Special categories (Article 9 GDPR) processed:

Lawful basis for special categories: Article 9(2)(a) — explicit, granular consent captured at intake (profile_consents rows with verbatim consent text + timestamp), revocable at any time. No special-category processing happens before the corresponding profile_consents row exists.

1.2 Processing purposes

  1. Account creation + authentication — magic-link email login, optional Apple/Google sign-in (post-launch).
  2. Profile creation + presentation — collecting profile data and showing it to other matched users.
  3. Discovery + matching — daily pool generation via either §12.6 weighted-attribute heuristic OR §12.6.1 Vectorize cosine ANN (feature-flagged); mutual-like detection.
  4. Communication between matched users — text chat, future voice/image messages, date-plan proposals.
  5. Safety + moderation — automated CSAM hash check, NSFW classifier on photos and chat, reactive review of user reports, account-level enforcement (warn/strike/suspend/delete).
  6. Notifications — magic-link email, match notifications, weekly recap, push when subscribed.
  7. Operational integrity — error telemetry, abuse rate-limiting, capacity planning, anti-fraud signals.
  8. Cross-handle continuity — letting users import an existing Intus / GoToBe profile shape with a fresh consent step.

1.3 Lawful bases

PurposeArticle 6 basisNotes
Account + authentication6(1)(b) ContractCannot deliver service without identity
Profile presentation6(1)(b) ContractSame
Discovery + matching6(1)(b) ContractThe product IS matching
Chat6(1)(b) ContractSame
Safety + moderation6(1)(c) Legal obligation (DSA, CSAM reporting) + 6(1)(f) Legitimate interest (platform integrity)Strict-necessity scoping; balancing test recorded in §3
Notifications6(1)(a) Consent for push + recap; 6(1)(b) for transactional (login link, account confirmations)Granular toggles in notification_preferences
Telemetry6(1)(f) Legitimate interestNo identifying cookies; pseudonymous error context
Cross-handle import6(1)(a) Explicit consentNew intus_consents row required per import

1.4 Data subjects

1.5 Recipients / data sharing

1.6 International transfers


2. Necessity + proportionality

For each purpose in §1.2 we asked: can we ship without this data?

We do NOT collect: phone numbers (until launch-week SMS verification, separate consent), real-time location, contacts list, calendar, browsing history outside our domains.


3. Risks + mitigations

RiskLikelihoodSeverityMitigation
Scam / fake-account rings at scaleHigh (dating market reality)Medium (financial harm to users; reputational)Cloudflare Turnstile on intake + login; Level 1 verification via gesture selfie + moderator review; automated CSAM/NSFW/authenticity gates on uploads; per-IP rate limits on request-link (5/h); admin second-factor on moderation tools
CSAM uploadLow (adults-only) but absolutely zero-toleranceCatastrophicPre-store CSAM hash check (NCMEC + Microsoft PhotoDNA when contracted); auto-block + report to NCMEC equivalent (DK: Red Barnet) per CSAM runbook; tabletop exercise required before public scale
Re-identification via vector embeddingsLowMediumVectorize stores user-id only as metadata; vector dimensions are non-invertible (FNV-1a hash bag + ordinal one-hot); never expose vectors via public API
Profile-stalking / unwanted contactMediumMedium-HighBlock + report flow; mutual-match-only chat; no public discovery of non-public profiles; public-profile opt-in is per-user with a separate consent row
Data-subject access request floodingLowLow (operational)/api/account-export endpoint generates a self-service ZIP of the user's full record; tested in CI
Subprocessor breach (Resend, Cloudflare)LowMediumMinimum-data principle: Resend gets only email + magic-link payload; Cloudflare hosts everything but data is encrypted at rest and access is audit-logged
Moderator biasMediumMediumTwo-strike review for terminal account actions; admin actions logged in admin_audit_log; appeal flow specified in spec §16.10
Biometric mis-identification (future provider path)Not assessed until provider is selectedHighDPIA addendum required before activation; clear opt-out alternative (manual review) must always exist
Data retention driftMediumLow-MediumRetention jobs documented in the retention runbook; test coverage required before launch

3.1 Residual risk after mitigations

Acceptable for open Denmark beta scale (target: < 10k MAU before promotion). Re-evaluation triggers: any item moves to High likelihood + High severity; MAU exceeds 10k; biometric activation; cross-border expansion; first regulatory inquiry.


4. Data-subject rights

RightHow exercisedImplementation
AccessIn-app "Export my data" → /api/account-exportReturns a ZIP with profile, photos, chat history, action log
RectificationIn-app profile editorBacked by /api/profile/update
ErasureIn-app "Delete my account"Soft-delete immediately; hard-delete after 30 d grace (see retention table); R2 photo grace job removes binaries
RestrictionEmail [email protected]Manual operator action; logged
PortabilitySame as Access (machine-readable JSON)
ObjectGranular toggles for notifications + recap; per-purpose consent togglesnotification_preferences + profile_consents
Withdraw consentIn-app per consent toggleEach toggle change writes a new profile_consents row with the new state
Complain to supervisorDatatilsynet (Danish DPA)Linked from /legal/privacy
Not be subject to automated decisionDiscovery + ranking is automated, but no terminal account decision is taken automatically; CSAM hit auto-blocks but is reviewed by a human within 24 hSpec §16.7

Response SLA: 30 days from request receipt (GDPR maximum); operationally targeting 7 days.


5. Consultation


6. Outstanding actions before broad launch

ActionOwnerBlocks
Activate Turnstile on /intake + loginAI agent / Cloudflare operatorOpen Denmark beta scale-up
Migrate to magic-link sessionsAI agentOpen Denmark beta scale-up
Sign DPAs with Resend + Cloudflare for EU SCC coverageJørgenPublic launch beyond beta
Re-open external biometric-provider decision + file DPIA addendum only if launch posture changesJørgen + counselAny future provider-side biometric activation
Publish ROPA at /legal/ropaAI agent (this batch)DSA + Article 30 compliance
5-year admin_audit_log retention jobAI agentDSA evidence preservation

7. Approval

FieldValue
Drafted byHQ Dispatch agent (Claude) on 2026-05-04
Reviewed byJørgen Larsen (PX7 Digital) — product review pending; Danish/EU counsel review tracked separately
Effective dateOn publication at godating.app/legal/dpia
Next review2026-11-04 (6 months) OR on any §3.1 trigger, whichever comes first
Version historyv1.1 — clarified current verification-selfie posture and future provider addendum path; v1.0 — initial draft, open Denmark beta posture