GDPR Art. 28

Data Processing Agreement, ready to sign

Skoleelev ApS is the processor, the school is the controller. The agreement is delivered as a PDF together with the contract — updated for 2026 with AI chokepoint and prompt audit in Annex C.

Contact us to receive the DPA

Annex B — Sub-processors

Sub-processorPurposeRegionNote
Elestio (LeapSwitch Networks Ltd.)Managed self-hosted Supabase stack (PostgreSQL, auth, storage, edge functions) — operations, upgrades, backup orchestrationIreland (HQ) / EU operationsISO 27001, DPA signed, no access to plaintext PII
Hetzner Online GmbHPhysical hosting of database, application and files + encrypted S3 backupDE — fsn1 Falkenstein (primary), nbg1 Nuremberg (replica), FI — hel1 Helsinki (Hetzner Object Storage, S3-compatible — encrypted daily backup of DB + Storage files + serverless funktion logs, 30-day retention)ISO 27001, BSI C5, EU-owned
OpenAI (Enterprise)Text AI (gpt-4o, gpt-4o-mini, o3-mini)EU residencystore:false + scrub + hashed pseudo-user
Google AI Studio (Gemini)Image & multimodal AIEU residencystore:false + scrub
Stripe Payments EuropePayment (no pupil PII)EU (Ireland)PCI-DSS Level 1
Resend / PostmarkTransactional emailEUDPA + EU sub-processor list

Note: Supabase is open-source software that we self-host via Elestio on Hetzner's EU infrastructure — Supabase Inc. is not a sub-processor, and no pupil data leaves our self-hosted environment. The school is informed at least 30 days before any new sub-processor is added and may object.

Annex C — Technical and Organisational Measures (TOMs 2026)

  • AI PII chokepoint (aiSafeFetch) — scrubs CPR, NHS/NI, email and pupil names; blocks with HTTP 422 on detection
  • AI prompt audit (ai_prompt_audit, 180-day retention) — access control: school_admin sees own pupils; the platform administrator sees only pseudonymised metadata (hashed user id, function, model), never prompt content with PII
  • Default-deny PII for Skoleelev staff — production support sees only a pseudonymised user directory (UUID + role + school prefix). Identifying a pupil requires an audited break-glass the system with a written reason (min. 20 chars), a parental-consent check for under-13s, and automatic parent/DPO notification (child_data_breakglass_notice)
  • Sensitive access log — every read of psychologist/health/SEN/safeguarding via SECURITY DEFINER function
  • Row-Level Security (access control) on every table; views are security_invoker=true; the platform administrator has no blanket FOR ALL policy on pupil-data tables
  • Impersonation requires a written reason and is blocked for under-13s without parental consent (parental consent gate)
  • Two-factor (TOTP, RFC 6238) mandatory for the platform administrator and school_admin with 3-login grace period
  • AES-256 at rest; TLS 1.3 in transit; HSTS + CSP; signed links for private buckets
  • Cross-region live replica (Falkenstein → Nürnberg) + daily snapshots; RPO < 1 minute
  • child_data_consents — 6 consent types for under-13s; useChildAgeGate blocks AI personalisation without consent
  • admin_audit_log (24 months) + daily pg_cron rotation
  • Breach notice < 24h to the school (GDPR Art. 33)
See also

Companion documents