Data Processing Agreement (DPA)
Draft – to be reviewed by a lawyer before publication
This text is a draft and not legal advice. It has not been reviewed by a lawyer and must not be read as binding. Provider company details appear as placeholders in square brackets.
Version 2026-1-entwurf
Open points
These points have to be resolved before publication.
- Transfer mechanism for Anthropic (USA). Receipt recognition via Anthropic PBC can only be used if the customer activates it (ADR-009). According to ADR-009 the Claude API offers only
usorglobalas processing location, no EU region. Open: is Anthropic certified under the EU-US Data Privacy Framework, and is that sufficient, or are Standard Contractual Clauses (Art. 46 GDPR) and a transfer risk assessment also required? The appeal against the dismissal of the Latombe action (General Court T-553/23, appeal C-703/25 P) is, according todocs/legal/datenschutz-mitbestimmung.md§3.10, still open as of its date. The feature is meant to stay off by default until the DPA is in place (ADR-009 no. 5; enforced in the system, see Annex 2). Nothing in this draft confirms a transfer basis. - Zero retention and training ban at Anthropic.
docs/legal/datenschutz-mitbestimmung.md§3.10 requires for OCR providers: no use for training, short or no retention, deletion confirmation. Whether and how this is contractually assured with Anthropic is not established and must be checked. - Role of Apple (APNs) and Google (FCM). It is unresolved whether they act as processors or as independent controllers (
docs/legal/datenschutz-mitbestimmung.md§3.10, §5 no. 11). Transfer basis and transparency are also open. Annex 3 lists them as a precaution with the status "legal status open". - Role of kloq for the push relay in the self-host case. Self-hosted operation is not covered by this DPA. Open: whether [FIRMA] acts as processor or independent controller for the push relay and update servers (SPEC §15.5, §21,
docs/legal/datenschutz-mitbestimmung.md§5 no. 10). - Role of the payroll office. The payroll office (tax adviser, payroll accountant) can be the customer's processor or an independent controller; practice in Germany is inconsistent (
docs/legal/datenschutz-mitbestimmung.md§3.10, §5 no. 12). The customer decides. This draft treats payroll office accounts in Annex 1 as user accounts of the customer and does not regulate the DPA chain between customer and payroll office. - SMTP provider. kloq needs an SMTP provider to send invitation, sign-in and notification emails. The provider has not been decided; the code only reads
KLOQ_SMTP_HOST. Annex 3 therefore contains a placeholder. Registered office, transfer basis and DPA reference are to be added. - Hosting and DPA reference Hetzner. Hetzner is not documented in the repository. SPEC §21.1 (ADR-004) names as hosting region "EU (Frankfurt/Wien), AV-Vertrag" and does not list the decision as final. To be confirmed: Hetzner Online GmbH as hosting provider, location of the data centres (Germany), the DPA reference with Hetzner, and how the sub-processing relationship is documented. Annex 2 marks the hosting statements accordingly.
- Notice period for sub-processor changes. 30 days' advance notice is a proposal (
docs/legal/datenschutz-mitbestimmung.md§3.10, side cases: "e.g. 30 days"). The period, the form of notice and the consequences of an objection (special termination right, replacement solution) are to be decided. - Liability (§10). The liability clause is a placeholder. To be decided: limitation to contract value or a multiple, relationship to Art. 82 GDPR externally, treatment of damage caused by instructions and by sub-processors.
- Contractual penalty and audit costs. Open: whether the customer carries out audits (§6) at its own cost, from what effort [FIRMA] may charge a fee, and whether a contractual penalty should be agreed at all. This draft provides for none.
- Swiss addendum (§9). Art. 9 revDSG (processing by a processor) and Art. 24 revDSG (notification) are recorded as confirmed in
docs/legal/ch-verifikation.md(Fedlex, as of 7.7.2025). Not conclusively checked: the relationship to transfers to a sub-processor abroad (Art. 16 et seq. revDSG), the competence of the FDPIC (EDÖB) in individual cases, and whether a Swiss customer needs the EU Commission's Standard Contractual Clauses with Swiss adaptation. - Retention periods. The values in Annex 4 are starting values and, per
docs/legal/datenschutz-mitbestimmung.md§5 no. 8, to be confirmed; several are marked UNVERIFIED (e.g. AT/DE time records, applicants CH). - Crypto-shredding as deletion. Whether supervisory authorities accept crypto-shredding and partition drop, including remaining hash residue, as deletion is open (
docs/legal/datenschutz-mitbestimmung.md§5 no. 9). The same applies to backups. §7 therefore phrases deletion as destruction of the person key and states the uncertainty. - Applicants. SPEC §6.3 provides no application process; the retention class
applicantsexists only as rule data. Applicant data is therefore not covered by this agreement. If this is added later, Annex 1 and Annex 4 must be adjusted. - Personal data breach notification. The notice period from [FIRMA] to the customer ("without undue delay") is deliberately not expressed in hours. Whether a fixed upper limit (e.g. 24 hours) should be included is to be decided. The customer must be able to meet the 72 hours under Art. 33 GDPR (
docs/legal/datenschutz-mitbestimmung.md§5 no. 17). - Implementation status of the measures. Several measures in Annex 2 are only partly implemented or planned (backups with point-in-time recovery, restore tests, penetration test, deletion job as a separate service, field encryption of payroll master fields). Before publication every row must be reconciled with actual operations; a measure may only read "implemented" once it demonstrably runs.
- Support access. SPEC §17 requires support only from the EU/CH or with a transfer basis. The procedure for logged, time-limited support approvals (SPEC §2, platform admin) is described in this draft only as a principle and must be confirmed technically.
Preamble and parties
This agreement governs the processing of personal data on behalf of a controller under Art. 28 GDPR between
- the customer who uses the kloq services and is called Controller below, and
- [FIRMA], [ANSCHRIFT], [FIRMENBUCHNUMMER/HANDELSREGISTER], [UID], represented by [GESCHÄFTSFÜHRUNG], contact: [KONTAKT], data protection contact: [DATENSCHUTZKONTAKT], called Processor below.
The Controller's details result from the account at contract conclusion. Under SPEC §17.1.4 the agreement is concluded with the account. Annexes 1 to 4 form part of the agreement.
§1 Subject matter and duration
- The subject matter is the provision of the software services kloq. time, kloq. people, kloq. pay and kloq. mobile as hosted services (cloud). Which products the Controller uses follows from its account; every product can be used on its own (ADR-016).
- In doing so the Processor processes personal data solely on behalf of and on documented instruction from the Controller.
- kloq pay is a payroll pre-capture tool. It does not calculate wages and reports nothing to authorities (SPEC §7). The Processor does not provide payroll accounting.
- The duration of this agreement equals the term of the contract for use of the kloq services. It ends automatically with that contract, subject to the obligations under §7.
- Operation of kloq by the Controller itself (self-host) is not covered by this agreement (see Open points, no. 4).
§2 Nature and purpose of processing, types of data, data subjects
- Nature and purpose of processing: storage, calculation, provision, transmission and deletion of data for time recording, absence and shift planning, person and access management, and payroll pre-capture, expense and receipt management, in each case according to the Controller's settings.
- The categories of data subjects and the categories of personal data are described conclusively in Annex 1.
- Special categories of personal data (Art. 9 GDPR) are processed only to the minimal extent described in Annex 1. The Processor does not process biometric data.
- The Controller remains responsible for the lawfulness of the processing, the choice of legal basis and the fulfilment of its co-determination and information duties. With the co-determination gate (ADR-019) the Processor provides a notice mechanism; it does not replace legal review and does not block.
§3 Obligations of the Processor
- Binding instructions. The Processor processes data only on documented instruction from the Controller (Art. 28(3)(a) GDPR), including with regard to transfers to third countries, unless required to do so by Union or Member State law. In that case it informs the Controller beforehand, unless that law prohibits this. Instructions follow from Annex 4.
- Unlawful instructions. If the Processor considers an instruction unlawful, it informs the Controller without undue delay and may suspend execution until the instruction is confirmed or changed (Art. 28(3) subpara. 2 GDPR).
- Confidentiality. The Processor uses only persons who are committed to confidentiality or subject to a statutory duty of secrecy (Art. 28(3)(b) GDPR) and who have access only to the extent necessary.
- Technical and organisational measures. The Processor takes the measures under Art. 32 GDPR described in Annex 2 (Art. 28(3)(c) GDPR). Annex 2 states per measure whether it is implemented, partly implemented or planned. The Processor may further develop the measures provided the level of protection does not fall. It documents material changes and communicates them on request.
- Records. The Processor keeps records of processing activities under Art. 30(2) GDPR.
- Data protection contact. The Processor names a data protection contact ([DATENSCHUTZKONTAKT]). Whether it is obliged to appoint a data protection officer it assesses on its own responsibility.
- Separation. Data of different controllers is logically separated (tenant separation, Annex 2).
- No own use. The Processor does not process the data for its own purposes, in particular not for profiling, performance or behaviour assessment of employees, and not for training models.
- Logging of access. Access by the Processor to the Controller's data for maintenance and support takes place only with the Controller's approval and is logged (see Annex 2, Open points no. 17).
§4 Sub-processors
- The Controller grants general authorisation for the use of the sub-processors named in Annex 3 (Art. 28(2) GDPR).
- The Processor informs the Controller of any intended addition or replacement of a sub-processor 30 days (proposal, see Open points no. 8) before it takes effect, in text form and by updating the list in Annex 3 (register of sub-processors, SPEC §17.1.4).
- Within that period the Controller may object for an important data protection reason. If it objects, the parties seek a solution (e.g. waiving the service, alternative provider, switching off the affected feature). If no reasonable solution is possible, the Controller may terminate the affected service for cause. The details are to be confirmed (Open points no. 8).
- The Processor contractually imposes on every sub-processor the same data protection obligations as set out in this agreement (Art. 28(4) GDPR) and remains liable to the Controller for their compliance.
- Certain sub-processors are used only at the Controller's initiative (e.g. AI receipt recognition, which the Controller must activate). Without activation no data flows there.
- There is no sub-processing relationship for services which the Controller commissions itself (e.g. SSO providers such as Microsoft Entra or Google Workspace, payroll office, target systems of the connectors). These are the Controller's own contracts (
docs/legal/datenschutz-mitbestimmung.md§3.10, side cases).
§5 Assistance to the Controller
- Data subject rights. The Processor assists the Controller with technical and organisational means in answering requests under Chapter III GDPR (access, rectification, erasure, restriction, portability, objection). For this kloq provides data subject requests with deadline tracking and export (SPEC §17.1.1). If a data subject contacts the Processor directly, the Processor forwards the request to the Controller without undue delay and does not answer it itself unless the Controller instructs it to.
- Access and export. Access and export decrypt with the person key as long as it exists (ADR-018). After the key is destroyed the affected content can no longer be recovered.
- Data protection impact assessment. On request the Processor assists with data protection impact assessments and prior consultations (Art. 35, 36 GDPR) and provides information on functions, data flows and measures, in particular on location, health and access-log functions (
docs/legal/datenschutz-mitbestimmung.md§6 nos. 6, 15). - Personal data breaches. The Processor notifies the Controller of any personal data breach affecting the Controller's data without undue delay after becoming aware of it, so that the Controller can meet the 72-hour deadline under Art. 33 GDPR (SPEC §17.1.2). The notification contains, as far as known: nature of the breach, affected data categories and approximate number of data subjects, likely consequences, measures taken and proposed, contact person. Missing details follow later. Notification address and contact person are in Annex 4.
- Notification by the Controller. Notification to the supervisory authority (Art. 33) and communication to data subjects (Art. 34) are the Controller's task. The Processor does not notify supervisory authorities or data subjects itself unless it is subject to its own statutory duty.
- Other assistance. The Processor assists the Controller in complying with Art. 32 to 36 GDPR, taking into account the nature of processing and the information available to it (Art. 28(3)(f) GDPR).
- Assistance within the standard functions is free of charge. Effort beyond the standard may be remunerated reasonably (Open points no. 10).
§6 Evidence and audit rights
- On request the Processor makes available to the Controller all information necessary to demonstrate compliance with this agreement (Art. 28(3)(h) GDPR).
- Evidence is provided primarily by documentation: Annex 2, the records under Art. 30(2) GDPR, the list of sub-processors and, where available, audit reports (e.g. the result of a penetration test under SPEC §4.2.8).
- After timely notice (at least [30] days, proposal) and during normal business hours, the Controller or an auditor mandated by it and bound to confidentiality may carry out audits including inspections. The audit must not disrupt operations disproportionately and must not disclose data of other customers.
- Audits take place as a rule at most once a year, except in case of a data breach or a justified suspicion.
- The allocation of audit costs is open (Open points no. 10).
- The Controller has access to the access log of its tenant (audit log), which contains writing admin actions, sign-ins, exports, views of sensitive fields and access by the payroll office (SPEC §17). Access by the Processor with the service role is logged separately (Annex 2).
§7 Deletion and return after the end of the contract
- Export before deletion. Before the contract ends the Controller can export its data. The Processor provides the export in a common, machine-readable format. The Controller is responsible for carrying it out in time. The export period after the end of the contract is [30] days (proposal, to be confirmed).
- Deletion. After the export period the Processor deletes the Controller's data, unless a statutory retention duty exists (Art. 28(3)(g) GDPR). Deletion follows the deletion concept of ADR-018. Personal reference in immutable (append-only) tables exists only through pseudonyms (
subject_ref,actor_ref). Personal payload is encrypted with one data key per person. Deletion works by destroying the person key and removing the mapping of pseudonyms to the person (crypto-shredding). Short-lived raw data (e.g. device reads, raw location values) sits in time-partitioned tables and is removed by partition drop, not by individual deletions. - Retention classes. Periods follow the retention classes per country and data class (Annex 4, SPEC §17.2). The Controller can configure them within plausibility limits. For persons with several countries the longest applicable period per data class applies.
- Restriction instead of deletion. Data that must still be retained is restricted (restriction under Art. 18 GDPR) until the period expires and deleted afterwards.
- Legal hold. The Controller can set a deletion block with a reason per person or case (e.g. litigation, audit). While it applies, nothing is deleted. Every block and every deletion is recorded in the audit log without personal reference in clear text.
- Deletion preview and log. Deletion runs show beforehand which persons are affected and are logged. For health and personnel files a four-eyes principle is intended (SPEC §4.2.5, §17.1.3; see status in Annex 2).
- Backups. Deletion takes effect in backups through key destruction. After a restore the deletion log is applied again (SPEC §17.3). Whether this is accepted as deletion under the GDPR is open (Open points no. 13).
- Confirmation. On request the Processor confirms deletion in text form.
§8 Transfers to third countries
- The Processor processes the Controller's data in the territory of the European Union (hosting per Annex 3, subject to confirmation in Open points no. 7). For services that process data outside the EEA, paragraph 2 applies.
- A transfer to a third country takes place only where provided for in Annex 3, where the requirements of Chapter V GDPR are met and, where it occurs only at the Controller's initiative (AI receipt recognition), the Controller has activated the feature. The Processor documents the transfer basis per sub-processor.
- Receipt recognition via Anthropic (USA). The feature is off by default. It can be activated only if the Controller has confirmed conclusion of this DPA (enforced in the system). Only the receipt image and a fixed prompt are transmitted, no names, personnel numbers or tenant data; sick notes never enter this processing (ADR-009 no. 5). According to ADR-009 the processing location is not limited to the EU. The transfer basis is open (Open points no. 1 and 2). The permitted description toward employees is: "stored in the EU, receipt recognition via Anthropic (USA)", never "all data in the EU".
- Support from third countries. Support access to the Controller's data takes place only from the EU or Switzerland or with a transfer basis, because remote access from a third country counts as a transfer (SPEC §17,
docs/legal/datenschutz-mitbestimmung.md§3.10). - The Processor informs the Controller before any change of the transfer basis (§4 para. 2).
§9 Addendum for controllers based or processing in Switzerland (revDSG)
- This addendum applies where the Swiss Federal Act on Data Protection (revDSG) applies to the processing. It supplements the provisions of this agreement.
- Processing by a processor is governed by Art. 9 revDSG: the Processor processes personal data only as the Controller itself would be permitted to, and only if no statutory or contractual duty of secrecy prohibits it. The Controller remains responsible for ensuring that the Processor guarantees data security. Passing processing on to a sub-processor requires the Controller's prior authorisation (Art. 9(3) revDSG). §4 counts as that authorisation within the general authorisation with information and right to object. Whether this general authorisation satisfies Art. 9(3) revDSG is to be checked (Open points no. 11).
- Data breaches. The Processor notifies the Controller of a breach of data security as soon as possible (Art. 24(3) revDSG). Notification to the Federal Data Protection and Information Commissioner (FDPIC, EDÖB) is the Controller's task and takes place as soon as possible if the breach is likely to lead to a high risk to the personality or fundamental rights of the data subjects (Art. 24(1) revDSG). The notice period from §5 para. 4 also applies to Swiss controllers.
- Access and release. The Processor assists with access requests under Art. 25 revDSG (30 days under Art. 18(1) DSV) and with release and transfer requests under Art. 28 revDSG (
docs/legal/ch-verifikation.md, section Datenschutz). - Abroad. Disclosure of personal data abroad follows the revDSG and the DSV. According to Annex 1 DSV, EU/EEA states count as states with adequate data protection. For the USA the Swiss-US Data Privacy Framework (in force since 15 September 2024, Annex 1 DSV) applies only to certified companies (
docs/legal/datenschutz-mitbestimmung.md§3.10 [V-CH]). Whether and how Anthropic falls under it is open (Open points no. 1). - Register. The register of processing activities follows Art. 12 revDSG and Art. 24 DSV. The exemption for small enterprises does not apply where particularly sensitive personal data is processed on a large scale (
docs/legal/datenschutz-mitbestimmung.md§5 no. 18); the case-by-case assessment is not complete. - Where Swiss employment law sets stricter requirements (Art. 328b OR, Art. 26 ArGV 3), the Controller remains responsible for configuring the functions accordingly.
- For the competence of the FDPIC and for venue and governing law, §11 and, where mandatory, Swiss provisions apply.
§10 Liability
- Draft, placeholder. The parties' liability follows the statutory provisions, in particular Art. 82 GDPR, unless otherwise agreed.
- A limitation of liability between the parties (e.g. to [BETRAG/VIELFACHES] of the annual fee) and the treatment of damage arising from the Controller's instructions or from acts of sub-processors are not yet determined (Open points no. 9).
- Liability for intent, gross negligence, injury to life, body or health, and under mandatory law remains unaffected.
- No contractual penalty is agreed (Open points no. 10).
§11 Term and final provisions
- The agreement begins on conclusion and ends with the contract for use. The right to terminate for cause remains unaffected, in particular in case of serious breaches of data protection duties.
- Obligations which by their nature continue beyond the end of the contract (confidentiality, deletion, liability) remain in force.
- Amendments and additions require text form. This also applies to changing this clause. Changes to Annexes 2 and 3 follow §3 para. 4 and §4.
- If individual provisions are invalid, the rest of the agreement remains valid. The parties replace the invalid provision with a valid one that comes closest to its purpose.
- In case of conflict between this agreement and the contract for use, this agreement prevails insofar as it concerns the processing of personal data.
- Governing law and venue: [ANWENDBARES RECHT UND GERICHTSSTAND – noch festzulegen]. Mandatory data protection provisions remain unaffected.
- Parties, contact persons and signatures: the agreement is concluded electronically with the account (SPEC §17.1.4). Conclusion is logged with time and person.
Annex 1 Subject matter, duration, nature, purpose, data subjects, data categories
1.1 Subject matter and purpose per product
Sources: SPEC §5 to §8, ADR-016.
| Product | Subject matter | Purpose | Duration |
|---|---|---|---|
| kloq. time | Bookings (clock in, clock out, break, errand), time models, time account, corrections, absences, leave account, shift plan, devices and badges, geofence result | Time recording, absence and shift planning, compliance with working-time rules | Term of the contract for use; retention per Annex 4 |
| kloq. people | Person and file master data, employments, roles, onboarding, change and offboarding processes, access management in target systems via connectors, mailbox process for departed employees (without mail contents) | Person and access management, rights assignment by role | as above |
| kloq. pay | Payroll pre-capture, notifications, wage types, expenses and travel, meal allowance, handover to the payroll office | Preparing payroll accounting. No wage calculation, no reporting to authorities | as above |
| kloq. mobile | App for employees (time mode and money mode), clocking, absences, receipts, payslips, push notifications | Employees' access to the products used | as above |
| Receipt recognition (optional) | Receipt image and fixed prompt, structured output | Pre-filling receipt data; off by default; the model never makes decisions (ADR-009) | only while the Controller has activated the feature |
Nature of processing for all products: collecting, recording, storing, organising, linking, calculating, retrieving, querying, transmitting (to authorised users and, where configured, to target systems and the payroll office), restricting, deleting.
1.2 Categories of data subjects
- Employees of the Controller (staff, including part-time, with several employments or in several countries).
- Departed employees (restricted access for access requests, payslips and withdrawal of consents, SPEC §2.2.11).
- Users with administrative roles: administrators, HR, IT administrators, team leads, data protection and works council roles.
- Payroll office staff (user accounts of the Controller; they see exactly one tenant per session).
- Applicants: not covered (see Open points no. 14).
1.3 Categories of personal data
| Category | Content | Notes |
|---|---|---|
| Master data | Name, personnel number, contact details, employment, site, team, role, emergency contact, account and sign-in data (email, passkeys, sessions) | Private number and private address for the invitation only until activation (retention class invite_contact) |
| Restricted master data | Date of birth, protection periods | Only HR and the person themselves. Planning and clients see only neutral deployment restrictions or an age band, never reason or date. Every view is logged |
| Time bookings | Booking type, three timestamps (occurred_at, device_reported_at, received_at), source, corrections with reason | Append-only; reasons are encrypted with the person key |
| Device and badge data | Link person to badge, device, reads | Raw badge UIDs are never stored, only HMAC-SHA256(secret, normalised identifier). Raw reads are removed after 30 days |
| Location | Only the result (inside/outside, accuracy) at the moment of booking | Coordinates are not stored by default; if the Controller configures it, short-lived as location_raw. No continuous GPS |
| Absences | Leave, sick leave (period and type only), care leave, special leave, etc. | No diagnosis |
| Shift plan | Shifts, swaps, requested days off, deployment restrictions (neutral) | Relevant for co-determination, responsibility with the Controller |
| Expenses and receipts | Receipt image, extracted fields (amount, merchant, date, tax rate), travel (kilometres, per diem), meal allowance | Receipts immutable with checksum; with receipt recognition activated the receipt image goes to Anthropic |
| Payroll pre-capture | Monthly totals, allowances, wage types, notifications, handover package | Encrypted sensitive fields: IBAN, social security number, tax ID, salary (status in Annex 2) |
| Log data | Audit log (who, what, when, with pseudonyms), application logs with IDs only | Employee data in the audit payload is encrypted with the person key |
| Push data | Device token for push notifications | Messages are content-free; the app fetches content directly from the server |
| Consents | Evidence for optional features (e.g. push reminder, location comfort, profile photo) | Retention class consents |
1.4 Special categories (Art. 9 GDPR)
- Health data: for sick leave only period and type (minimal type catalogue), no diagnosis (SPEC §5.4.8, §17). A photo of a certificate is optional and off by default (in Germany the duty to submit it lapses for statutorily insured persons thanks to eAU;
docs/legal/datenschutz-mitbestimmung.md§3.4). If the Controller enables attachments, they are stored with their own retention class (health_attachments) and never form part of receipt recognition. - Protection periods (maternity protection, breastfeeding time, disability) are health data and stored in isolation: only type, from, to, without diagnosis; visible only to HR and the person themselves (SPEC §6.1.6).
- Biometrics: the Processor does not store or process biometric data. If the Controller operates a terminal with biometrics, the template stays in the terminal; kloq receives only the user ID from the terminal. The Controller nevertheless remains controller under Art. 9 GDPR (
docs/legal/datenschutz-mitbestimmung.md§1 no. 5, §3.3).
Annex 2 Technical and organisational measures (TOM)
As of 2026-10-10, derived from the code, migrations and specification in the repository. The "Status" column has three values:
- implemented: demonstrable in code or migrations (source given). This does not confirm operations, only the software capability.
- partly: building blocks exist, the complete measure does not yet.
- planned: foreseen by the SPEC, not demonstrable in code or operations. This is a target, not a statement of the actual state.
Several operational measures (hosting, backups, access management at the provider) cannot be demonstrated from the repository. They are therefore not marked "implemented".
2.1 Physical access control and hosting
| Measure | Description | Status | Source |
|---|---|---|---|
| Hosting in data centres in Germany at Hetzner Online GmbH | Physical access control lies with the data centre operator (sub-processor). Hosting region EU per ADR-004 | partly | SPEC §21.1 (ADR-004: "EU (Frankfurt/Wien), AV-Vertrag"); no operational evidence in the repository; DPA reference Hetzner open |
| Access to office/development | No processing location for customer data outside hosting is foreseen | planned | To be documented |
2.2 System access control (authentication)
| Measure | Description | Status | Source |
|---|---|---|---|
| No own passwords where SSO or passkey is possible | Sign-in via SSO (OIDC), passkey or email link; self-host fallback excepted | implemented | packages/db/src/auth/ (oidc.ts, session.ts, table auth_passkey in 0005_auth.sql); SPEC §2.2 |
| Mandatory MFA for privileged roles | Mandatory for admin, HR, IT admin, payroll office, data protection, works council; second factor is recorded per session (passkey with user verification, TOTP, bound device) | implemented | packages/core/src/auth/policy.ts (MFA_REQUIRED_ROLES); 202610111100_auth_session_mfa.sql; packages/db/src/auth/mfa.ts |
| Sessions and devices revocable | Sessions in their own table, revocable; device binding of the app with refresh tokens in secure storage | partly | auth_session in 0005_auth.sql; revoking app devices per SPEC §15.3 |
| Rate limits and brute-force protection | Counting in the database (auth_rate_limits); PIN lockout at the kiosk after 3 failed attempts per SPEC | partly | packages/db/src/auth/rate-limiter.ts; kiosk PIN lockout: SPEC §4.2.9 |
| One-time, time-limited invitation and setup links | Links are single-use and time-limited | implemented | packages/db/src/invitations.ts, email-codes.ts; CLAUDE.md "Auth" |
| Emergency access | Two admins with passkey must exist before "enforce SSO" may become active | planned | CLAUDE.md "Auth" (rule; enforcement not checked) |
2.3 Data access control (authorisations)
| Measure | Description | Status | Source |
|---|---|---|---|
| Role and permission concept | Roles are bundles of permissions; team leads apply only to assigned teams | implemented | SPEC §2; 202610091405_people_roles.sql |
| Row-level security per tenant | Every business table has tenant_id and RLS. The runtime role kloq_app has no BYPASSRLS, owns no table and may not run DDL. The tenant variable is set per transaction, queries without context fail | implemented | 0000_roles.sql, 0001_helpers.sql; ADR-001 |
| Automated isolation test | Catalogue of all tables with tenant_id, one test per table | implemented | packages/db/test/db/isolation.test.ts |
| Service role server-side only, logged | Cross-tenant jobs run with kloq_service (without BYPASSRLS). Every use is logged with job and reason in service_access_log before the work | implemented | 0000_roles.sql; 0007a_service_log_outbox_order.sql; packages/db/src/context.ts (withService) |
| Restricted fields | Date of birth and protection periods via an additional restrictive RLS policy only for HR and the person; planning only via derived values (age band, deployment restrictions) | implemented | 202610091020_kern_restricted.sql; packages/db/src/kern/restricted.ts |
| Payroll office: one tenant per session | Payroll office accounts see exactly one tenant per session; rights as switches | partly | CLAUDE.md "Auth"; 202610111030_pay_office.sql; completeness not checked |
| Four-eyes principle | Decisions (e.g. absence requests) not by the same person; intended for deletion runs, mailbox stage B and admin rights in target systems | partly | 202610091400_time_absences.sql (trigger KLQ20), 202610091426_people_direct_approval_guard.sql; deletion runs: SPEC §4.2.5 |
2.4 Encryption
| Measure | Description | Status | Source |
|---|---|---|---|
| Transport encryption | HTTPS (TLS) for web, app and API; Let's Encrypt or provider certificates | planned | SPEC §15.4; configuration in operations not demonstrable |
| Envelope encryption | Master key (environment, mandatory in production, public dev key forbidden) derives a tenant key (KEK) via HKDF. Below it a data key (DEK) per person. AES-256-GCM with additional authenticated data | implemented | packages/db/src/crypto.ts; packages/db/src/keys.ts; table data_subject_keys in 0003_audit_events.sql |
| KMS integration for the master key | Currently a local provider from an environment variable; KMS is intended as replacement | planned | packages/db/src/crypto.ts (comment "later replaceable by a KMS provider in production") |
| Encrypted payload in append-only tables | Reasons, decisions, notices, receipt extraction etc. are stored encrypted with the person key | implemented | packages/db/src/pay/secure.ts (sealJson); audit_log.payload_enc in 0003_audit_events.sql |
| Field encryption IBAN, social security no., tax ID, salary | Intended for these fields per SPEC §4.2.3. The encryption building blocks exist; IBAN, social security number, tax ID and salary are not demonstrable as storage fields in the schema examined | planned | SPEC §4.2.3 (phase P5); CLAUDE.md "Sensible Felder" |
| Encryption of connector secrets and API keys | The tenant's own API key for receipt recognition is stored encrypted and handled in code as a secret value | partly | packages/db/src/pay/settings.ts (apiKeyEnc), pay/secure.ts (Secret); connector secrets: packages/db/src/people/connectors.ts |
| Data at rest at storage level | Disk/volume encryption at the hosting provider | planned | Operations; not demonstrable |
2.5 Pseudonymisation and crypto-shredding
| Measure | Description | Status | Source |
|---|---|---|---|
| Pseudonyms in immutable tables | Personal reference only via subject_ref and actor_ref (UUID). The mapping to the person sits in a mutable table | implemented | ADR-018; 0003_audit_events.sql; CLAUDE.md "Harte Regeln" |
| Destroyable person key | A person's data key can be destroyed (destroyed_at); afterwards no new payload arises and existing payload is unreadable. A trigger prevents other changes to the key table. Under legal hold nothing is destroyed | implemented | packages/db/src/keys.ts; packages/db/src/audit.ts (shredSubject); data_subject_keys_guard in 0003_audit_events.sql; 202610091030_kern_retention.sql |
| Deletion job with preview, log, own DB role | Planned as a separate job per ADR-018 with its own role and four-eyes principle for health and personnel files. In the state examined the building blocks (shredSubject, retention classes, partition functions) exist, a scheduled deletion job with its own role does not | partly | ADR-018; SPEC §17.1.3 (phase P3); apps/worker/src/jobs.ts contains no deletion job |
| Partitioned raw data, partition drop | Raw device reads sit in monthly partitions; removal via function kloq_drop_device_reads_before | implemented | 202610091210_time_devices.sql |
| Retention classes as rule data | Per country and data class with action (delete, pseudonymize, crypto_shred, restrict) and legal hold | implemented | 202610091030_kern_retention.sql; packages/db/src/kern/retention.ts; packages/rules |
2.6 Integrity
| Measure | Description | Status | Source |
|---|---|---|---|
| Append-only via database triggers | No UPDATE, DELETE or TRUNCATE on time_events, audit_log, provisioning_log, pay_submissions, shift_changes, leave_ledger, domain_events and others; triggers apply to every role and fire even with session_replication_role = replica; in addition privileges are revoked | implemented | 0001_helpers.sql (forbid_update_delete, kloq_make_append_only); 0003_audit_events.sql; 202610091220_time_events.sql |
| Chained audit log | Every entry contains the hash of its predecessor (prev_hash); chain check in trigger and application, writes serialised via advisory lock | implemented | audit_log_chain_guard in 0003_audit_events.sql; packages/db/src/audit.ts |
| Daily integrity check, alarm on break | Job audit.verify runs daily at 03:17 UTC, checks the chain per tenant, stores the result append-only and on a break raises an alarm event which is delivered to admins by email | implemented | packages/db/src/audit-verify.ts, audit-alarm.ts; apps/worker/src/jobs.ts; audit_chain_checks in 0007a_service_log_outbox_order.sql |
| Idempotency | Writing requests from devices, mobile and connectors carry an idempotency_key | partly | SPEC §4.1.2; not individually checked in detail |
| Dependency scan, secret scan, SBOM | In CI: secret scan (gitleaks), dependency audit, SBOM; monthly review of exceptions | implemented | .github/workflows/ci.yml; docs/security/audit-exceptions.md |
| Signed releases and container images | Foreseen by SPEC §4.2.7; no signing demonstrable in the CI state examined | planned | SPEC §4.2.7 |
2.7 Availability and recoverability
| Measure | Description | Status | Source |
|---|---|---|---|
| Backups with point-in-time recovery | Target per SPEC §4.1.5. Not demonstrable in the repository or operations | planned | SPEC §4.1.5 (phase P3) |
| Monthly automated restore test | Restore in staging with checksum comparison. Target, not implemented | planned | SPEC §4.1.5 |
| Re-apply deletion log after restore | erasure_ledger is applied again after restore | planned | SPEC §4.1.9, §17.3 |
| Offline first, repeatability | Kiosk, app and gateway store locally and sync; provisioning is repeatable | partly | SPEC §4.1.1, §4.1.6; mobile: apps/mobile |
| Recomputability | Derived data can be recomputed from raw data | implemented (architecture principle) | SPEC §4.1.4, §11.5 |
| Transactional outbox | Events are enqueued in the same transaction, strictly append-only | implemented | 0003_audit_events.sql; packages/db/src/outbox.ts |
2.8 Separation control
| Measure | Description | Status | Source |
|---|---|---|---|
| Tenant separation | Logical separation by RLS, separate roles for app, service, auth and jobs; keys per tenant | implemented | 0000_roles.sql, 0004_auth_role.sql, 0007_jobs_role.sql; ADR-001 |
| Product separation | Products import no code from each other; foreign keys only to core tables | implemented (architecture rule) | ADR-016; CLAUDE.md |
| Separation of test and production | Separate environments; staging for restore tests | planned | Operations |
2.9 Input and order control
| Measure | Description | Status | Source |
|---|---|---|---|
| Audit log of all writing admin actions | Also sign-ins, exports, views of sensitive fields (date of birth, protection periods, health attachments), access by the payroll office and confirmations of the co-determination gate; actor only as actor_ref | partly | SPEC §17; packages/db/src/audit.ts, kern/restricted.ts; completeness per action not checked |
| Traceability for employees | Employees see their own raw bookings and corrections; access log (date, purpose) | partly | SPEC §17.1.5 (SHOULD, phase P3); packages/db/src/audit-view.ts |
| Instructions | Instructions result from configuration in the product and written instructions (Annex 4) | implemented (process) | Annex 4 |
| Consent reservation for AI receipt recognition | Activation only with confirmed DPA and chosen provider, otherwise error avv_required | implemented | packages/db/src/pay/settings.ts |
| No processing by sub-processors without authorisation | See §4 and Annex 3 | implemented (process) | Annex 3 |
2.10 Further measures
| Measure | Description | Status | Source |
|---|---|---|---|
| No personal data in application logs | IDs only; the logging helper outputs only approved fields (no email, name, IBAN, token) | implemented | packages/core/src/logging.ts; packages/core/test/logging.test.ts; SPEC §4.2.6 |
| Raw badge UIDs never stored | Only HMAC-SHA256 of the normalised identifier (lookup_hash) | implemented | 202610091210_time_devices.sql (table credentials); packages/db/src/crypto.ts (hmacHex) |
| Data-minimising location capture | Default stores only the result; no background location | partly | SPEC §5.1.9, §5.1.10, §8; check in the app manifest per docs/legal/datenschutz-mitbestimmung.md §3.2: evidence open |
| Safe parsing of receipts | PDF parsing in a worker thread with heap and time limit | implemented | ADR-009 (additions); apps/worker/src/pdf-extract-worker.ts |
| Data breach process | Capture, assessment, notification chain to the Controller; workflow as a product function | planned | SPEC §17.1.2 (phase P3); Annex 4 section 4.3 |
| Register of sub-processors | Public list with change notification | planned | SPEC §17.1.4 (phase P1); Annex 3 |
| Penetration test | External, before the first paying customer, yearly thereafter. Not carried out | planned | SPEC §4.2.8 (phase P3) |
| Training and commitment of staff | Commitment to confidentiality | planned | Organisational; not derivable from code |
| Support access | Only with logged, time-limited approval by the tenant and from the EU/CH | planned | SPEC §2 (platform admin), §17 |
Annex 3 Sub-processors
As of 2026-10-10. The authorisation under §4 covers the following entries. Changes are notified 30 days (proposal) before taking effect, in text form; the Controller may object for an important data protection reason (§4 paras. 2 and 3).
| Name | Registered office | Purpose | Data categories | Transfer mechanism | Status |
|---|---|---|---|---|---|
| Hetzner Online GmbH | Germany | Hosting of the application, database and storage | All data categories per Annex 1 (encrypted payload and sensitive fields only as ciphertext; keys remain with [FIRMA]) | none needed (processing in Germany/EU) | To be confirmed. DPA reference open (Open points no. 7) |
| [PLATZHALTER – SMTP-Anbieter, noch nicht entschieden] | [SITZ] | Sending invitation, sign-in, notification and alarm emails | Email address, name, content of the notification (no time bookings or health data) | [TRANSFERMECHANISMUS] | Open (Open points no. 6) |
| Anthropic PBC | USA | Only if the Controller has activated AI receipt recognition (default: off, ADR-009). Extraction of structured data from receipt images | Receipt image and fixed prompt. No names, personnel numbers or tenant data. Sick notes never. The receipt image may show incidentally contained personal data (e.g. name on the receipt, card stub) | Open legal question: EU-US Data Privacy Framework and/or Standard Contractual Clauses (Art. 46 GDPR) with transfer risk assessment; processing location per ADR-009 only us or global, no EU region; appeal C-703/25 P against judgment T-553/23 pending, status open | Open. Not usable without a confirmed DPA (Open points nos. 1 and 2) |
| Apple Inc. (APNs) | USA | Delivery of content-free push notifications to iOS devices | Device token, time; no content (the app fetches content directly from the server) | Open (role, transfer basis, DPF listing not checked) | Legal status open (docs/legal/datenschutz-mitbestimmung.md §3.10, §5 no. 11) |
| Google LLC (FCM) | USA | Delivery of content-free push notifications to Android devices | as above | Open (as above) | Legal status open (as above) |
Notes:
- The Controller can switch push notifications off (retrieval when opening the app). For Apple and Google it must be clarified whether they are processors or independent controllers; until then the entry is a precaution.
- The Controller's own service providers named in §4 para. 6 (SSO providers, target systems, payroll office) are not sub-processors of the Processor.
- No further sub-processors (e.g. error reporting, monitoring, support tools) are currently foreseen. Telemetry is free of personal data by default (SPEC §4.2.6).
Annex 4 Instructions, contacts, deletion periods
4.1 Instructions
- Documented instructions. The following count as documented instructions: first, the configuration by the Controller in the product (settings, rights, retention classes, activation of optional functions such as location and receipt recognition, exports, deletions and legal holds) and second, written instructions in text form to [DATENSCHUTZKONTAKT].
- Oral instructions are to be confirmed in text form without undue delay.
- Instructions going beyond the standard functions may trigger reasonable additional costs (Open points no. 10).
4.2 Persons entitled to instruct and recipients of instructions
| Side | Persons entitled to instruct / recipients of instructions | Note |
|---|---|---|
| Controller (entitled to instruct) | [NAME UND KONTAKT, to be stored by the Controller in the account] and users with the admin role | Configuration in the product counts as the instruction of the acting person, who must be authorised to represent the Controller |
| Processor (recipient of instructions) | [DATENSCHUTZKONTAKT] | The Controller is informed if the contact person changes |
4.3 Contact for data breaches
| Direction | Contact |
|---|---|
| Notification from the Processor to the Controller | The data protection contact person stored in the Controller's account, alternatively admin users |
| Notification from the Controller to the Processor (suspected breach) | [DATENSCHUTZKONTAKT], alternatively [KONTAKT] |
Notification is made without undue delay in text form (§5 para. 4). For Swiss controllers "as soon as possible" applies (§9 para. 3).
4.4 Deletion periods (retention classes)
Starting values, to be confirmed. The values are rule data (packages/rules, with legal reference and valid_from), adjustable per Controller within plausibility limits. The former default of 7 years for all payroll-relevant data has been dropped. For persons with several countries the longest applicable period per data class applies. The start of the period is to be defined per class. Source: SPEC §17.2, docs/legal/datenschutz-mitbestimmung.md §3.7, §5 nos. 8 and 9.
| Data class | AT | DE | CH | Source |
|---|---|---|---|---|
time_records (time bookings, corrections) | 36 months | 36 months | 60 months | Art. 73 ArGV 1 (CH); AT/DE practice UNVERIFIED |
payroll_records (wage account, payroll documents) | 84 months | 72 months wage account, 96 months accounting vouchers | 120 months from end of financial year | § 132 BAO; § 41 EStG, § 147 AO; Art. 958f OR |
receipts (meal/expense receipts) | 84 months | 96 months (allocation open) | 120 months from end of financial year | § 132 BAO; § 147 AO; Art. 958f OR |
applicants | 7 months | 6 months | 3 months (UNVERIFIED) | GlBG § 15, § 29; AGG § 15(4). Currently not part of the contract |
health_attachments | until payroll + 6 months | until payroll + 6 months | until payroll + 6 months | Product decision, Art. 9 GDPR |
location_raw | 0 to 30 days | 0 to 30 days | 0 to 30 days | Product decision; default stores only the result |
device_reads | 30 days | 30 days | 30 days | Product decision |
audit_personal (views) | 12 months | 12 months | 12 months | Product decision |
consents (evidence) | withdrawal + 36 months | withdrawal + 36 months | withdrawal + 36 months | Art. 7(1) GDPR |
invite_contact (private number) | until activation | until activation | until activation | Purpose limitation SPEC §2.2 |
mailbox (locked after departure) | 90 days without access; archive by document type (7 years) | 90 days; archive by document type (6 years) | 90 days; archive (10 years) | SPEC §6.4; § 132 BAO, § 257 HGB, Art. 958f OR |
The periods for time bookings in AT and DE are not derived from a statutory period (AZG § 26 contains none; ArbZG § 16(2) and MiLoG § 17(2) apply only to a subset) and rest on limitation and forfeiture. The result of location capture follows the period for time_records.