OKConsent · version 216149e79c214483
DRAFT – do not publish – pending legal review (TAS-793)
Draft of 2026-10-28 for TAS-792. English translation of ../de/avv.md. OKConsent processes data of visitors to its customers' websites (consent records, script delivery, scans) on behalf of the customers; OKConsent is the processor. Legal basis: Art. 28 GDPR, Art. 32 GDPR. Annexes: Annex 2: TOMs, Annex 3: Subprocessors. Open questions: open-questions.md.
between the Customer (the "Controller") and Dipl.-Ing. Samir Alibabic – Online Marketing (sole proprietorship), Klugstraße 99, 80637 München, Germany (the "Processor" or "OKConsent").
It forms part of the contract of use under the Terms (the "Main Contract") and is concluded with it. [How the DPA comes into being (acceptance at registration, confirmation in the dashboard) is to be decided, see open-questions.md.]
The Processor ensures that persons authorised to process the data have committed themselves to confidentiality or are under an appropriate statutory obligation of confidentiality (Art. 28(3)(b) GDPR). [At present only the operator processes data on behalf; provide for a written undertaking if others are involved.]
Art. 82 GDPR and, between the parties, the liability rules of the Main Contract (§ 13 of the Terms) apply. [Check whether the limitation of liability in the Main Contract can be effective for data protection infringements between the parties.]
The Processor operates the hosted OKConsent service. It processes personal data in order, for the Controller,
| Operation | Data |
|---|---|
| Consent records (optional; per site, off by default) | random consent ID; revision of the configuration; choices (categories and services); timestamp of the decision (reported by the browser); server receive time; language; path of the page (without query and fragment, 512 characters at most); derived outcome (accept, reject, custom); IDs of organization and site. Not stored and not logged: IP address, user agent, full URL |
| Receiving a record (transient) | The IP address and request headers are processed in memory only, to rate-limit requests: an HMAC of the address under a random key that changes on every start, in fixed one-minute windows. Nothing is stored that could restore the address. The upstream proxy keeps no access log with address and referrer for this path [confirm at go-live] |
| Delivering the script, rules and hosted legal texts | When the script, the rules or a hosted legal text page is loaded through the CDN, the CDN (and, on a cache miss, our delivery service) sees the IP address, time of request, requested path (including the install source ?src=), user agent and other usual request data. Our delivery service sets no cookies and logs nothing. The CDN's access logs: see Annex 3 |
| Scans | Scans run with a fresh browser profile against public pages of the Customer's domains; real visitors are not involved. Stored are, among other things, findings (services, cookies and storage entries, network requests), page URLs and screenshots of the pages (viewport). Personal details published on public pages may incidentally appear on them |
| Details for legal texts | The Controller's details about its business: names, addresses, email addresses and telephone numbers of the operator, authorised representatives, data protection officers and providers. They are not logged and are deleted with the site |
| Data | Period |
|---|---|
| Consent records | configurable per site, 30 to 1095 days (default 365; at most 365 on the free plan). The service deletes expired records hourly. A downgrade hides surplus records and deletes them after 30 days |
| Site data (configurations, versions, legal texts, details, scans) | until the site or organization is deleted (organization: by hand at launch, on request by email) |
| Backup copies | up to 35 days after deletion in the backups (Annex 2) |
| Operation | Place |
|---|---|
| Hosting, database | Hetzner, Nuremberg, Germany |
| Backups | Scaleway Object Storage, [region: Paris, Amsterdam or Warsaw] |
| CDN | Bunny.net; requests are answered only by nodes in Europe. Access logs with anonymised IP addresses and the shortest retention |
Data protection questions: support@okconsent.com. The Processor has not appointed a data protection officer.
DRAFT – do not publish – pending legal review (TAS-793)
Draft of 2026-10-28 for TAS-792. English translation of ../de/avv-anlage-2-toms.md. Sources: docs/security-review.md, docs/architecture.md, docs/operations.md, docs/deployment.md, deploy/postgres, docs/specs/saas.md. Nothing is in production yet. The "Status" column therefore says what is built and tested in the software (Software), what operations must set up at go-live and has not set up yet (Operations, planned), and what is still to be clarified (to confirm). Before publication, every "Operations, planned" and "to confirm" row must be checked against the running environment.
As of: [date] · Version [1.0]
| Measure | Status |
|---|---|
| The servers are in Hetzner data centres. Physical access control is the data centre operator's. [Obtain and cite the operator's certificates] | to confirm |
| The Processor operates no server rooms of its own. Work devices: [description: disk encryption, screen lock] | to confirm |
| Measure | Status |
|---|---|
| Passwordless sign-in: single-use emailed link (valid 5 minutes) or GitHub. No passwords are stored | Software |
Sessions: cookie HttpOnly, Secure, SameSite=Lax; session lifetime 7 days; no IP address and no user agent stored in the session; GitHub access tokens are not stored |
Software |
| Sign-in limits: at most 3 sign-in links per address per 15 minutes; at most 20 invitations per user per hour | Software |
| Operator administration access: authenticator app (TOTP) with 10 single-use codes, re-check every 4 hours, 15-minute lock after 5 wrong codes, each code usable once, cannot be switched off. The administration is not discoverable to anyone else (same answer as for an unknown page) | Software |
| Accounts at providers (Hetzner, Bunny, GitHub, Coolify, Stripe, Scaleway) protected by two-factor authentication | to confirm |
Access to the servers over SSH and the host firewall: [description after it is defined in the repository samiralibabic/ansible; the firewall rules for the scanner are prepared there and applied at the first deployment] |
to confirm |
| Credentials and secrets live in the platform's secret environment variables, not in the source code; the service refuses to start in production with the placeholder secret | Software |
| Measure | Status |
|---|---|
| Tenant separation. Every database query is scoped to the organization. 78 attempts to reach another organization's data were rejected in the security review | Software |
| Roles per organization (owner, member); API keys act only for their organization and cannot approve anything | Software |
| API keys are stored only as a hash, shown once, can be revoked and optionally expire after 1 to 365 days | Software |
| Database roles with minimum rights: one for migrations, one for the API, one for the worker, one read-only for the delivery service; in production the services do not start with a role that is a superuser or may create objects | Software |
| The operator's administration reads data across organizations; these reads are logged with the administrator's user ID (not the content). There is no sign-in as a customer. [Define the purpose and scope of this access] | Software |
| Scheduled scans run only for domains where the service found the Customer's script | Software |
| Measure | Status |
|---|---|
| All customers share one database, separated by organization (see 1.3). The scanner runs as a separate container without the platform's credentials, with its own network, a read-only file system, no additional privileges and set memory, CPU and process limits. [Still open from the security review: SR-04, the Chromium sandbox in the container must be checked on the x86_64 production server; SR-05, the occasional Chromium launch hang under Bun has not occurred with Bun 1.4.4; Linux is to be confirmed in production.] | Software, production check open |
| A network barrier (egress firewall) for the scanner (private networks, metadata address and management services unreachable) | Operations, planned |
| Development and tests run locally; there is no staging environment with customer data | Software |
| Measure | Status |
|---|---|
| Consent records contain no IP address, no user agent and no full URL, only a random ID, choices, time, language and path without query | Software |
| Rate limiting uses an HMAC of the address under a random key held only in memory that changes on every start | Software |
| Logs (JSON) contain no personal data: path without query, status code, duration; database errors only as an error code | Software |
| The proxy keeps no access log with address and referrer for the consent record path | Operations, planned |
| The CDN serves from Europe only; its access logs anonymise IP addresses and are kept as briefly as possible (pull zone settings, docs/operations.md) | Operations, planned |
| Error reports (if switched on) are scrubbed before sending | Software |
| Measure | Status |
|---|---|
| Encrypted transfer (TLS) for dashboard, API, delivery and CDN; HSTS on dashboard and API | Operations, planned |
| Email is sent only over encrypted connections (TLS or STARTTLS enforced); connections to the backup storage use HTTPS | Software |
| Strict CSP in the dashboard, preview in a doubly sandboxed frame; redirects only within the site | Software |
| Input is validated: request size limits (1 MiB; 4 KB for consent records), strict schema, origin check against the site's domains | Software |
| CSV exports protect against formula injection | Software |
| Measure | Status |
|---|---|
| An audit log per organization records who changed what and when (sign-in, members, API keys, publications, plan changes, exports); contents of responses and secrets are not logged | Software |
| Administrator actions are recorded with the user ID (outside the organizations' audit logs) | Software |
| Measure | Status |
|---|---|
| Backups. Daily database backup (03:15), locally 3 copies (2 GB at most), on the S3-compatible EU storage for 35 days (10 GB at most). It also covers all delivered files, because they live in the database | Operations, planned |
| Restore. Monthly restore drill with a check script; alert for a missing backup from outside the management interface | Operations, planned |
| Deleted data in backups. Deleted records and sites stay in backups for up to 35 days (S3) or until the local copies rotate, and are overwritten afterwards | Operations, planned |
| Encryption of backups at rest: [enable and confirm the storage provider's server-side encryption; Coolify offers no client-side encryption, so the provider holds the keys] | to confirm |
| The CDN is only a cache; if it fails, pointing its address at the delivery service or another CDN is enough | Software |
Health checks of the services (/health, /ready, /healthz), metrics and an external uptime monitor; alerts on worker restarts and stuck jobs |
Operations, planned |
| Limits against overload: per-organization limits on simultaneous scans, scans, publications and previews per day; fair queue; rate limiting for API and MCP | Software |
Operating-system updates weekly by Ansible (restart window); Docker images pinned; containers with health checks [whether and when the restart timer is active is unknown; check in the repository samiralibabic/ansible] |
to confirm |
| Measure | Status |
|---|---|
| Security review of the code before launch with an action plan (security-review.md); findings are fixed or accepted with reasons | Software |
Automated tests locally before every change (bun run gate), including tenant separation, database tests and end-to-end tests |
Software |
| Dependencies are checked for known vulnerabilities with every change; updated before every go-live and on findings | Software |
| Check of the production environment before the first customer is onboarded (scanner sandbox, firewall, proxy, CDN) | Operations, planned |
Reporting vulnerabilities: [contact, see SECURITY.md, placeholder] |
to confirm |
| Measure | Status |
|---|---|
| Consent records are off by default and switched on per site | Software |
| Retention is configurable (30 to 1095 days); a deletion run runs hourly; at most 365 days on the free plan | Software |
| Visitors' page views never reach our API; only the decision as a record, and only if the website operator has switched consent records on | Software |
| Hosting in the EU | Operations, planned |
| Measure | Status |
|---|---|
| Subprocessors under Annex 3 with data processing agreements [conclude / confirm]; changes are announced | to confirm |
| Processing only on instructions (DPA § 2) | Software |
| Measure | Status |
|---|---|
| Confidentiality undertaking of all persons with access | to confirm |
| Process for personal data breaches with notification to the Controller within 48 hours and documentation | to confirm |
| Record of processing activities as a processor (Art. 30(2) GDPR) | to confirm |
| Data protection officer: not appointed (decision of 2026-10-28) | Operations, planned |
DRAFT – do not publish – pending legal review (TAS-793)
Draft of 2026-10-28 for TAS-792. English translation of ../de/avv-anlage-3-unterauftragsverarbeiter.md. Sources: docs/operations.md, docs/architecture.md, docs/decisions.md. Nothing is in production yet: the service is not deployed; according to operations.md accounts exist at Scaleway and Bunny, and contracts and data processing agreements still have to be checked. The list describes what the decisions provide for; check it against the actual contracts before publication. Open questions: open-questions.md.
As of: [date]
These providers process personal data on behalf of the Processor. The Controller authorises them under § 5 of the DPA.
| Provider | Service | Data | Place | Safeguard |
|---|---|---|---|---|
| Hetzner Online GmbH [confirm address], Germany | Hosting of the service: server (cloud server "CX32") with database, API, dashboard, worker, delivery service and scanner | all data under Annex 1: consent records, site data, scan results, details for legal texts; the servers transiently see the IP addresses of requests | data centre in Nuremberg, Germany | data processing agreement with Hetzner [conclude / confirm] |
| BunnyWay d.o.o. ("Bunny.net"), Slovenia [confirm address] | Content delivery network: a cache in front of our delivery service for the script, the rules and hosted legal texts | IP address, time, requested path (with ?src=), user agent of visitors to the Controller's websites. Nothing is stored at Bunny beyond the cache and logs; we use no storage at Bunny |
EU company; served from Europe only | data processing agreement with Bunny [conclude / confirm]. Access logs at Bunny with anonymised IP addresses and the shortest retention [check the setting in the pull zone]. No transfer to nodes outside the EU |
| Scaleway SAS, Paris, France [confirm address] | (1) Object Storage: database backups; (2) Transactional Email: sending emails (sign-in links, invitations, approval requests, alerts) | (1) copies of the whole database, so all data under Annex 1; (2) email addresses and contents of emails to the Controller's users (no visitor data). This is data the Processor processes as a controller in its own right (DPA § 1(3)); for it Scaleway is not a subprocessor under this agreement and is named here for transparency | France (TEM: Paris); Object Storage: [region: Paris, Amsterdam or Warsaw] | data processing agreement (DPA) of Scaleway [conclude / confirm] |
These providers are not subprocessors for data under Annex 1. They are named for transparency.
| Provider | Service | Data | Note |
|---|---|---|---|
| Stripe Payments Europe, Ltd., Ireland (group: Stripe, Inc., USA) | Payment pages (Checkout), customer portal, invoices, payment processing | the customer's name, email address, billing address, payment details, plan and invoices. No data of website visitors. | Stripe processes payment data partly as a controller in its own right (for example fraud prevention and legal duties) and partly for us. Transfers to the USA rely on standard contractual clauses and the EU-US Data Privacy Framework [check current status]. See the privacy policy |
| GitHub, Inc. (Microsoft), USA | optional sign-in with GitHub | the user's name, email address and profile picture address; account ID | GitHub acts as a controller in its own right for its account. No access to data under Annex 1 |
| Service | Status | Effect |
|---|---|---|
| Error tracking (proposal: GlitchTip, EU instance, Germany; see error-tracking.md) | Built but switched off at launch (decision of 2026-10-28); without ERROR_TRACKING_DSN nothing leaves the process. Provider not approved. Events are scrubbed beforehand (email addresses, IP addresses, query values, credentials and answers removed) and by design contain no personal data |
If switched on, the provider moves to Part A if events can contain personal data |
| Coolify (control server) at Contabo GmbH, Germany | Coolify manages the servers the service runs on, over SSH, and starts the scheduled database backups. It runs on a server of its own at Contabo and does not run the service. It holds the definitions and variables (including credentials). Coolify therefore already has access to the servers (SSH) and to the credentials and variables. Whether backups containing customer data pass through this server is unclarified. | Whether Contabo belongs in Part A as a subprocessor is for the legal review to decide (question Q15); until then the service is listed here |
| Namecheap, Inc., USA | Domains (okconsent.com, okconsent.de) and DNS zone |
No access to visitor data; DNS queries come from resolvers. No proxy in front of the records |
| AI provider | None. The service calls no AI service. The wording smoothing of legal texts is an interface only, with no provider connected | Before any use, notice under § 5 of the DPA |
We announce additions and replacements of subprocessors under § 5 of the DPA.