DATA PROTECTION IMPACT ASSESSMENT

Version 1.0, 10 September 2026. Next scheduled review: September 2027. Published in English for all markets.

Summary

Pinploy ApS, trading as Handyhand, has assessed how the Handyhand platform processes personal data in Denmark and the Netherlands, following Article 35 of the GDPR. The assessment covers the website, the apps, payments, identity verification, messaging, notifications, marketing, analytics and the AI-assisted features behind them. It was carried out on the UK Information Commissioner's seven-step template, which follows the European guidelines that the Danish supervisory authority, Datatilsynet, also applies.

The assessment found that the platform's core processing is necessary and proportionate for running a marketplace, but identified 9 high, 9 medium and 2 low risks that need action. The most important are: our privacy notice must be rewritten to describe everything we do and everyone we share data with; several advertising and analytics tools were running before visitors gave consent; contact details were being forwarded to analytics vendors; account deletion did not remove all data; there was no written retention schedule; and some automated decisions lacked human review. Each finding has a concrete fix, an owner and a deadline in the action plan at the end of this page.

This is the public version of the assessment. In line with the ICO's guidance, technical details that could help an attacker have been generalised; the full version is held internally and is available to the supervisory authority on request. Questions can be sent to [email protected].

CONTENTS

  1. Step 1: Identify the need for a DPIA
  2. Step 2: Describe the processing
  3. Step 3: Consultation process
  4. Step 4: Assess necessity and proportionality
  5. Step 5: Identify and assess risks
  6. Step 6: Identify measures to reduce risk
  7. Step 7: Sign off and record outcomes
  8. Appendix A: Tag Manager container audit
  9. Appendix B: Action plan
ControllerPinploy ApS, trading as Handyhand. CVR 40021892. Registered office: Tordenskjoldsgade 14, 4. th., 1055 København K, Denmark (the privacy notice and the company register entry are to be aligned; see action plan).
Privacy contact[email protected]. No Data Protection Officer is designated at the date of this assessment; the Article 37 assessment and appointment are in the action plan.
Lead supervisory authorityDatatilsynet (Denmark). The Autoriteit Persoonsgegevens (Netherlands) is the authority concerned for the NL market. Where the ICO template says 'consult the ICO', read 'consult Datatilsynet' (GDPR Article 36 prior consultation).
Processing assessedThe whole Handyhand service: web platform (handyhand.dk / handyhand.nl), iOS and Android app, public SEO website, admin dashboard, back-office analytics, and the notification, payment, identity-verification and AI features behind them.
Type of assessmentRetrospective DPIA of live processing plus forward-looking review of recent and planned features (NL market, AI features, message screening). To be repeated when nature, scope, context or purposes change materially.
Version / dateVersion 1.0, 10 September 2026. Prepared by Saxo Merrild (management) on the basis of a technical analysis of the production codebase, the production database, the live websites, the Tag Manager container GTM-5T5GZ93 and the published privacy notice.
StatusFinal for approval. Measures and residual risks are submitted for sign-off in Step 7. Confirmations still to be obtained and the mitigation work are scheduled in Appendix B (action plan) with an owner and a target date each.

How to read this document

This document follows the seven steps of the ICO sample template. Each grey box repeats the template prompt; the text beneath it is Handyhand's answer. Facts were taken from the production codebase (what the system does), the production database (how much data and how many people), the live websites and Tag Manager container (what actually runs in users' browsers), and the published privacy notice (what users are told). Where these sources disagree, the disagreement is recorded as a risk and addressed in Step 6.

Handyhand is established in Denmark and operates in Denmark and the Netherlands, so the EU GDPR applies rather than the UK GDPR. The ICO method is used because it is clear and widely accepted; the substantive requirements (Articles 35 and 36) are the same, and the Danish Datatilsynet endorses the same WP248 criteria. Datatilsynet's own DPIA template and list of processing that always requires a DPIA were also checked (datatilsynet.dk/regler-og-vejledning/behandlingssikkerhed/konsekvensanalyse).

Step 1: Identify the need for a DPIA

Explain broadly what project aims to achieve and what type of processing it involves. You may find it helpful to refer or link to other documents, such as a project proposal. Summarise why you identified the need for a DPIA.

What Handyhand does

Handyhand is a two-sided online marketplace. Private customers and small businesses post tasks (moving, cleaning, gardening, assembly, repairs and similar) with a description, photos, location and budget. Independent service providers ('Handyhanders') browse tasks, make offers, chat with the customer, carry out the work and are paid through the platform. Pinploy ApS operates the platform, takes a service fee, handles payments and payouts, verifies identities, moderates disputes and cancellations, and reports Handyhander income to the tax authorities where the law requires it.

Type of processing

The service cannot work without processing personal data about both sides: identity and contact details, home addresses and precise locations, photos of people's homes, free-text descriptions and private chat, payment and payout details, national identity numbers used for verification and tax reporting, ratings and reviews, device and behavioural data, and derived data such as tier levels, AI price suggestions and fraud or quality signals.

Why a DPIA is required

Screening against the ICO and WP248 criteria shows the processing meets several 'likely high risk' indicators at once. Two or more indicators normally means a DPIA is mandatory; Handyhand meets at least eight:

Criterion (WP248 / ICO)How Handyhand meets it
Large scaleAbout 250,000 people used the platform in the last 12 months across Denmark and the Netherlands (see Step 2, scope).
Evaluation or scoring / profilingStar ratings and reviews, Handyhander tier levels (Silver/Gold/Platinum) computed from earnings and completion behaviour, AI price suggestions, quality and fraud signals.
Automated decisions with significant effectTier gating of features, automatic suspensions and cooldowns, IP-based geo-blocking, automated cancellation penalties, AI rewriting of decline comments shown to the other party.
Systematic monitoringScreening of chat and offer messages for off-platform contact and fraud; behavioural tracking for analytics and ads; 'last online' indicators.
Sensitive or highly personal dataNational identity numbers (CPR in Denmark, BSN in the Netherlands), MitID identity verification, bank/payout details, precise home location, photos of the inside of homes, private conversations.
Matching or combining datasetsPlatform data combined with Stripe identity/payment data, Google advertising data (hashed email conversions), analytics and CRM/marketing tooling.
Vulnerable individualsCustomers frequently include elderly or disabled people who need help at home; Handyhanders are gig workers whose income depends on the platform's automated decisions.
Innovative technologyLarge-language-model features (price suggestion, comment cleaning, chat assistance, voice support), vector embeddings of task text, AI-assisted data analysis.
Data that could lead to physical harmTask dates reveal when a household is moving or away and home photos are visible to all Handyhanders; the street address is hidden until an offer is accepted.

The processing is also on Datatilsynet's national list in at least one respect (systematic monitoring and profiling of a large number of people, and processing of national identity numbers at scale), which makes a DPIA compulsory under Article 35(4).

Trigger for doing it now

No DPIA has previously been recorded. The privacy notice was last updated 26 February 2024 and pre-dates the Netherlands launch, the AI features, server-side advertising conversions, message screening and the current cancellation and tier systems. This assessment therefore serves both as the retrospective DPIA for the live platform and as the baseline for updating the privacy notice.

Step 2: Describe the processing

Describe the nature of the processing: how will you collect, use, store and delete data? What is the source of the data? Will you be sharing data with anyone? You might find it useful to refer to a flow diagram or other way of describing data flows. What types of processing identified as likely high risk are involved?

Sources and collection

  • Directly from users: sign-up form (name, email, phone, password or social login, promotional-consent checkbox), profile (photo, description, education, address, working hours), task creation (title, description, photos/videos, address, date, budget, insurance consent), offers and chat, reviews, support tickets, cancellation and decline reasons, appeal texts, bank account or Stripe Connect onboarding, optional date of birth.
  • From identity providers: MitID through the broker Criipto (Denmark; verified name, date of birth and CPR number), Google, Apple and Facebook single sign-on (subject id, name, email, access token), Stripe (identity and bank verification results, bank fingerprints).
  • From public registries: Danish CVR and Dutch KVK/VIES for business customers; Danish BBR building register, looked up from the user's address, to build a property report (building year, area, heating, rooms).
  • Generated automatically: IP address and request headers at sign-up (stored in the user record as 'flagged data' with an ipdata.co geolocation lookup), per-session and per-activity IP logs, device and push tokens, page and task views, 'last online', ratings, completion and cancellation rates, strength score, tier, AI price suggestions, AI offer recommendations, moderation verdicts, email/SMS/push delivery logs, Vapi voice-call transcripts and chatbot conversations.
  • Historic: tasks and users were synchronised with the Shouter marketplace, a partner platform that has since closed (confirmed 10 Sept 2026). The integration code, API token, database connection and shouterUserId fields still exist and should be removed.

Use

Data is used to run the marketplace end to end (matching, chat, payment escrow, payouts, invoices, disputes, cancellation rules), to verify identity and prevent fraud, to compute trust signals (ratings, tiers, completion rates), to notify users, to support them (human support, chatbot, voice agent), to improve the product (analytics, AI models), to market (reactivation emails, ad conversion measurement) and to meet legal duties (bookkeeping, tax reporting).

Storage and access

  • Core data: PostgreSQL (write and read replicas) and Redis, operated on AWS. Files (photos, documents, invoices) in Amazon S3, region eu-central-1 (Frankfurt), served through CloudFront. Invoice PDFs are written with server-side encryption; encryption for other objects is governed by the bucket default setting (confirmation scheduled, action B-2). The database is also hosted in Frankfurt; encryption-at-rest and backup retention settings are infrastructure settings that are to be documented from the AWS console (action B-2).
  • Passwords are stored as salted one-way hashes. National identity numbers and bank details are held in access-restricted tables; strengthening their protection with field-level encryption is scheduled in the action plan. A separate table holds one-way hashes of email, phone, bank account and national ID used only to detect duplicate or banned accounts.
  • Access: role-based (user, admin, superadmin, content-writer, influencer, insurance). Admins use an admin dashboard (with a generic CSV export of any table view), an admin chatbot with MitID and payment tools, and a one-time-code impersonation feature. Staff and AI-assisted analysis also read production data through an internal analytics tool. Admin write actions are audit-logged; admin read access is not.
  • Task location: the API strips the street address for anyone who is not the task owner and returns only city and postcode (verified in the task controller); the exact address is shared with the accepted Handyhander. Remote tasks carry no address.

Sharing and processors

Personal data leaves Handyhand's systems to the following recipients (evidence in code; the published privacy notice currently names only Stripe and Google):

RecipientRolePersonal dataLocation
Amazon Web Services (S3, SES, CloudWatch)Processor: hosting, files, email sendingAll stored data and all outgoing emailsEU (Frankfurt); US parent
Cloudflare (proxy, Turnstile bot check)ProcessorIP address, country, bot-check tokenGlobal edge; US parent
Stripe (incl. MobilePay as a payment method)Processor / independent controller for AMLName, email, card, bank account, identity verification, paymentsEU/US
Criipto (MitID broker)ProcessorMitID login, name, birthdate, CPREU
Dinero / Visma (accounting, DK only)ProcessorNames, addresses, CVR, invoice linesEU
OpenAIProcessor: LLM and embeddingsTask text, offer and chat messages, decline free text, images (via the contact-detail screening), support textUS
AnthropicProcessor: chatbot, support suggestions, voice/SMS text, ban-appeal screeningChat and support conversations, appeal textUS
PerplexityProcessor: search-grounded content generationPrompts for content and SEO generation; these must not contain personal data (control to be documented, action B-9)US
Google Cloud VisionProcessor: OCR of uploaded chat/task imagesUser-uploaded imagesUS/global (no EU endpoint pinned)
Vapi.aiProcessor: voice support agentCaller phone number, full call transcript, summary, OTP eventsUS
Twilio / JT (SMS)ProcessorPhone number, SMS bodyUS / DK
Expo push (to Apple APNs / Google FCM)ProcessorPush tokens, notification textUS
Google Firebase Analytics (app)Processor / jointEvents plus, when consented, email, phone, name, city, postcode, country in clear textUS
Meta (Conversions API, app SDK, Facebook login)Independent controller / jointServer-side: email, phone, name, city, zip, country, gender, user id, browser idsUS
Google Ads (enhanced / offline conversions)Independent controller / jointHashed email, phone, name; postcode and country in clear; click idsUS
Google Tag Manager server-side (Stape)ProcessorEverything pushed to the data layer, first-party user-id cookieEU hosting (Stape); to be confirmed in the processor register (action B-9)
Cookiebot (Usercentrics) – consent banner, loaded by the GTM containerProcessorConsent choice, IP for consent logEU
TikTok pixel – loaded by GTM (not in code), consent-gatedIndependent controllerPage views, conversions, device ids when marketing consent givenUS/SG
OpenAI Ads pixel (via Stape template) – loaded by GTM (not in code), consent-mode gatedIndependent controllerPage views, sign-ups, task and offer events with advanced matching when consent givenUS
Tune / Trackwise (affiliate network, link.trackwise.dk) – loaded by GTM (not in code)Independent controllerClick and conversion attribution, affiliate cookies; fires without consent checkDK/US
Google Analytics 4 – configured in GTMProcessorEvents plus raw email and phone as user properties and parameters (from the data layer)US
Microsoft Clarity – session recording, auto-loaded by the Bing UET tag (not in code)ProcessorSession recordings, clicks, page views; loads before consentUS
Microsoft Advertising (Bing UET) – loaded by GTM (not in code)Independent controllerPage views, conversion events, click ids; the enhanced-conversion tag sends raw email and phone on sign-up, task and offer eventsUS
Reddit Ads pixel – loaded by GTM (not in code)Independent controllerPage views, conversion events, _rdt_uuid cookieUS
bestofluck.io / caraml-tracker – ad-network tracker loaded by GTM (not in code; listed by Chrome as a cross-site tracking domain)Independent controller; vendor relationship not documentedUnique browser id, page viewsUnknown (action B-5)
Google Maps / Places / GeocodingProcessorAddresses, coordinatesUS/global
PostHog (EU cloud, proxied)Processor: product analyticsIdentified users (email, name, role, country), session replays (web and iOS)EU
Mautic (self-hosted CRM)Own systemEmail, name, address, phone, birthday, activity, earnings/spend, last task title (only users with promotional consent)EU (own host)
TrustpilotIndependent controllerEmail, name, user id in review invitationEU/US
AdTraction (affiliate network)Independent controllera hash of the email, order id, on task creationEU
ipdata.coProcessor: IP geolocation at sign-upRaw IP address of every new userUS
Shouter (partner marketplace, now closed)Former independent controllerHistorically: task title, description, street address, postcode, coordinates, price, date. Partner no longer operates; integration still present in code and configurationn/a
n8n CloudProcessor: automationTask-derived payloads; field list to be documented (action B-9)EU (n8n cloud)
Slack, TelegramProcessor: operational alertsSystem status text only; verified to carry no user identifiersUS
Self-hosted ML services (moderation, image scan, vectors, video)Own systemsMessage text, user id, media URLs, task textEU (own infrastructure)
Public registries and APIs (CVR, VIES, BBR)Independent controllersCompany numbers, addressesEU
Other usersRecipientsProfile, ratings, task details, chat; task address to the accepted HandyhanderDK / NL
Skattestyrelsen / Belastingdienst (DAC7)Public authorityHandyhander identity, TIN (CPR/BSN), address, income and fees, reported annually by the in-house finance processDK / NL

Tracking: live-site check (9 September) and Tag Manager container audit (10 September 2026)

A fresh browser visit to handyhand.dk from Denmark showed a Cookiebot banner, injected by the Tag Manager container (it is not in the code). Before any choice was made, with Cookiebot reporting statistics and marketing consent as false, the page had already loaded Microsoft Clarity session recording, Bing UET, the Reddit pixel, the bestofluck.io tracker, the Trustpilot widget and the full PostHog bundle including the session recorder, and had set the _fbp (Meta), _rdt_uuid (Reddit), PostHog and hh_uid cookies. No Google Consent Mode entries were present in the data layer. In other words the banner is displayed but does not gate the trackers. The public web app shares the same container. The exported container (GTM-5T5GZ93, workspace 206) was then audited tag by tag; the full table is in the appendix. Summary: 51 tags, 55 triggers. Cookiebot is correctly installed as the consent-mode source (defaults: statistics and marketing denied), and Google tags (GA4, Google Ads) honour it natively. Only 3 of the 51 tags (Meta, TikTok) use Tag Manager's built-in consent checks. The Reddit pixel, the bestofluck.io ('Glückauf') tag, the Tune/Trackwise affiliate tag and Microsoft Clarity (loaded by the Bing UET tag) fire on every page without any consent condition. The web app pushes raw, unhashed email and phone number into the data layer for every signed-in user, and the GA4 configuration tag forwards them to Google Analytics as user properties and event parameters, which breaches Google's own no-PII terms and the minimisation principle. The Bing enhanced-conversion tag forwards the same email and phone to Microsoft. An OpenAI Ads pixel is also installed (consent-mode gated). PostHog, Trustpilot and AdTraction are loaded from the application code, not from Tag Manager, so Cookiebot cannot gate them at all today.

Deletion

Users can delete their account in settings when they have no active tasks, offers or paid stored credit. Deletion anonymises the user row (name to 'Deleted', email to a placeholder, password reset, personal fields nulled, soft-deleted), removes the profile image and portfolio from S3 (unless the user is under investigation, in which case the profile image is preserved as evidence), erases pending tasks and offers, deletes notifications, social logins, Dinero records and property reports, closes support tickets and deletes the Mautic contact. It does not delete: national ID records, bank account details, identifier hashes, push tokens, session and activity IP logs, phone-verification and SMS logs, chat messages and their edit history, reviews, admin notes, voice-call transcripts, chatbot conversations, moderation records, sign-up 'flagged data', invoices, payouts or ad-tracking events, and it sends no deletion request to any external recipient other than Mautic. Scheduled jobs delete only the generic log table (7 days) and old notifications. Chat, photos, IP logs and transcripts are therefore kept indefinitely today.

New technologies and novel processing

  • Contact-detail leak screening: every message, offer and attached image can be scanned by regex, then by Google Vision OCR, then by an OpenAI model that receives the author's recent message history and prior violations, producing a culpability grade (none, accidental, negligent, deliberate, engineered). Grades are stored per user with a 90-day look-back and a third violation is automatically floored to 'negligent'. The leaked values themselves are deliberately not stored.
  • Legacy censoring: message, offer, comment, review and profile text posted to in-house ML endpoints; offending text stored verbatim in a censorship table; users with 20+ completed offers are exempt.
  • LLM features: price suggestion from similar tasks (embeddings), AI offer recommendation explaining to the customer which Handyhander to pick, AI cleaning of decline reasons before they are shown to the other party, AI-written reactivation emails from the user's past task, chatbot for users and admins, voice agent on the support line, LLM screening of ban appeals, AI profile-tag suggestions.
  • Automated decisions: long automatic ban when a new account matches the email, phone or payment identifiers of a banned or high-cancellation account (no human step); automatic ban until age 18 when an under-18 birthdate is entered; sign-up blocked when the IP country does not match the chosen market (feature-flagged); tier and fee levels; cancellation penalties.

Screening criteria flagged as likely high risk

Large scale; evaluation/scoring; automated decision-making with significant effect; systematic monitoring of private communications; national identity numbers and financial data; matching with third-party datasets; vulnerable individuals; innovative technology; risk of physical harm from location data. See Step 1.

Describe the scope of the processing: what is the nature of the data, and does it include special category or criminal offence data? How much data will you be collecting and using? How often? How long will you keep it? How many individuals are affected? What geographical area does it cover?

Categories of personal data

CategoryExamplesWho it concerns
Identity and contactName, email, phone, profile picture, date of birth, preferred languageAll users
Identity verificationMitID verification result and identifiers (DK), CPR number (DK), BSN (NL), business registration (CVR/KVK), Stripe Connect identity verification statusHandyhanders; business customers
LocationHome / task address, geocoordinates, GPS from the app, IP-derived country and cityCustomers (task address), Handyhanders (service area, live location where enabled)
Task contentFree-text descriptions, photos and videos of homes and belongings, dates, budgetCustomers; may incidentally include third parties (family members, neighbours)
CommunicationsChat messages, offer comments, decline and cancellation reasons, support tickets, email/SMS/push logsBoth sides
FinancialCard tokens (held by Stripe), payment and refund history, payout amounts, bank account tokens, invoices, stored credits, couponsBoth sides
TaxAnnual income reported to Skattestyrelsen under DAC7 rules with CPR/CVRHandyhanders (DK and NL). Reporting is done in-house by the finance team, outside the codebase (confirmed by management, 10 Sept 2026); the procedure, data extract and access controls should be written down and attached to this DPIA
Reputation and derivedRatings, reviews, completion rates, tier level, cancellation history, AI price suggestions, fraud/quality flags, 'last online'Mainly Handyhanders; customers are also rated
Technical and behaviouralDevice IDs, push tokens, IP address, browser, pages viewed, marketing attribution (UTM, click IDs), consent flagsAll visitors and users
MarketingPromotional consent flag, email engagement, hashed email sent to Google Ads for conversion measurement, CRM segmentsUsers; opted-in leads

Special category and criminal offence data

Handyhand does not intentionally collect special category data (Article 9) or criminal offence data (Article 10). Three points need care: (1) task descriptions and chat are free text and customers sometimes disclose health or family circumstances ('I am recovering from surgery and cannot lift'); this is incidental and must be treated as potentially sensitive in storage, AI processing and access control. (2) National identity numbers (CPR, BSN) are not Article 9 data but are subject to specific national rules (Danish Data Protection Act §11, Dutch UAVG Article 46) that restrict use to purposes required by law and demand strong security. (3) Criminal record certificates (straffeattest / børneattest, VOG) are not collected by the platform, and support staff are instructed not to request or accept them; this instruction is formalised in the action plan (B-9).

Volume and frequency (production database, 9 September 2026)

MeasureValue
User accounts (all time, including anonymised erasures)≈ 664,000
Of which erased and anonymised in place≈ 26,000
Users active in the last 12 months≈ 251,000
Accounts created in the last 12 months≈ 322,000
Netherlands accounts≈ 41,000
Tasks created in the last 12 months≈ 221,000
Offers made in the last 12 months≈ 596,000
Chat messages sent in the last 12 months≈ 1.27 million

Processing is continuous (24/7), real-time for chat and notifications, and batch for scheduled jobs (reminders, payouts, tier recalculation, tax reporting, analytics).

Retention

There is currently no written retention schedule. Practice observed in the system: accounts are kept until the user deletes them or is erased; erased users are anonymised in place (name, email and identifiers overwritten) rather than deleted, so that tasks, offers, payments and reviews remain for accounting and dispute purposes; bookkeeping records must be kept 5 years under the Danish Bookkeeping Act (7 years in the Netherlands). Chat messages, photos, logs and analytics events have no defined deletion point. Defining and enforcing a retention schedule is a Step 6 measure.

Geography

Data subjects are in Denmark and the Netherlands. All hosting, including the database, is in AWS eu-central-1 (Frankfurt), confirmed by management on 10 September 2026. Many processors are US-headquartered (Amazon, Cloudflare, Google, Stripe, OpenAI, Anthropic, Perplexity, Vapi, Meta, Twilio, Expo, ipdata.co); see Step 2 nature and Step 4 for transfer safeguards.

Describe the context of the processing: what is the nature of your relationship with the individuals? How much control will they have? Would they expect you to use their data in this way? Do they include children or other vulnerable groups? Are there prior concerns over this type of processing or security flaws? Is it novel in any way? What is the current state of technology in this area? Are there any current issues of public concern that you should factor in? Are you signed up to any approved code of conduct or certification scheme (once any have been approved)?

Relationship and control

Users enter a contract with Pinploy ApS (the terms of use) and, for each task, a separate contract with each other. Handyhand is the controller for platform data. Users create their own accounts, choose what to write and upload, decide whom to chat with and can edit or delete their profile and account in settings. They have less control over derived data (ratings, tiers, fraud flags) and over what the other party does with information exchanged for a task.

Reasonable expectations

Users expect their contact details, address and task details to be used to get the job done and to be shared with the person they hire. They are less likely to expect: AI systems reading their task text and chat; server-side sharing of hashed emails with Google for advertising measurement; automatic monitoring of messages for off-platform contact; national ID numbers being stored beyond the verification moment; or that erasing an account leaves an anonymised record. Each of these needs to be clearly explained in the privacy notice.

Children and vulnerable groups

The service is for adults (18+ per the terms and privacy notice). Handyhanders in Denmark can verify through MitID, which confirms age, but verification is optional and date of birth is not collected at sign-up, so under-18s could hold accounts in either role until a birthdate is entered. Customers often include elderly people, people with disabilities or illness, and people in stressful life events (moving, bereavement). Handyhanders are frequently students, migrants or people on low or irregular incomes for whom suspension or payout delays have real consequences. Both groups count as potentially vulnerable for DPIA purposes.

Prior concerns, security history and public concern

No personal-data breach has been notified to Datatilsynet to date. Known gaps this assessment surfaced: an out-of-date privacy notice, a consent banner that does not gate several trackers, raw contact data forwarded to analytics vendors, no written retention schedule, an incomplete erasure routine, and broad internal access to production data through analytics tools. Gig-economy platforms are under active regulatory attention in the EU (Platform Work Directive 2024/2831, which restricts automated decision-making and monitoring of platform workers and must be transposed by December 2026; DAC7 tax reporting; the AI Act's transparency duties for AI systems interacting with people). Public concern about AI reading private messages and about ad tracking without consent is high; the Danish and Dutch authorities have both fined companies for consent failures.

Novelty and state of the art

Marketplace processing itself is well understood. The novel elements are the LLM features (price suggestion from similar tasks, cleaning of free-text decline reasons before showing them to the other party, chat and voice support assistants), embedding-based similarity search over task text, and automated screening of messages. Industry practice for these is to use EU-hosted or EU-region model endpoints with no-training/zero-retention terms, to minimise the text sent, and to keep a human in the loop for decisions with significant effect.

Codes of conduct and certification

Handyhand is not signed up to an approved GDPR code of conduct or certification scheme. Processors used hold ISO 27001 / SOC 2 (AWS, Stripe, Google, Microsoft/OpenAI) and Stripe is PCI DSS Level 1, which is why card data never touches Handyhand systems.

Describe the purposes of the processing: what do you want to achieve? What is the intended effect on individuals? What are the benefits of the processing – for you, and more broadly?

PurposeIntended effect on individualsBenefit
Run the marketplace: accounts, tasks, offers, chat, matchingCustomers get help at home quickly; Handyhanders find paid workCore service; Handyhand's revenue
Payments, payouts, refunds, invoices, stored creditsSafe payment, money only released when work is doneTrust on both sides; legal bookkeeping
Identity verification (MitID, Stripe identity, CVR/KVK)Reduced fraud and impersonation; safer to let a stranger into your homePlatform safety and legal compliance (anti-money-laundering rules via Stripe)
Trust and quality: ratings, reviews, tiers, cancellation rulesGood performers are rewarded; unreliable behaviour is discouragedHigher completion rates, fewer disputes
Safety and fraud prevention: message screening, geo-blocking, suspensionFewer scams and off-platform pressure; protection of payment guaranteeLower fraud losses; user protection
Notifications (email, SMS, push, web)Users know when something needs their attentionFaster matching and completion
Customer support and dispute handlingProblems get resolved; cancellation fairness rules applied consistentlyRetention; legal defence
Tax reporting (DAC7 and national rules)Handyhanders' income is reported correctlyLegal obligation
Product analytics and AI improvementBetter price guidance, fewer unanswered tasks, better UXEfficiency and growth
Marketing and advertising measurementRelevant reactivation messages; ads spend measuredGrowth; lower acquisition cost
Legal, accounting and security loggingEvidence in disputes; breach detectionLegal obligation and accountability

Where Handyhand relies on legitimate interests (fraud prevention, analytics, message screening, first-party marketing to existing users, 'last online' indicators), the interest, its necessity and the balance against users' rights are set out in Step 4.

Step 3: Consultation process

Consider how to consult with relevant stakeholders: describe when and how you will seek individuals' views – or justify why it's not appropriate to do so. Who else do you need to involve within your organisation? Do you need to ask your processors to assist? Do you plan to consult information security experts, or any other experts?

Individuals (users)

Consultation is appropriate and practical because the data subjects are existing users. Plan (October and November 2026): (1) a short in-product survey to a sample of customers and Handyhanders on the points where processing may exceed expectations (AI reading task text and chat, message screening, ad measurement, retention after account deletion, 'last online' indicator); (2) review of existing support tickets and Trustpilot reviews mentioning privacy, deletion or verification; (3) a feedback channel on the updated privacy notice. Views must be recorded and, where the final decision departs from them, the reasons documented in Step 7.

Internal stakeholders

  • Management (Saxo Merrild) – owner of this DPIA, approves measures and residual risk.
  • Engineering lead – confirms the technical facts in Step 2, owns security and retention measures.
  • Support / operations – confirms manual data handling (ID documents received by email, dispute evidence, account deletion requests).
  • Marketing – confirms tracking, ad platforms, CRM (Mautic) and consent practice.
  • Finance / accounting – confirms bookkeeping retention and DAC7 reporting scope.

Processors

Processors are contractually obliged to assist with DPIAs (Article 28(3)(f)). Ask each main processor for: their DPA, sub-processor list, transfer mechanism and security documentation. Main processors (full list in Step 2): Amazon Web Services, Cloudflare, Stripe, Criipto (MitID), Dinero, OpenAI, Anthropic, Perplexity, Google (Vision, Maps, Ads, Firebase, Tag Manager via Stape), Vapi, Twilio/JT, Expo, PostHog, Trustpilot, AdTraction, ipdata.co, n8n, plus the dormant integration with the closed Shouter marketplace.

External experts

Recommended: (a) a Danish data-protection lawyer to review lawful bases for CPR/BSN, message screening and ad measurement, and to assess whether a DPO must be designated (Article 37: 'core activities consist of regular and systematic monitoring of data subjects on a large scale' is arguably met); (b) an independent penetration test of the API, web and app; (c) advice on the Platform Work Directive as transposed in Denmark and the Netherlands.

DPO

No DPO is designated. Handyhand's core activity involves regular and systematic monitoring of a large number of users (ratings, tiers, message screening, fraud detection), so Article 37(1)(b) is likely to apply. Management will obtain a written Article 37 assessment and, unless it concludes otherwise, appoint an external DPO (action B-1). Until then the external legal adviser gives the advice recorded in Step 7.

Step 4: Assess necessity and proportionality

Describe compliance and proportionality measures, in particular: what is your lawful basis for processing? Does the processing actually achieve your purpose? Is there another way to achieve the same outcome? How will you prevent function creep? How will you ensure data quality and data minimisation? What information will you give individuals? How will you help to support their rights? What measures do you take to ensure processors comply? How do you safeguard any international transfers?

Legal framework applied

  • Regulation (EU) 2016/679 (GDPR), in particular Articles 5, 6, 9, 12-22, 25, 28, 30, 32-36 and 37, and Recitals 75-76 and 84-94 on impact assessments.
  • Danish Data Protection Act (databeskyttelsesloven), notably §11 on national identification numbers (CPR).
  • Dutch GDPR Implementation Act (Uitvoeringswet AVG), notably Article 46 on the citizen service number (BSN).
  • Danish Executive Order on cookies (cookiebekendtgørelsen) and Dutch Telecommunications Act Article 11.7a on storing and reading information on users' devices.
  • Danish Marketing Practices Act (markedsføringsloven) §10 and Dutch Telecommunications Act Article 11.7 on electronic direct marketing.
  • Council Directive (EU) 2021/514 (DAC7) as implemented in the Danish Tax Reporting Act and the Dutch implementation act, on reporting of platform sellers' income.
  • Danish Bookkeeping Act (bogføringsloven) and Dutch General Tax Act (Algemene wet inzake rijksbelastingen) on retention of accounting records (5 and 7 years).
  • Directive (EU) 2024/2831 on improving working conditions in platform work (transposition by 2 December 2026), on algorithmic management, monitoring and human review.
  • Regulation (EU) 2024/1689 (AI Act), Article 50 transparency obligations for AI systems that interact with people, applicable from 2 August 2026.
  • Guidance: Article 29 Working Party WP248 rev.01 on DPIAs; EDPB Guidelines 05/2020 on consent and 8/2020 on targeting of social media users; Datatilsynet guidance on consequence analyses, cookies and CPR numbers.

Lawful basis per purpose

PurposeLawful basis (GDPR Art. 6) and national rulesComment
Accounts, tasks, offers, chat, payments, payouts, invoices, disputes, cancellation rules6(1)(b) performance of the contract with the userNecessary: the service cannot be delivered otherwise.
Bookkeeping, invoices, payout records6(1)(c) legal obligation (Danish Bookkeeping Act 5 years; Dutch 7 years)Justifies keeping financial records after erasure; does not justify keeping chat or photos.
Tax reporting of Handyhander income (DAC7)6(1)(c) legal obligationAlso the only lawful ground for collecting BSN in the Netherlands (UAVG Art. 46: BSN only where a law prescribes it). Reporting is done in-house (confirmed); document the procedure and make sure BSN is requested only from sellers who meet the DAC7 reporting threshold.
CPR number (Denmark)Danish Data Protection Act §11(2): legal requirement (DAC7), explicit consent, or unique identification of decisive importanceDocument which limb applies; CPR must never be displayed unnecessarily (e.g. printed on invoices sent to the other party) and must be strongly secured.
Identity verification via MitID, Stripe identity, CVR/KVK6(1)(b) and 6(1)(f) legitimate interest (platform safety); Stripe's AML checks are Stripe's own legal obligationOptional for users; a legitimate-interest assessment (LIA) must be written.
Fraud prevention: identifier-hash matching, sign-up IP checks, automatic bans, geo-blocking6(1)(f) legitimate interest; automated decisions fall under Art. 22LIA required; Art. 22 requires human review on request, an explanation and the right to contest. Currently missing for autobans.
Message and image screening (the contact-detail screening, censoring)6(1)(f) legitimate interest (protecting the payment guarantee and users from off-platform fraud); ePrivacy rules on confidentiality of communicationsUsers must be told clearly; scanning must be proportionate (minimal text sent to the LLM, no storage of leaked values, human review before sanctions).
Ratings, tiers, completion and cancellation rates6(1)(b) and 6(1)(f)Core to a marketplace; Platform Work Directive will add explanation and human-review duties for worker-affecting decisions.
Service notifications (email, SMS, push, web)6(1)(b)Not marketing.
Marketing emails/SMS/push and CRM (Mautic)Consent (Danish Marketing Act §10; Dutch Telecommunicatiewet Art. 11.7) plus 6(1)(a)Consent checkbox exists and is enforced; consent record is overwritten rather than versioned.
Cookies, analytics identifiers, session replay, ad pixels, server-side conversions to Meta and GoogleConsent under the Danish Cookie Order (cookiebekendtgørelsen) and Dutch Telecommunicatiewet Art. 11.7a, plus 6(1)(a)No consent management platform or Google Consent Mode found in the code; sharing of email, phone, name and gender with Meta requires consent.
Product analytics on a strictly necessary or anonymised basis6(1)(f)Only if identifiers are removed or consent is obtained.
AI features (price suggestion, offer recommendation, decline-comment cleaning, chatbot, voice agent, AI emails)6(1)(b) where the feature is part of the service; 6(1)(f) for improvement; consent for marketing contentTransparency required (AI Act Art. 50 for AI interacting with people); processor terms with no training on our data.
Reviews, Trustpilot invitations6(1)(f)Invitations share email and name with Trustpilot; give an opt-out.
Partner sync with Shouter (closed)None going forwardThe partner has closed. The integration, token, database connection and Shouter identifiers are removed under action B-6.
Property (BBR) report6(1)(f)Public register data; minimise to what improves task matching.

Necessity and alternatives

Running the marketplace, paying out and reporting tax cannot be done with less data. For the optional layers the assessment is: (a) Fraud detection could use keyed hashes with the same effect; (b) message screening could run the deterministic scan first and only send the minimum text to an LLM when a hit is found, and could skip OCR unless regex flags an image; (c) ad measurement can work with consented, hashed data only, and postcode/country need not be sent in clear; (d) sign-up geolocation could use Cloudflare's country header alone rather than sending the raw IP to ipdata.co; (e) IP logging per session can be truncated or dropped after 30 days; (f) session replay can be turned off or masked and made consent-based; (g) CPR/BSN can be replaced by a verification flag plus a hash once DAC7 reporting no longer needs the number.

Preventing function creep

Every new feature that touches personal data goes through the existing spec-review gate before code is written; add a one-page privacy checklist to that gate (new data field? new recipient? new automated decision? new AI use?). Any 'yes' triggers an update of the Record of Processing Activities and this DPIA. Analytics and AI use of production data is limited to defined purposes; ad-hoc analysis should use anonymised extracts.

Data quality

Users edit their own profile data; MitID and Stripe supply verified identity; addresses are validated with DAWA (DK) and Google Places (NL); email typo detection at sign-up. Derived scores (tiers, ratings) recalculate from source events. Risk area: AI-generated text (cleaned decline comments, offer recommendations, summaries) is stored as fact about a person; label it as AI-generated and keep the original.

Data minimisation

Current practice is not minimal: raw sign-up headers and IP geolocation are stored on the user record indefinitely; social-login access tokens are persisted; phone-verification rows keep the phone, IP, code and raw provider response; SMS bodies are logged; MitID raw token content is stored in a legacy table; CPR/BSN appears in three tables plus invoices. Step 6 sets out the reductions.

Information to individuals

The privacy notice (last updated 26 February 2024) must be rewritten to describe: all categories of data including national ID numbers and location; all recipients listed in Step 2 with their role; the AI and monitoring features and what they decide; automated bans and how to obtain human review; retention periods per category; international transfers and safeguards; the NL market and Dutch-language version; the anonymisation approach on deletion; the cookie and tracking practice with a working cookie notice link (the current /cookiepolitik link returns 404); and a privacy contact. It should also correct the statements 'we do not process sensitive information' and 'we do not receive any information from third parties'. Layered just-in-time notices are needed at: MitID/ID-number entry, chat (screening notice), task creation (address sharing), sign-up (tracking consent).

Supporting individuals' rights

  • Access and portability: build a self-service export (JSON/CSV of profile, tasks, offers, messages, reviews, payments) and a documented DSAR procedure with a 30-day clock. No export endpoint exists today.
  • Erasure: extend the deletion routine to the tables listed in Step 2 and to external recipients (PostHog, Google, Meta, Trustpilot, Vapi, OpenAI/Anthropic logs), keeping only what bookkeeping and tax law require, and document those exceptions.
  • Rectification: already available in settings for profile data; add a route for contesting ratings, moderation verdicts and AI-generated texts.
  • Objection and restriction: provide opt-outs for Trustpilot invitations, 'last online' indicator, AI-written marketing and analytics.
  • Automated decisions (Art. 22): human review, explanation and appeal for autobans, geo-blocks and tier downgrades. The appeal flow exists for bans but is LLM-screened first; a human must be reachable.
  • Consent management: keep a versioned, timestamped consent history (current implementation overwrites the previous record).

Processor compliance

Handyhand will maintain a processor register (Article 28 and Article 30) with, for each processor: a signed data processing agreement, sub-processor list, transfer mechanism, security attestation (ISO 27001 / SOC 2), 'no training on customer data' and retention terms for AI vendors, and deletion-on-request support. Confirm DPAs exist for Criipto, Dinero, OpenAI, Anthropic, Perplexity, Vapi, Twilio/JT, Expo, PostHog, Stape, Trustpilot, ipdata.co, n8n and the Shouter data-sharing arrangement (which is controller-to-controller and needs a data-sharing agreement). Credentials for all processors are held in secrets management.

International transfers

Primary storage stays in the EU. Transfers to US providers must rely on the EU-US Data Privacy Framework (where the provider is certified: Amazon, Google, Meta, Microsoft, Stripe, OpenAI, Anthropic and others should be checked on the DPF list) or on Standard Contractual Clauses with a transfer impact assessment. Prefer EU endpoints where offered (OpenAI EU data residency, Google Vision EU region, Twilio EU region). Record each transfer in the processor register (action B-9).

Step 5: Identify and assess risks

Describe source of risk and nature of potential impact on individuals. Include associated compliance and corporate risks as necessary. Likelihood: remote, possible or probable. Severity: minimal, significant or severe. Overall risk: low, medium or high.

#Source of risk and potential impact on individualsLikelihoodSeverityOverall
R1Breach of the core database or file storage
One breach would expose names, addresses, phone numbers, national identity numbers, bank details, private chat and photos of the inside of homes for hundreds of thousands of people, enabling identity theft, fraud, burglary and harassment. The assessment identified hardening work on authentication token lifetimes, credential and secret management, encryption of the most sensitive fields and transport security between services, and found that infrastructure encryption and backup settings were not yet documented. Details are held in the internal version of this assessment.
PossibleSevereHigh
R2National identity numbers over-collected, spread and retained
CPR and BSN are held in three tables (identification, identification_number, legacy mit_id with the full raw MitID token), printed into invoice metadata, and never removed on account deletion. BSN may be collected by self-declaration from users who are not DAC7-reportable, which Dutch law does not permit. Impact: identity fraud, regulatory action under the Danish §11 and Dutch Art. 46 rules.
PossibleSevereHigh
R3Incomplete erasure
Account deletion anonymises the user row and deletes the Mautic contact, but leaves identifiable data in about 25 tables (bank accounts, ID numbers, hashes, push tokens, IP logs, phone verification, SMS bodies, chat and edit history, reviews, admin notes, call transcripts, chatbot logs, tracking events, sign-up 'flagged data') and sends no deletion to PostHog, Google, Meta, Trustpilot, Vapi, OpenAI or Anthropic. Users who asked to be forgotten remain identifiable. Impact: loss of control, complaints, regulatory action.
ProbableSignificantHigh
R4No retention schedule
Only the generic log table (7 days) and old notifications are purged. Chat messages, home photos, task descriptions, IP and session logs, phone-verification rows, SMS bodies, voice transcripts and chatbot conversations are kept indefinitely. Impact: breach exposure grows every year; storage-limitation principle breached.
ProbableSignificantHigh
R5Tracking and advertising without demonstrable consent
A Cookiebot banner is shown (injected via Tag Manager), but a live check on 9 September 2026 found that before any consent Microsoft Clarity session recording, Bing UET, the Reddit pixel, a bestofluck.io ad tracker, the Trustpilot widget and PostHog with session replay had already loaded and Meta, Reddit and PostHog cookies were set; no Consent Mode signals were present. The container audit confirms why: only 3 of 51 tags carry a consent condition, and the Reddit, bestofluck.io, Tune and Clarity tags have none. Six vendors (Reddit, Microsoft, TikTok, OpenAI Ads, Tune, bestofluck.io) are not in the codebase at all, so engineering has no visibility of them. Server-side, Meta receives email, phone, name, city, postcode, gender and user id; Google Ads receives hashed identifiers plus postcode and country in clear; the app sends clear-text contact data to Firebase when the ATT prompt is accepted. Datatilsynet treats trackers firing before consent as a breach and the Dutch AP fines for it. Impact: loss of control over data, profiling by ad platforms, session recordings of users who declined, fines.
ProbableSignificantHigh
R6Transparency failure: privacy notice out of date and recipients undisclosed
The notice (Feb 2024) names only Stripe and Google, states that no sensitive data and no third-party data is processed, and says nothing about CPR/BSN, MitID, location, AI features, message screening, automatic bans, the NL market, retention periods or the anonymisation approach. Roughly 20 recipients (OpenAI, Anthropic, Vapi, ipdata.co, Shouter, Mautic, PostHog, Trustpilot, AdTraction, n8n, Meta, Reddit, Microsoft, TikTok, Firebase and others) are undisclosed. The cookie-notice link is broken. Impact: users cannot exercise rights they do not know about; Articles 13/14 breached.
ProbableSignificantHigh
R7Automated decisions with significant effect and no human review
Long automatic bans when a new account matches a banned account's identifiers, automatic bans on under-18 birthdate, sign-up blocks based on IP country, tier and fee determination, LLM screening of ban appeals, and AI recommendations steering customers to one Handyhander. For gig workers a wrongful ban means loss of income; false positives are plausible (shared household phone or bank account, VPN use). Art. 22 and the Platform Work Directive require human review, explanation and contestability.
PossibleSevereHigh
R8Systematic monitoring of private communications
The contact-detail screening and the legacy moderation service read every message, offer and image (OCR), send text and the author's history to OpenAI, grade culpability and automatically escalate after two violations; offending text is stored verbatim in the censorship table. Users are not told. Impact: chilling effect, loss of confidentiality, incidental sensitive disclosures reaching a US LLM vendor, unfair sanctions.
PossibleSignificantMedium
R9Third-party AI processing of user content
Task text, chat, decline reasons, images, support conversations, voice transcripts and phone numbers go to OpenAI, Anthropic, Perplexity, Google Vision and Vapi in the US. Terms on training, retention, sub-processors and EU endpoints are not documented. AI-generated statements about people (cleaned comments, recommendations, summaries) are stored as data about them.
PossibleSignificantMedium
R10Undisclosed and unnecessary onward sharing
Raw IP of every new user to ipdata.co ; a dormant Shouter integration with a live token and database connection although the partner has closed; email and name to Trustpilot; birthday, earnings and last task title to Mautic; task payloads to n8n Cloud; Clarity, Bing, Reddit and bestofluck.io trackers added through Tag Manager without a code review. (Slack alerts were checked and carry only system status text, no user identifiers.) Some of this exceeds what users would expect and lacks agreements. Impact: loss of control, location exposure.
ProbableSignificantHigh
R11Location and home exposure leading to physical harm
Task dates (when a household is moving or away) and photos of homes are visible to all Handyhanders. The API hides the street address from everyone but the owner until an offer is accepted (verified), which contains this risk. Residual exposure comes from photos showing house numbers, valuables or people, and from an accepted Handyhander misusing the address.
RemoteSevereMedium
R12Weak pseudonymisation
The one-way hashes used to detect duplicate or banned accounts, and the hashed identifiers sent to two marketing partners, use methods that are weaker than current best practice and could be reversed for identifiers with a small value space, such as phone numbers. Impact: re-identification if the hash table or outbound data leaks.
PossibleSignificantMedium
R13Broad internal and AI-agent access to production data
Admin dashboard with unrestricted CSV export, admin chatbot with MitID and payment tools, impersonation, internal analytics tooling and AI-assisted analysis reading production data. Admin reads are not audit-logged. Impact: insider misuse or accidental disclosure, undetectable.
PossibleSignificantMedium
R14Children using the service
Date of birth is optional and not collected at sign-up; the under-18 ban only fires when a birthdate is entered. Customers are never age-verified. Impact: contracts with minors, minors' data processed and marketed to.
PossibleSignificantMedium
R15Weak support for data-subject rights
No export endpoint (access and portability served manually), consent records overwritten without history, no route to contest AI-generated text or moderation verdicts, no privacy-specific contact. Impact: rights requests handled late or incompletely.
PossibleSignificantMedium
R16Incidental sensitive data in free text and photos
Customers disclose health, disability, bereavement or family circumstances in task text and chat; photos show homes and sometimes people. This content is embedded, sent to LLMs, kept indefinitely and visible to staff. Impact: loss of confidentiality of Art. 9 data without a lawful basis.
PossibleSignificantMedium
R17Governance gaps (corporate risk)
No DPO although Art. 37 (large-scale regular and systematic monitoring) is arguably met; no Record of Processing Activities or processor register evidenced; no prior DPIA; no breach-response runbook evidenced. Impact: inability to demonstrate accountability if Datatilsynet or the AP investigates.
PossibleSignificantMedium
R20Raw email and phone number pushed to the data layer and forwarded to Google Analytics and Microsoft
The web app writes each signed-in user's email and phone number, unhashed, into the Tag Manager data layer. The GA4 configuration tag sends them to Google Analytics as user properties and custom parameters (Google's terms prohibit PII in Analytics and this makes every analytics event directly identifiable); the Bing enhanced-conversion tag sends them to Microsoft; any future tag added to the container can read them. Enhanced conversions only need hashed values. Impact: identifiable behavioural profiles held by ad and analytics vendors; contractual breach with Google; transfer of clear identifiers to the US.
ProbableSignificantHigh
R18Mis-sent communications and notification leakage
Email, SMS, push and voice channels carry task titles, names and amounts; wrong-recipient or shared-device exposure is possible but limited in content.
RemoteMinimalLow
R19Public profiles and reviews
Names, photos, ratings and reviews are public by design and indexed. Reputational harm from unfair reviews is mitigated by reply and moderation features.
PossibleMinimalLow

Step 6: Identify measures to reduce risk

Identify additional measures you could take to reduce or eliminate risks identified as medium or high risk in step 5.

RiskOptions to reduce or eliminate riskEffectResidualApproved
R1
Breach of the core database or file storage
Move all credentials to secrets management and rotate them; enforce encrypted transport between services; shorten authentication token lifetimes and add expiry to service credentials; encrypt national identity, bank and payment fields at field level; stop retaining third-party login tokens; document infrastructure encryption at rest and backup retention; commission an external penetration test; adopt a breach-response runbook meeting the 72-hour notification duty.ReducedMediumPending sign-off (Step 7)
R2
National identity numbers over-collected, spread and retained
Consolidate CPR/BSN into one encrypted table; delete the legacy mit_id raw token content; remove national identifiers from invoice metadata unless legally required on the document; collect BSN only from DAC7-reportable sellers at the point reporting requires it; strengthen the national-ID hash; delete the number once reporting obligations end; add CPR/BSN to the erasure routine (with a documented legal-hold exception).ReducedLowPending sign-off (Step 7)
R3
Incomplete erasure
Extend deletion to every table in Step 2 with per-table rules (delete, anonymise, or retain under bookkeeping/tax hold with a date); anonymise the user's chat and review text or pseudonymise sender ids after the counterparty's retention need lapses; implement deletion calls to PostHog, Google Ads, Meta, Trustpilot and Vapi, and confirm zero-retention with OpenAI/Anthropic; log each erasure with what was kept and why.ReducedLowPending sign-off (Step 7)
R4
No retention schedule
Adopt a written retention schedule (proposal: session/activity IP logs 30 days; phone-verification rows 30 days; SMS bodies 90 days; sign-up 'flagged data' 12 months; chat, photos and task content 24 months after task completion or erasure, then anonymise; voice transcripts and chatbot logs 90 days; moderation records 24 months; financial records 5 years DK / 7 years NL; consent records for the life of the account plus 3 years). Implement as scheduled jobs; set CloudWatch log-group retention.ReducedLowPending sign-off (Step 7)
R5
Tracking and advertising without demonstrable consent
Deploy a consent management platform on web, SEO site and app web views with Google Consent Mode v2; load GTM/Stape, AdTraction, Trustpilot widget, PostHog and session replay only after consent; make server-side Meta and Google conversions conditional on the user's recorded consent and stop sending gender, city and postcode in clear; turn PostHog identify/replay into consent-based and mask inputs; publish a real cookie notice; document consent rates. Fix the container per the appendix: add an ad_storage consent condition to Reddit, Tune, bestofluck.io, Bing and OpenAI tags and an analytics_storage condition to the Bing UET base tag (or disable its Clarity integration); remove bestofluck.io unless the business relationship is confirmed; gate PostHog, Trustpilot and AdTraction in application code using Cookiebot's consent state; audit the server-side container on ss.handyhand.dk the same way; require a review of every new tag.ReducedLowPending sign-off (Step 7)
R20
Raw email and phone number pushed to the data layer and forwarded to Google Analytics and Microsoft
Hash email and phone (one-way hash, normalised) in the web app before pushing to the data layer, or push nothing and let Google's enhanced-conversion tag hash at source; remove the email/phone user properties and the email_facebook/phone_facebook parameters from the GA4 configuration tag; restrict the Bing enhanced-conversion tag to marketing consent; use the country-correct phone prefix (the app hardcodes +45 for NL users too); request deletion of the PII already collected in GA4 (user-property data deletion request).ReducedLowPending sign-off (Step 7)
R6
Transparency failure: privacy notice out of date and recipients undisclosed
Rewrite the privacy notice (DA/EN/NL) using Step 2 as the source of truth; add layered just-in-time notices at ID entry, chat, task creation and sign-up; fix the cookie-notice link; publish a summary of this DPIA; version the notice and notify users of material changes.ReducedLowPending sign-off (Step 7)
R7
Automated decisions with significant effect and no human review
Convert autobans to 'suspend pending review' with a human decision within 48 hours, or keep autoban but guarantee human review on appeal within 72 hours and remove the LLM as gatekeeper; give a plain-language reason and appeal link in every ban, block and tier-downgrade message; log the inputs that triggered each decision; write an Art. 22 / Platform Work Directive procedure; review false-positive rates quarterly.ReducedMediumPending sign-off (Step 7)
R8
Systematic monitoring of private communications
Tell users in chat and in the notice that messages are screened for contact details and why; run the deterministic scan first and call OCR/LLM only on hits; send only the flagged snippet, not full history, where possible; stop storing offending text verbatim (store a hash or masked version); human review before any sanction above 'accidental'; publish the escalation rules; write an LIA.ReducedLowPending sign-off (Step 7)
R9
Third-party AI processing of user content
Sign DPAs with zero-retention and no-training terms; use EU endpoints (OpenAI EU residency, Google Vision EU region) or EU-hosted models; strip names, phones and addresses before sending text where the task allows; label AI-generated fields and keep the human original; list all AI vendors in the notice; assess AI Act transparency duties for the chatbot and voice agent.ReducedLowPending sign-off (Step 7)
R10
Undisclosed and unnecessary onward sharing
Replace ipdata.co with Cloudflare's country header (no raw IP leaves the platform); delete the Shouter integration (code, token, database connection, shouterUserId fields); make Trustpilot invitations opt-out and disclose them; minimise Mautic fields (drop birthday and earnings unless used); document n8n payloads and Slack alert content and strip identifiers.ReducedLowPending sign-off (Step 7)
R11
Location and home exposure leading to physical harm
Keep the existing owner-only address rule and add a test that guards it; remove the closed Shouter integration and its data; blur or discourage photos showing people or valuables; add a safety notice at task creation; make 'last online' optional.ReducedMediumPending sign-off (Step 7)
R12
Weak pseudonymisation
Replace the current hashing with a keyed method for all matching hashes and rehash existing rows; stop sending hashed email to the affiliate network without consent; adopt stronger signatures where vendors support them.ReducedLowPending sign-off (Step 7)
R13
Broad internal and AI-agent access to production data
Log admin read access to user records; restrict CSV export to roles that need it and log exports; scope admin chatbot tools by role; require named accounts and multi-factor authentication for all administrative and database access; use anonymised or sampled extracts for analysis and AI-assisted work; annual access review.ReducedLowPending sign-off (Step 7)
R14
Children using the service
Ask for date of birth or an 18+ confirmation at sign-up for both roles; use MitID age where available; exclude accounts without confirmed age from marketing; keep the automatic under-18 deactivation but delete the minor's data promptly as the notice promises.ReducedLowPending sign-off (Step 7)
R15
Weak support for data-subject rights
Build self-service export; write a DSAR procedure with templates and a 30-day tracker; add a privacy contact ([email protected]) and, if designated, DPO contact; versioned consent log; contest route for ratings, moderation and AI text.ReducedLowPending sign-off (Step 7)
R16
Incidental sensitive data in free text and photos
Add guidance at task creation ('do not include health or personal details'); detect and mask likely sensitive terms before embedding or LLM calls; restrict staff access to task text to support roles; apply the retention schedule; treat such content as Art. 9 in the breach runbook.ReducedLowPending sign-off (Step 7)
R17
Governance gaps (corporate risk)
Obtain a legal opinion on Art. 37 and appoint a DPO (internal or external) if required; create the Record of Processing Activities and processor register from Step 2; adopt a breach-response runbook; schedule an annual DPIA review; add the privacy checklist to the spec-review gate.ReducedLowPending sign-off (Step 7)

Step 7: Sign off and record outcomes

ItemName/dateNotes
Measures approved by:Saxo Merrild, management – signature and date: ____________Integrate actions back into the product roadmap, with an owner and a date for each Step 6 measure.
Residual risks approved by:Saxo Merrild, management – signature and date: ____________If any residual HIGH risk is accepted, Datatilsynet must be consulted under Article 36 before continuing that processing.
DPO advice provided:External legal adviser (name, date): ____________ – no DPO designated at the date of this versionDPO / external adviser to advise on compliance, the Step 6 measures and whether processing can proceed.
Summary of DPO advice:To be inserted on receipt of the adviser's written opinion.
DPO advice accepted or overruled by:Saxo Merrild, management – signature and date: ____________If overruled, the reasons must be recorded here.
Comments:
Consultation responses reviewed by:Saxo Merrild, management – after the user consultation in Step 3 (target 30 November 2026)If the decision departs from users' views, the reasons must be recorded here.
Comments:
This DPIA will be kept under review by:Saxo Merrild – next scheduled review 10 September 2027, and earlier on any material change (new market, new AI feature, new processor, new category of data, or a personal-data breach)The DPO / adviser should also review ongoing compliance with this DPIA.

Appendix A: Tag Manager container audit (GTM-5T5GZ93, workspace 206, exported 10 September 2026)

Method: every tag in the export was listed with its firing triggers, blocking triggers and Tag Manager consent settings, and cross-checked against what actually loaded on a fresh visit to handyhand.dk with consent declined. 'Built-in consent check' means the tag has an ad_storage or analytics_storage condition in Tag Manager. 'Consent mode' means the vendor's script reads the Google consent signals that Cookiebot sets. Paused tags are omitted (Facebook init/pageview and three blueMediaService tags are paused).

Vendor / tagsFires onConsent handlingFindingAction
Cookiebot CMP (1 tag)Consent initialisation, all pagesSource of consent; defaults: preferences granted, statistics/marketing/ad_user_data/ad_personalization denied; wait 15 sCorrectly configuredKeep
Google Tag / GA4 configuration + 13 GA4 event tagsInitialisation, page event, data-layer events (sign-up, create task, offer, assign, complete, comment, experiment)Consent mode (native); no built-in checkRuns before consent in cookieless mode, which Google permits. But the configuration tag forwards raw email and phone as user properties and as email_facebook / phone_facebook parameters (R20)Remove PII fields; keep consent mode
Google Ads (AW-816992469): 6 conversion tags + linkerData-layer events; linker on consent updateConsent mode (native); enhanced conversions with user data from data layerAcceptable when ad_user_data is granted; data layer values are unhashed (R20)Hash at source or rely on Google's own hashing; keep
Microsoft Bing UET base tag + 4 conversions + enhanced-conversion tag + UET consent-mode defaultBase tag on every page event; conversions on data-layer eventsUET consent-mode default 'denied' is set; base tag has no built-in check; enhanced-conversion tag has NOT_SETUET loads on every page and auto-loads Microsoft Clarity session recording (cnfClarity = true) before consent. Enhanced-conversion tag sends raw email and phoneAdd analytics_storage condition to base tag or disable Clarity; add ad_storage condition to conversion and enhanced-conversion tags
Reddit pixel: PageVisit + 3 conversionsEvery page event and consent update; data-layer eventsNone (NOT_SET); no consent-mode support in templateFires and sets _rdt_uuid / _rdt_pn cookies before consent (observed)Add ad_storage condition; consider removal
'Glückauf' (bestofluck.io / caraml-tracker): base tag + createTask conversionInitialisation, all pages; create-task eventNone; custom HTML sets a glk_euconsent flag from Cookiebot but loads the script regardlessUnknown vendor to engineering; Chrome lists the domain as a cross-site tracker; loads before consentIdentify the contract owner; remove or gate with ad_storage
Tune / Trackwise affiliate (identify + conversion)Consent-update event (also fires on decline); assign-task eventNone (NOT_NEEDED)Affiliate identification runs regardless of choiceAdd ad_storage condition
OpenAI Ads pixel (Stape template): page view + 4 eventsAll page views; data-layer eventsConsent mode via template (enableGoogleConsentMode); advanced matching onNot observed loading with consent denied, so gating appears to work; undisclosed vendorDisclose in notice; keep gating
Meta pixel: ViewContent (NL only) + Initiate checkoutData-layer eventsBuilt-in check: ad_storageGated. The _fbp cookie seen before consent must come from elsewhere (server-side container)Audit server container
TikTok pixel (custom HTML)Page event and consent updateBuilt-in check: ad_storageGatedKeep; disclose
Structured-data HTML tags (Organization, SiteNavigation)Page eventNot neededNo personal dataKeep
Data-layer variables: enhanced_conversion_data.* and enhanced_matching_data.* (email, phone, first/last name, city, postcode, country), userIdPushed by the web app for signed-in usersn/aRaw values; phone prefixed +45 for all marketsHash in app; correct prefix by market
Unused variable 'Consent mode | Marketing | cookiebot'n/aIntended per-tag consent exception, never wired to any tagIndicates the gating work was started but not finishedWire it or delete it

Not in the container but loaded by the application code and therefore not controlled by Cookiebot: PostHog (identify with email and name, session replay), Trustpilot widget, AdTraction tag (hashed email on task creation). These need code-level gating on Cookiebot's consent state.

Appendix B: Action plan

Every measure in Step 6 and every fact still to be confirmed has an owner and a target date. Status is reviewed monthly until all items are closed.

RefActionRisksOwnerTarget date
B-1Obtain a written Article 37 assessment and appoint an external DPO unless it concludes one is not required; record the advice in Step 7R17Management31 October 2026
B-2Document infrastructure encryption-at-rest and backup retention; enforce encrypted transport between services; move all credentials to secrets management and rotate themR1Engineering lead31 October 2026
B-3Fix consent gating in Tag Manager per Appendix A (consent conditions on Reddit, Tune, Bing, OpenAI Ads and bestofluck.io tags; disable Clarity or gate it on analytics consent); audit the server-side container; gate PostHog, Trustpilot and AdTraction in application code on Cookiebot consentR5Marketing with Engineering31 October 2026
B-4Stop pushing raw email and phone to the data layer (hash at source or remove); remove the email and phone user properties and parameters from the GA4 configuration tag; restrict the Bing enhanced-conversion tag to marketing consent; request deletion of PII already collected in GA4R20Marketing with Engineering31 October 2026
B-5Identify the owner of the bestofluck.io ('Glückauf') tag; remove it if no contract exists, otherwise sign a DPA and disclose itR5, R10Marketing15 October 2026
B-6Remove the closed Shouter integration: code, API token, database connection and shouterUserId fields; replace the ipdata.co sign-up lookup with the Cloudflare country headerR10Engineering lead30 November 2026
B-7Publish the rewritten privacy notice (Danish, English, Dutch) covering all recipients, AI and screening features, automated decisions, retention periods and transfers; fix the cookie-notice link; add just-in-time notices at ID entry, chat, task creation and sign-upR6, R8, R9Management with legal adviser30 November 2026
B-8Adopt and implement the retention schedule in Step 6 (R4) as scheduled jobs; set log-group retentionR4, R16Engineering lead31 December 2026
B-9Create the Record of Processing Activities and processor register: signed DPAs, sub-processor lists, transfer mechanism (Data Privacy Framework or SCCs), AI vendor no-training and retention terms; confirm Stape hosting region, n8n payload fields and Perplexity prompt controls; formalise the instruction that support staff never request identity documents or criminal-record certificatesR9, R10, R17Management30 November 2026
B-10Extend the erasure routine to every table listed in Step 2 with per-table rules and legal-hold exceptions; implement deletion calls to external recipients; log each erasureR3Engineering lead31 December 2026
B-11Consolidate and encrypt national identity numbers; delete legacy raw MitID token content; remove national identifiers from invoice metadata unless legally required; collect BSN only from DAC7-reportable sellers; strengthen all matching hashes with a keyed methodR2, R12Engineering lead31 December 2026
B-12Introduce human review for automatic bans, geo-blocks and tier downgrades (suspend-pending-review or guaranteed human appeal within 72 hours); plain-language reasons and appeal link in every such message; write the Article 22 procedureR7Management with Engineering31 December 2026
B-13Message screening: in-chat notice, deterministic scan before any LLM call, minimal text sent, no verbatim storage of flagged text, human review before sanctions, written legitimate-interest assessmentR8, R9Engineering lead with legal adviser31 December 2026
B-14Harden authentication token lifetimes and service credentials; encrypt bank and payment fields; stop retaining third-party login tokens; commission an external penetration test; adopt a breach-response runbookR1Engineering lead31 January 2027
B-15Self-service data export, written DSAR procedure, versioned consent log, contest route for ratings, moderation verdicts and AI-generated text; [email protected] mailboxR15Engineering lead with support31 January 2027
B-16Age confirmation at sign-up for both roles; exclude unconfirmed accounts from marketingR14Engineering lead31 January 2027
B-17Admin read-access logging, role-scoped CSV export and chatbot tools, multi-factor authentication on all administrative and database access, anonymised extracts for analysis, annual access reviewR13Engineering lead31 January 2027
B-18Document the in-house DAC7 reporting procedure (data extract, access, retention of the report) and attach it to this DPIA; align the registered address across the privacy notice and company registerR2Finance31 October 2026
B-19User consultation (survey, ticket review, notice feedback) and review of responses recorded in Step 7AllManagement30 November 2026

Sources: production codebase (api, api-v2, web, app, SEO, admin) as of 9 September 2026; production database counts as of 9 September 2026; live-site check of handyhand.dk on 9 September 2026; Tag Manager container GTM-5T5GZ93 workspace 206 exported 10 September 2026; handyhand.dk/privatlivspolitik (version dated 26 February 2024); ICO 'How do we do a DPIA?'; Article 29 Working Party Guidelines WP248 rev.01; Datatilsynet guidance on consequence analyses and its list of processing operations always requiring one.