GDPR Art. 30 — Records of Processing Activities

Processing record

This record fulfills the GDPR Article 30 obligation to maintain a record of processing activities. The public version here is an extended copy of the internal record kept for production to Datatilsynet (the Danish DPA) on request.

Controller

Name
Philip Sloth (philipsloth.com)
Contact
philipsloth1@gmail.com
Supervisory authority
Datatilsynet · datatilsynet.dk

Processing activities

Receiving and responding to inquiries submitted via the website contact form.

Legal basis
Art. 6(1)(b) (steps prior to contract) and Art. 6(1)(f) (legitimate interest in responding to inquiries).
Data subjects
Individuals who voluntarily submit the contact form.
Personal data
Name (first/last or company name), email, any attached files, optional company name, message content.
Recipients
Resend (email provider, US — EU-US Data Privacy Framework certified), self-hosted contact service + PostgreSQL database on a Hetzner server (Nuremberg, Germany, EU).
Retention
Until inquiry resolved or max 5 years (Bookkeeping Act §12 if the inquiry results in a paid engagement).

Payment processing via Stripe Checkout — collecting payment, issuing receipts, bookkeeping and VAT settlement.

Legal basis
Art. 6(1)(b) (contract performance) and Art. 6(1)(c) (legal obligation — Bookkeeping Act and VAT Act).
Data subjects
Customers who have completed a payment.
Personal data
Name, email, billing address, country, optional VAT/CVR number, payment method type (card/MobilePay/Link), Stripe identifiers (charge ID, session ID, receipt nr), amount, description of services delivered. NO card data — Stripe handles that in their PCI-DSS environment.
Recipients
Stripe (PCI-DSS-certified payment processor, US/EU — EU-US Data Privacy Framework + EEA SCCs), Resend (receipt email), self-hosted checkout service + PostgreSQL database on a Hetzner server (Nuremberg, Germany, EU).
Retention
5 years from end of accounting year (Bookkeeping Act §12). Erasure of personal data from invoice records is not possible until this period expires — legal obligation overrides Art. 17 right to erasure.

Anonymised first-party usage analytics on philipsloth.com — pageviews, sources, performance — to understand audience and optimise the site. Cookieless and aggregated. The processing is opt-in (consent-gated): nothing is collected and no visitor/session ID is created until the visitor clicks Accept on the first-visit notice; consent can be withdrawn at any time via the banner toggle, the /legal/cookies page, the browser's Do-Not-Track header, or by clearing site data.

Legal basis
Art. 6(1)(a) (consent — the visitor opts in via the first-visit notice before any analytics identifier is created; consent is withdrawable at any time).
Data subjects
Visitors to philipsloth.com who have consented to analytics on the first-visit notice.
Personal data
Locally generated pseudonymous ID (UUID in localStorage, no national identifier), session ID, page path, referrer, browser, OS, device type, language, viewport, scroll depth, duration, geographic country/city/region (server-side derived from IP, IP itself is NOT stored).
Recipients
Self-hosted analytics service + PostgreSQL database on a Hetzner server (Nuremberg, Germany, EU) — country/city is derived in memory from the IP against a local GeoLite2 database on the server; the IP itself is not stored. NO third-party analytics tools (no Google Analytics, Meta Pixel, Plausible cloud, etc.).
Retention
Raw events: 30 days (auto-deleted thereafter). Aggregated daily rollups: 24 months. Visitor rows: erased on opt-out.

Access control to the admin panel (owner only) via self-hosted GoTrue magic-link.

Legal basis
Art. 6(1)(f) (legitimate interest in secure access).
Data subjects
Owner (Philip Sloth) — the only account on the allowlist.
Personal data
Email address, login timestamp, session token (JWT), IP address at login moment (auth audit log on the self-hosted server).
Recipients
GoTrue auth (self-hosted on a Hetzner server, Nuremberg, EU), Resend (magic-link email).
Retention
Session data: 30 days. Audit log: 90 days (automated purge job on the self-hosted server).

Sub-processors

The following third-party providers process personal data on our behalf. All have a signed data-processing agreement (DPA) or equivalent contractual safeguard.

ProviderPurposeRegionSafeguards
Cloudflare Inc.Hosting (Pages), DNS, anti-bot (Turnstile), R2 backupEU edge (data primarily flows through EU data centres)EU-US Data Privacy Framework certified + Standard Contractual Clauses
Hetzner Online GmbHCloud server hosting the self-managed PostgreSQL database, authentication (GoTrue), and APIEU (Nuremberg, Germany)EU processor — data does not leave Germany/EU; data processing agreement (AVV/DPA) concluded with Hetzner
Stripe Inc.Payment processing, receipts, OSS reportingEU (Stripe Payments Europe in Ireland) + US (Stripe Inc.)EU-US Data Privacy Framework certified + EEA SCCs (Modules 2 and 3)
ResendTransactional email (receipts, magic-link, invoice link)USEU-US Data Privacy Framework certified + DPA on file
EU VIES (Europa-Kommissionen)Validation of customers' VAT numbersEUPublic EU service, no DPA required

Security measures (Art. 32)

  • TLS 1.3 on all endpoints (Cloudflare-managed on the site; Caddy-managed with automatic Let's Encrypt certificates on the API host).
  • Row Level Security (RLS) enabled on every Postgres table — customers cannot read each other's data.
  • Service-role keys server-side only (environment secrets on the backend server), never in browser bundles.
  • Cloudflare Turnstile + honeypot + per-IP rate-limiting on public forms.
  • Magic-link authentication for admin (no passwords to steal), allowlist-based access.
  • MIME allowlist + filename sanitisation on file uploads.
  • Stripe webhook signatures verified via HMAC-SHA256 (rejects forged webhooks).
  • Backup: daily automated database backup, client-side encrypted (age) and shipped off-site to Cloudflare R2, with e-mail alerting on failure and verified restoration.

Your rights

As a data subject, you have the right of access (Art. 15), rectification (Art. 16), erasure (Art. 17), restriction (Art. 18), data portability (Art. 20), and objection (Art. 21). Email philipsloth1@gmail.com — we respond within 30 days.

Note: For data subject to the 5-year retention obligation under the Danish Bookkeeping Act (invoice-related personal data), we CANNOT erase until the statutory period expires. The legal obligation overrides Art. 17.

Last updated: May 2026. Versions of this record are kept in the bookkeeping folder for Datatilsynet inspection.