
Privacy Compliance
- 63 installs
- 451 repo stars
- Updated July 21, 2026
- borghei/claude-skills
Privacy Compliance Navigator is a Claude skill that assesses which of 9 global privacy regulations apply to an organization, reviews DPAs, and tracks data-subject-request deadlines.
About
Privacy Compliance Navigator is a multi-regulation privacy toolkit covering GDPR, CCPA, LGPD, POPIA, PIPEDA, PDPA, PIPL, UK GDPR and the Australian Privacy Act. A developer or compliance owner uses it to determine which regulations apply to an organization, run gap analysis against current practices, review data processing agreements and manage the data-subject-request lifecycle with per-regulation deadlines. It is marked experimental and explicitly is not legal advice.
- Regulation checker mapping org location and data subjects to applicable frameworks
- DSR tracker with per-regulation deadline calculation and overdue alerts
- DPA review checklist against Art. 28 GDPR required elements
Privacy Compliance by the numbers
- 63 all-time installs (skills.sh)
- Ranked #1,221 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
privacy-compliance capabilities & compatibility
- Capabilities
- privacy notice generator · security audit · dpa review
- Use cases
- security audit
- Pricing
- Free
What privacy-compliance says it does
Multi-regulation privacy compliance navigator. Use for GDPR, CCPA, LGPD, POPIA, PIPEDA, PDPA, Privacy Act, PIPL, UK GDPR compliance assessments,
Manages Data Subject Request lifecycle across multiple regulations with deadline calculation, status tracking, and overdue alerts.
This skill is provided for educational and informational purposes only. It does NOT constitute legal advice.
npx skills add https://github.com/borghei/claude-skills --skill privacy-complianceAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 63 |
|---|---|
| repo stars | ★ 451 |
| Last updated | July 21, 2026 |
| Repository | borghei/claude-skills ↗ |
What it does
Determine which privacy regulations apply, review data processing agreements and track data-subject requests with per-regulation deadlines.
Who is it for?
Scoping which privacy laws apply and tracking DSR deadlines across jurisdictions.
Skip if: Producing binding legal advice; the skill is experimental and not legal advice.
When should I use this skill?
Running a privacy compliance assessment, reviewing a DPA, or managing data-subject requests.
What you get
An applicable-regulation list with an obligations matrix, gap analysis and a tracked DSR queue with deadlines.
- applicable-regulation matrix
- gap analysis with risk ratings
- tracked DSR queue
By the numbers
- 9 privacy regulations covered
- ships 2 Python tools (privacy_regulation_checker.py, dsr_tracker.py)
- 8 DSR request types
Files
⚠️ EXPERIMENTAL — This skill is provided for educational and informational purposes only. It does NOT constitute legal advice. All responsibility for usage rests with the user. Consult qualified legal professionals before acting on any output.
Privacy Compliance Navigator
Tools and guidance for multi-regulation privacy compliance across 9 major global privacy frameworks, DPA review, and data subject request lifecycle management.
---
Table of Contents
- Tools
- Privacy Regulation Checker
- DSR Tracker
- Reference Guides
- Workflows
- Troubleshooting
- Success Criteria
- Scope & Limitations
- Anti-Patterns
- Tool Reference
---
Tools
Privacy Regulation Checker
Determines which privacy regulations apply to an organization based on its location, data subjects, data types, and processing activities. Generates a compliance obligations matrix and flags gaps.
# Basic check — organization in Germany processing EU and US data
python scripts/privacy_regulation_checker.py \
--org-location DE \
--data-subjects EU,US \
--data-types personal,sensitive,financial \
--processing-activities marketing,analytics,hr
# JSON output for integration
python scripts/privacy_regulation_checker.py \
--org-location SG \
--data-subjects SG,AU,CN \
--data-types personal,health \
--processing-activities healthcare,research \
--json
# Include gap analysis against current practices
python scripts/privacy_regulation_checker.py \
--org-location US-CA \
--data-subjects EU,US,BR \
--data-types personal,biometric \
--processing-activities ecommerce,profiling \
--current-practices consent_mechanism,breach_process,retention_policyDetermines:
- Which of 9 regulations apply based on territorial scope rules
- Key obligations per applicable regulation
- Data subject rights required per regulation
- Response timelines per regulation
- Gap analysis when current practices are provided
Output:
- Applicable regulations list with confidence level
- Per-regulation obligations matrix
- Gap analysis with risk ratings
- Recommended priority actions
---
DSR Tracker
Manages Data Subject Request lifecycle across multiple regulations with deadline calculation, status tracking, and overdue alerts.
# Add a new GDPR access request
python scripts/dsr_tracker.py add \
--type access --regulation gdpr \
--subject "Jane Smith" --email "jane@example.com"
# Add CCPA deletion request
python scripts/dsr_tracker.py add \
--type deletion --regulation ccpa \
--subject "John Doe" --email "john@example.com"
# List all open requests
python scripts/dsr_tracker.py list
# List overdue requests only
python scripts/dsr_tracker.py list --overdue
# Update request status
python scripts/dsr_tracker.py update --id DSR-0001 --status verified
# Dashboard view with time remaining
python scripts/dsr_tracker.py dashboard
# Export as JSON
python scripts/dsr_tracker.py dashboard --jsonSupported Request Types:
| Type | GDPR Art. | CCPA Section | LGPD Art. |
|---|---|---|---|
| Access | Art. 15 | §1798.100 | Art. 18 |
| Deletion/Erasure | Art. 17 | §1798.105 | Art. 18(VI) |
| Correction/Rectification | Art. 16 | §1798.106 | Art. 18(III) |
| Portability | Art. 20 | §1798.130 | Art. 18(V) |
| Restriction | Art. 18 | — | Art. 18(IV) |
| Objection | Art. 21 | §1798.120 | Art. 18(IV) |
| Automated Decision Opt-Out | Art. 22 | §1798.185 | Art. 20 |
| Withdraw Consent | Art. 7(3) | — | Art. 18(IX) |
Deadline Calculation:
| Regulation | Initial Deadline | Extension | Extension Deadline |
|---|---|---|---|
| GDPR | 30 calendar days | +60 days (complex) | 90 calendar days |
| CCPA | 10 business days (ack) + 45 calendar days | +45 days | 90 calendar days |
| LGPD | 15 calendar days | — | — |
| POPIA | 30 calendar days | — | — |
| PIPEDA | 30 calendar days | +30 days | 60 calendar days |
| PDPA (SG) | 30 calendar days | — | — |
| Privacy Act (AU) | 30 calendar days | +30 days | 60 calendar days |
| PIPL | 15 calendar days | +15 days | 30 calendar days |
| UK GDPR | 30 calendar days | +60 days | 90 calendar days |
Statuses: received → verified → processing → completed | denied | extended
---
Reference Guides
Global Privacy Regulations
references/global_privacy_regulations.md
Comprehensive comparison of 9 major privacy regulations covering:
- Territorial scope and applicability criteria
- Legal bases for processing
- Data subject rights comparison matrix
- Breach notification requirements and timelines
- Cross-border transfer mechanisms
- DPO requirements
- Penalty structures
DPA Review Checklist
references/dpa_review_checklist.md
Complete Data Processing Agreement review guide:
- Art. 28 GDPR required elements
- 10 processor obligations with analysis points
- International transfer mechanisms (SCCs June 2021, module selection)
- Transfer impact assessment requirements
- Common DPA issues with risk levels
- Practical negotiation considerations
DSR Handling Guide
references/dsr_handling_guide.md
Data Subject Request handling reference:
- 8 request types with intake procedures
- Identity verification methods
- Response timelines per regulation
- Exemptions by regulation
- 6-step response process
- Regulatory monitoring approach
---
Workflows
Workflow 1: Regulation Applicability Assessment
Step 1: Identify organization parameters
→ Location, data subjects, data types, processing activities
Step 2: Run regulation checker
→ python scripts/privacy_regulation_checker.py --org-location [LOC] ...
Step 3: Review applicable regulations and obligations
→ Prioritize by risk (penalties, data volume, enforcement activity)
Step 4: Gap analysis against current practices
→ Re-run with --current-practices flag
Step 5: Build remediation roadmap
→ Address critical gaps first (missing legal basis, no breach process)Workflow 2: Data Subject Request Handling
Step 1: Receive and log request
→ python scripts/dsr_tracker.py add --type [type] --regulation [reg] ...
Step 2: Verify identity (proportionate to sensitivity)
→ See references/dsr_handling_guide.md for methods
→ python scripts/dsr_tracker.py update --id [ID] --status verified
Step 3: Gather data from all systems
→ python scripts/dsr_tracker.py update --id [ID] --status processing
Step 4: Apply exemptions if applicable
→ Check references/dsr_handling_guide.md exemptions table
Step 5: Prepare and send response within deadline
→ python scripts/dsr_tracker.py update --id [ID] --status completed
Step 6: Monitor dashboard for overdue requests
→ python scripts/dsr_tracker.py dashboardWorkflow 3: DPA Review
Step 1: Check DPA against Art. 28 required elements
→ Use references/dpa_review_checklist.md
Step 2: Verify processor obligations (10 items)
→ Sub-processing, deletion, audit rights, etc.
Step 3: Assess international transfer provisions
→ SCC module selection (C2P, C2C, P2P, P2C)
→ Transfer impact assessment
→ Supplementary measures
Step 4: Review practical considerations
→ Liability caps, insurance, termination, data locations
Step 5: Document findings and negotiate amendmentsWorkflow 4: Multi-Regulation Compliance Program
Step 1: Run regulation checker for full scope
→ python scripts/privacy_regulation_checker.py [params]
Step 2: Map overlapping obligations across regulations
→ Use references/global_privacy_regulations.md comparison matrix
Step 3: Build unified controls (satisfy strictest requirement)
→ GDPR-first approach covers most other regulations
Step 4: Layer regulation-specific requirements
→ CCPA opt-out mechanisms, LGPD DPO, PIPL localization
Step 5: Monitor regulatory changes
→ See references/dsr_handling_guide.md monitoring approach---
Troubleshooting
| Problem | Possible Cause | Resolution |
|---|---|---|
| Regulation checker flags unexpected regulation | Data subjects in jurisdiction not considered | Review data flow maps; even indirect data collection (analytics, cookies) can trigger territorial scope |
| DSR deadline missed | Request not logged promptly or status not updated | Implement intake SLA (log within 24 hours); use dashboard daily for overdue alerts |
| DPA missing Art. 28 elements | Template from processor is incomplete | Use DPA review checklist to identify gaps; require amendments before signing |
| Cross-border transfer mechanism unclear | Multiple transfer layers (controller → processor → sub-processor) | Map full data flow chain; each transfer leg needs its own mechanism |
| Conflicting obligations across regulations | Retention vs. deletion requirements differ | Document conflicts; apply strictest obligation unless local law mandates otherwise; seek legal counsel |
| Identity verification proportionality unclear | Over-verification deters legitimate requests | Match verification to risk: low-risk data = email confirmation; high-risk = ID verification |
---
Success Criteria
- All applicable regulations identified and mapped — regulation checker confirms coverage with zero unaddressed jurisdictions where data subjects reside
- 100% of DSRs responded within statutory deadlines — dashboard shows zero overdue requests; extension documented where used
- DPAs reviewed against Art. 28 checklist before signing — all 10 processor obligations addressed; international transfer mechanisms validated
- Compliance matrix maintained and current — quarterly review of obligations per regulation with change log
- Regulatory monitoring active — escalation criteria defined; new regulation applicability assessed within 30 days of enactment
---
Scope & Limitations
In Scope:
- Applicability assessment for 9 major privacy regulations
- Data subject request tracking with multi-regulation deadline calculation
- DPA review against Art. 28 GDPR requirements
- Cross-regulation obligation mapping
- Gap analysis against current practices
- International transfer mechanism assessment
Out of Scope:
- Legal advice on specific legal basis selection — consult qualified privacy counsel
- Supervisory authority filings or breach notifications
- Cookie consent implementation or consent management platform configuration
- Binding Corporate Rules (BCR) application process
- Sector-specific regulations (HIPAA, FERPA, GLBA) beyond the 9 covered frameworks
- Data Protection Impact Assessments (see
dpia-assessmentskill)
---
Anti-Patterns
| Anti-Pattern | Why It Fails | Better Approach |
|---|---|---|
| GDPR-only compliance | Organizations assume GDPR covers all obligations; miss CCPA opt-out requirements, LGPD DPO mandate, PIPL data localization | Run regulation checker against all jurisdictions where data subjects reside; layer regulation-specific controls |
| One-size-fits-all DSR process | Applying GDPR 30-day timeline to all regulations misses CCPA 10-business-day acknowledgment or PIPL 15-day deadline | Configure per-regulation deadlines; use DSR tracker with regulation parameter for accurate deadline calculation |
| Ignoring sub-processor chains in DPA review | DPA covers direct processor but sub-processors transfer data to third countries without TIA | Map full processing chain in DPA review; require Art. 28(2) sub-processor obligations; validate each transfer leg |
| Treating privacy as a one-time project | Regulations evolve; new laws enacted; enforcement priorities shift | Implement regulatory monitoring with escalation criteria; quarterly compliance reviews |
---
Tool Reference
privacy_regulation_checker.py
Determines applicable privacy regulations and maps obligations based on organization parameters.
| Flag | Required | Description |
|---|---|---|
--org-location <code> | Yes | Organization headquarters (ISO country code, e.g., DE, US-CA, SG) |
--data-subjects <list> | Yes | Comma-separated locations of data subjects (EU, US, BR, ZA, CA, SG, AU, CN, UK) |
--data-types <list> | Yes | Comma-separated data types (personal, sensitive, financial, health, biometric, children) |
--processing-activities <list> | Yes | Comma-separated activities (marketing, analytics, hr, ecommerce, profiling, healthcare, research) |
--current-practices <list> | No | Comma-separated current practices for gap analysis |
--json | No | Output in JSON format |
dsr_tracker.py
Tracks Data Subject Request lifecycle with multi-regulation deadline calculation.
| Subcommand | Description |
|---|---|
add | Add new DSR (--type, --regulation, --subject, --email required) |
list | List all requests (--overdue for overdue only) |
update | Update request status (--id, --status required) |
dashboard | Show dashboard with time remaining and alerts |
| Flag | Description |
|---|---|
--type <type> | Request type: access, deletion, correction, portability, restriction, objection, automated_decision, withdraw_consent |
--regulation <reg> | Regulation: gdpr, ccpa, lgpd, popia, pipeda, pdpa, privacy_act_au, pipl, uk_gdpr |
--subject <name> | Data subject name |
--email <email> | Data subject email |
--id <id> | Request ID (e.g., DSR-0001) |
--status <status> | Status: received, verified, processing, completed, denied, extended |
--overdue | Filter to overdue requests only |
--json | Output in JSON format |
--data-file <path> | Custom data file path (default: dsr_requests.json) |
DPA Review Checklist
Complete reference for reviewing Data Processing Agreements under GDPR Art. 28 and related international requirements.
---
Table of Contents
- Art. 28 Required Elements
- Processor Obligations
- International Transfer Mechanisms
- Transfer Impact Assessment
- Common DPA Issues
- Practical Considerations
- DPA Review Workflow
---
Art. 28 Required Elements
Every DPA under GDPR must contain the following elements per Art. 28(3):
| # | Required Element | Article | What to Check |
|---|---|---|---|
| 1 | Subject matter and duration | Art. 28(3) | Matches service agreement term; clear start/end |
| 2 | Nature and purpose of processing | Art. 28(3) | Specific, not generic; aligns with actual processing |
| 3 | Types of personal data | Art. 28(3) | Complete list; includes special category if applicable |
| 4 | Categories of data subjects | Art. 28(3) | All categories covered (customers, employees, children) |
| 5 | Controller's obligations and rights | Art. 28(3) | Audit rights, instruction rights, termination rights |
| 6 | Processor processes only on documented instructions | Art. 28(3)(a) | No self-serving exceptions; EU law override clause |
| 7 | Confidentiality obligation on personnel | Art. 28(3)(b) | Statutory obligation or contractual commitment |
| 8 | Security measures (Art. 32) | Art. 28(3)(c) | Specific measures listed or referenced; not just "reasonable" |
| 9 | Sub-processor conditions | Art. 28(3)(d) | General or specific authorization; same obligations flow-down |
| 10 | Assistance with DSR obligations | Art. 28(3)(e) | Technical and organizational measures to assist |
| 11 | Assistance with Art. 32-36 obligations | Art. 28(3)(f) | Security, breach notification, DPIA, prior consultation |
| 12 | Data deletion or return on termination | Art. 28(3)(g) | Clear choice for controller; timeline specified; certification |
| 13 | Audit and inspection rights | Art. 28(3)(h) | Controller can audit or appoint auditor; no unreasonable restrictions |
| 14 | Inform controller of conflicting instructions | Art. 28(3) last para | Processor must flag instructions violating GDPR |
---
Processor Obligations
10 Key Obligations to Verify
| # | Obligation | Key Check Points | Risk if Missing |
|---|---|---|---|
| 1 | Documented instructions only | No processing beyond controller instructions; EU/member state law exception must specify which law; processor must inform controller before processing under legal obligation | Processor acts as independent controller; joint liability |
| 2 | Confidentiality | All personnel under statutory or contractual confidentiality obligation; covers employees, contractors, and agents; survives termination | Unauthorized disclosure; breach notification obligation |
| 3 | Security measures (Art. 32) | Pseudonymization, encryption, confidentiality/integrity/availability/resilience, disaster recovery, regular testing; specific measures not just "appropriate" | Security incidents; regulatory findings; penalties |
| 4 | Sub-processing | General authorization with notification of changes and objection right (14-30 day window typical); OR specific prior written authorization; same contractual obligations imposed on sub-processors | Uncontrolled data sharing; transfer risks; audit gaps |
| 5 | DSR assistance | Technical measures to fulfill access, deletion, portability requests; response timeline (typically 5-10 business days to assist controller); cost allocation | Missed DSR deadlines; regulatory complaints |
| 6 | Breach notification | Notify controller without undue delay (specify hours — ideally 24-48); content requirements (nature, categories, approximate numbers, consequences, measures); assist with regulatory notification | Missed 72-hour GDPR reporting window; penalties |
| 7 | DPIA assistance | Provide information necessary for controller's DPIA; assist with prior consultation if needed | Incomplete risk assessment; regulatory findings |
| 8 | Data return/deletion | Controller choice of return or deletion on termination; timeline (30 days typical); certification of deletion; exceptions for legal retention clearly stated | Data retained indefinitely; continued processing post-termination |
| 9 | Audit rights | Controller or appointed third-party auditor access; reasonable notice period (30 days typical); scope covers processing facilities, systems, personnel; frequency (annual minimum); cost allocation | No verification of compliance; accountability gap |
| 10 | International transfers | No transfer without controller authorization; transfer mechanism specified; TIA completed; supplementary measures documented | Unlawful transfers; Schrems II violations; significant penalties |
---
International Transfer Mechanisms
SCC Module Selection (EU Commission SCCs, June 2021)
| Module | Transfer Scenario | When to Use |
|---|---|---|
| Module 1: C2C | Controller to Controller | Data sharing between independent controllers |
| Module 2: C2P | Controller to Processor | Most common — controller engages processor outside EEA |
| Module 3: P2P | Processor to Sub-processor | Processor engages sub-processor outside EEA |
| Module 4: P2C | Processor to Controller | Processor in EEA transfers back to non-EEA controller |
SCC Implementation Checklist
| # | Item | Details |
|---|---|---|
| 1 | Module selection | Correct module for party roles; may need multiple modules for complex chains |
| 2 | Annex I completion | Parties identified; data exporter/importer; contact details; description of transfer |
| 3 | Annex II completion | Technical and organizational security measures (specific, not generic) |
| 4 | Annex III completion | Sub-processor list (if Module 2/3 with general authorization) |
| 5 | Optional clauses | Docking clause (Clause 7); governing law and jurisdiction selections |
| 6 | No modification of core clauses | SCCs cannot be modified; supplementary clauses can be added if not contradicting |
UK International Data Transfer Mechanisms
| Mechanism | Description | When to Use |
|---|---|---|
| UK Addendum to EU SCCs | Addendum tables added to EU SCCs | Transfers from UK using EU SCC framework |
| UK IDTA | Standalone UK International Data Transfer Agreement | Alternative to EU SCCs + Addendum |
| UK adequacy regulations | UK equivalency decisions | Transfers to countries UK deems adequate |
| Transitional provisions | Legacy mechanisms during transition | Existing arrangements pre-UK GDPR |
Transfer Impact Assessment (TIA) Requirements
Every SCC-based transfer requires a TIA under Schrems II:
| Step | Action | Documentation |
|---|---|---|
| 1 | Map the data flow | What data, to whom, which country, purpose |
| 2 | Identify applicable law in recipient country | Surveillance laws, government access powers, intelligence sharing |
| 3 | Assess if third-country law impinges on SCC guarantees | Proportionality, necessity, judicial oversight, remedies |
| 4 | Identify supplementary measures | Technical (encryption, pseudonymization), organizational (policies, training), contractual (additional commitments) |
| 5 | Document the assessment | Retain for accountability; review annually or on material change |
| 6 | Re-assess periodically | Monitor legal developments; update if recipient country laws change |
Supplementary Measures
| Category | Examples |
|---|---|
| Technical | End-to-end encryption with controller-held keys; pseudonymization before transfer; split processing; transport encryption |
| Organizational | Strict purpose limitation policies; access minimization; internal governance for government requests; transparency reporting |
| Contractual | Warrant canary; commitment to challenge government access; immediate notification of access requests; additional audit rights |
---
Common DPA Issues
| # | Issue | Risk Level | Standard Position | Negotiation Guidance |
|---|---|---|---|---|
| 1 | Vague security measures — "commercially reasonable" or "industry standard" without specifics | High | Require specific measures listed in Annex (encryption standards, access controls, testing frequency) | Push for ISO 27001 certification or SOC 2 Type II report as baseline |
| 2 | Unlimited sub-processing — general authorization with no notification or objection right | High | Require 30-day prior notification of new sub-processors with objection right and termination option | Accept general authorization only with robust notification mechanism |
| 3 | Inadequate breach notification timeline — "reasonable time" or >72 hours | High | Require 24-48 hour notification to allow controller to meet GDPR 72-hour deadline to SA | 36-hour maximum to allow controller assessment time |
| 4 | No meaningful audit right — paper audit only, or audit limited to SOC report | Medium | Require on-site audit right (annually minimum) plus right to appoint third-party auditor | Accept SOC 2 Type II plus right to on-site audit on cause |
| 5 | Unclear data deletion — no timeline, no certification, broad retention exceptions | Medium | Require 30-day deletion post-termination with written certification; retention exceptions limited to specific legal obligations with citation | Accept 90-day maximum deletion window |
| 6 | Liability cap covers DPA — processor caps liability for data protection breaches at service agreement level | Medium | DPA liability should be uncapped or at minimum higher cap than service agreement | Negotiate separate DPA liability cap at 2-3x annual fees |
| 7 | Missing international transfer provisions — DPA silent on where data is processed | High | Require explicit data location list; any transfer requires prior consent; SCC execution | Include approved locations Annex; change triggers re-approval |
| 8 | No DPIA cooperation — processor not obligated to assist with impact assessments | Medium | Require processor to provide information necessary for controller DPIA per Art. 28(3)(f) | Include specific information processor must provide |
---
Practical Considerations
Liability and Indemnification
| Consideration | What to Check | Standard Position |
|---|---|---|
| Liability alignment | DPA liability not less than service agreement | DPA liability should equal or exceed service agreement caps |
| Indemnification for processor breach | Processor indemnifies controller for fines/claims caused by processor's GDPR violation | Mutual indemnification for respective GDPR breaches |
| Insurance requirements | Cyber liability and professional indemnity insurance | Require certificates of insurance; minimums aligned with data volume and sensitivity |
| Regulatory fine allocation | Who bears fines if imposed on controller due to processor's breach | Processor bears fines attributable to processor's non-compliance |
Termination Alignment
| Consideration | What to Check | Standard Position |
|---|---|---|
| DPA term matches service agreement | DPA does not expire before service agreement | Co-terminus with service agreement |
| Data return mechanism | Format, timeline, method for data return | Machine-readable format within 30 days; controller's choice of return or deletion |
| Post-termination processing | Clear prohibition after return/deletion | No processing after data return/deletion except as required by law |
| Transition assistance | Support during migration to new processor | Reasonable transition assistance for 90 days post-termination |
Data Locations and Security
| Consideration | What to Check | Standard Position |
|---|---|---|
| Data processing locations | All locations where data is processed, stored, or accessed | Named data centers; country-level at minimum; change notification |
| Security standards | Certifications, audit reports, pen testing | ISO 27001 or SOC 2 Type II; annual pen testing; vulnerability management |
| Encryption standards | At rest, in transit, key management | AES-256 at rest; TLS 1.2+ in transit; customer-managed keys option |
| Access controls | Personnel access, MFA, privileged access management | Role-based access; MFA required; privileged access logged |
| Incident response | Tested plan, communication procedures | Annual tabletop exercises; dedicated security contact |
---
DPA Review Workflow
Step-by-Step Review Process
| Step | Action | Time Estimate |
|---|---|---|
| 1 | Confirm party roles — Is the counterparty a processor or joint controller? Review actual data flows, not just label. | 15 min |
| 2 | Check Art. 28 required elements — Walk through the 14-item checklist above. Flag any missing elements. | 30 min |
| 3 | Verify 10 processor obligations — Review each obligation for completeness and specificity. | 45 min |
| 4 | Assess international transfers — Identify all transfer destinations; verify mechanism for each (SCC module, adequacy, etc.) | 30 min |
| 5 | Review sub-processor provisions — Check current sub-processor list; verify notification/objection mechanism. | 15 min |
| 6 | Evaluate practical considerations — Liability caps, insurance, termination, data locations. | 30 min |
| 7 | Document findings — Create redline or issue list with risk ratings and requested amendments. | 30 min |
| 8 | Negotiate amendments — Prioritize by risk; prepare fallback positions. | Variable |
| 9 | Final sign-off — Legal, DPO, and business sign-off before execution. | 15 min |
Risk Rating Framework
| Rating | Description | Action Required |
|---|---|---|
| Critical | Missing Art. 28 required element; no transfer mechanism; no breach notification | Must resolve before signing |
| High | Vague security measures; unlimited sub-processing; inadequate audit rights | Should resolve before signing; escalate if processor resists |
| Medium | Liability cap concerns; missing insurance; unclear data locations | Negotiate improvement; accept with documented risk if necessary |
| Low | Minor wording preferences; formatting; non-material terms | Document preference; accept if processor's standard |
Data Subject Request Handling Guide
Comprehensive reference for handling data subject requests across 9 privacy regulations, from intake through response and regulatory monitoring.
---
Table of Contents
- Request Types
- Intake Process
- Identity Verification
- Response Timelines
- Exemptions by Regulation
- Response Process
- Request Type Details
- Regulatory Monitoring
---
Request Types
| # | Request Type | Description | Key Regulations |
|---|---|---|---|
| 1 | Access | Provide copy of personal data and processing information | All 9 regulations |
| 2 | Deletion/Erasure | Delete personal data ("right to be forgotten") | GDPR Art. 17, CCPA §1798.105, LGPD Art. 18(VI), PIPL Art. 47, UK GDPR Art. 17 |
| 3 | Correction/Rectification | Correct inaccurate personal data | GDPR Art. 16, CCPA §1798.106, LGPD Art. 18(III), PIPL Art. 46, UK GDPR Art. 16 |
| 4 | Portability | Receive data in structured, machine-readable format | GDPR Art. 20, CCPA §1798.130, LGPD Art. 18(V), PIPL Art. 45, PDPA §26F |
| 5 | Restriction of processing | Limit processing while dispute is resolved | GDPR Art. 18, LGPD Art. 18(IV), PIPL Art. 44, UK GDPR Art. 18 |
| 6 | Objection | Object to processing based on legitimate interests or direct marketing | GDPR Art. 21, CCPA §1798.120 (opt-out of sale), UK GDPR Art. 21 |
| 7 | Automated decision opt-out | Right not to be subject to solely automated decisions with legal/significant effects | GDPR Art. 22, CCPA §1798.185, LGPD Art. 20, PIPL Art. 24, UK GDPR Art. 22 |
| 8 | Withdraw consent | Withdraw previously given consent for processing | GDPR Art. 7(3), LGPD Art. 18(IX), PDPA §16, PIPL Art. 15, UK GDPR Art. 7(3) |
---
Intake Process
Step 1: Receive Request
| Channel | Considerations |
|---|---|
| Email to privacy@company.com | Standard channel; auto-acknowledge receipt |
| Web form (privacy portal) | Preferred — captures structured data; auto-generates tracking ID |
| Physical mail | Scan and log; may require follow-up for verification |
| In-person/phone | Document in writing; confirm details with requestor |
| Third-party agent | Verify agent authorization; may require power of attorney |
| Social media / public channel | Direct to private channel; do not disclose personal data publicly |
Step 2: Log and Categorize
| Field | Required | Notes |
|---|---|---|
| Request ID | Auto-generated | Format: DSR-YYYY-NNNN |
| Date received | Timestamp | Starts deadline clock |
| Requestor name | Yes | As provided by data subject |
| Contact method | Yes | Email, address, or phone for response |
| Request type(s) | Yes | May combine multiple types (access + deletion) |
| Applicable regulation | Determined | Based on requestor location and data processing context |
| Data subject identifier | Yes | How to locate their data in systems |
| Urgency flags | Auto | PIPL/LGPD = 15-day deadline; CCPA = 10-business-day ack |
Step 3: Acknowledge Receipt
| Regulation | Acknowledgment Requirement | Timeline |
|---|---|---|
| GDPR | No formal ack requirement (best practice: immediate) | Recommended: same business day |
| CCPA/CPRA | Formal acknowledgment required | 10 business days |
| LGPD | Immediate confirmation of receipt | Promptly |
| POPIA | No formal requirement | Best practice: 5 business days |
| PIPEDA | No formal requirement | Best practice: 5 business days |
| PDPA | Reasonable effort to respond | As soon as practicable |
| Privacy Act (AU) | Acknowledge and provide timeframe | 14 calendar days |
| PIPL | No formal requirement | Promptly |
| UK GDPR | No formal ack requirement (best practice: immediate) | Recommended: same business day |
---
Identity Verification
Verification Methods by Risk Level
| Risk Level | Data Sensitivity | Verification Method | Examples |
|---|---|---|---|
| Low | Public-facing data, non-sensitive | Email confirmation from account email | Newsletter preferences, public profile |
| Medium | Account data, purchase history | Login verification + security question OR email + phone confirmation | E-commerce account, service records |
| High | Financial, health, sensitive data | Government-issued ID + account verification | Banking records, medical records, HR files |
| Very High | Special category data, children's data | In-person verification OR notarized authorization + ID | Health records, children's education data |
Verification Principles
| Principle | Description |
|---|---|
| Proportionality | Verification must be proportionate to sensitivity of data; do not over-verify |
| No additional data collection | Do not collect more personal data than necessary for verification (Art. 11(2) GDPR) |
| Existing relationship | Use existing authentication if data subject has an account |
| Reasonable effort | If identity cannot be confirmed, may request additional evidence — document efforts |
| Time impact | Verification time counts within deadline — verify promptly |
| Agent requests | Third-party agents require written authorization (power of attorney or equivalent) |
CCPA-Specific Verification Requirements
| Request Type | Verification Level |
|---|---|
| Right to know (categories) | Reasonable degree of certainty |
| Right to know (specific pieces) | Reasonably high degree of certainty |
| Right to delete | Reasonable degree of certainty (non-sensitive) / Reasonably high (sensitive) |
| Right to opt-out of sale | No verification required (must honor) |
---
Response Timelines
| Regulation | Ack Deadline | Response Deadline | Extension Available | Max Total Time | Extension Conditions |
|---|---|---|---|---|---|
| GDPR | Best practice | 30 calendar days | +60 calendar days | 90 calendar days | Complex request or high volume; must notify data subject within initial 30 days with reasons |
| CCPA/CPRA | 10 business days | 45 calendar days | +45 calendar days | 90 calendar days | Reasonably necessary; must notify consumer |
| LGPD | Promptly | 15 calendar days | None | 15 calendar days | No extension provision; simplified format immediately, complete within 15 days |
| POPIA | Best practice | 30 calendar days | None | 30 calendar days | Adequate reasons for refusal only |
| PIPEDA | Best practice | 30 calendar days | +30 calendar days | 60 calendar days | Required to meet deadline impracticable; written notice with new date and reason |
| PDPA | As practicable | 30 calendar days | None standard | 30 calendar days | May take longer if reasonable; must inform requestor |
| Privacy Act (AU) | 14 days | 30 calendar days | +30 calendar days | 60 calendar days | If reasonable; must notify with reasons |
| PIPL | Promptly | 15 calendar days | +15 calendar days | 30 calendar days | Notify with reasons for extension |
| UK GDPR | Best practice | 30 calendar days | +60 calendar days | 90 calendar days | Complex or numerous requests; notify within initial 30 days |
---
Exemptions by Regulation
GDPR / UK GDPR Exemptions
| Exemption | Applies To | Legal Basis |
|---|---|---|
| Legal claims | Erasure, restriction | Art. 17(3)(e) — establishment, exercise, or defense of legal claims |
| Legal obligation | Erasure | Art. 17(3)(b) — compliance with legal obligation requiring processing |
| Public interest | Erasure, objection | Art. 17(3)(d) — public interest in public health; Art. 21(1) balancing |
| Freedom of expression | Erasure | Art. 17(3)(a) — exercising right of freedom of expression and information |
| Archiving/research | Erasure, rectification | Art. 17(3)(d) — archiving in public interest, scientific/historical research, statistics |
| Manifestly unfounded/excessive | All rights | Art. 12(5) — may charge reasonable fee or refuse; must demonstrate manifestly unfounded |
| Third-party rights | Access, portability | Recital 63 — must not adversely affect rights and freedoms of others |
| Trade secrets | Access | Right of access must not adversely affect trade secrets or IP |
CCPA/CPRA Exemptions
| Exemption | Applies To | Section |
|---|---|---|
| Legal compliance | Deletion | §1798.105(d)(8) — legal obligation |
| Security/fraud | Deletion | §1798.105(d)(2) — detect security incidents, protect against fraud |
| Existing transaction | Deletion | §1798.105(d)(1) — complete transaction for which PI collected |
| Internal uses compatible | Deletion | §1798.105(d)(7) — internal uses reasonably aligned with expectations |
| Free speech | Deletion | §1798.105(d)(4) — exercise free speech |
| Public interest research | Deletion | §1798.105(d)(6) — public interest; consumer expectations; de-identified |
| Litigation hold | Deletion | Implied — legal proceedings preservation |
LGPD Exemptions
| Exemption | Applies To | Article |
|---|---|---|
| Legal obligation | Deletion | Art. 16(I) — legal or regulatory compliance |
| Research | Deletion | Art. 16(II) — research bodies; anonymization where possible |
| Transfer to third party | Deletion | Art. 16(III) — if necessary and regulation requirements met |
| Controller's own use | Deletion | Art. 16(IV) — exclusive use; anonymized data |
Cross-Regulation Exemption Matrix
| Exemption Category | GDPR | CCPA | LGPD | POPIA | PIPEDA | PDPA | Privacy Act | PIPL | UK GDPR |
|---|---|---|---|---|---|---|---|---|---|
| Legal compliance | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Legal claims/litigation | Yes | Implied | No | Yes | Yes | No | Yes | Yes | Yes |
| Public interest | Yes | Yes | No | Yes | No | Yes | Yes | Yes | Yes |
| Freedom of expression | Yes | Yes | No | No | No | No | No | No | Yes |
| Third-party rights | Yes | No | No | Yes | Yes | Yes | Yes | No | Yes |
| Regulatory retention | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Research/archiving | Yes | Yes | Yes | No | No | Yes | No | No | Yes |
---
Response Process
6-Step Response Procedure
| Step | Action | Key Considerations |
|---|---|---|
| 1. Gather data | Search all systems where data subject's personal data may reside: production databases, backups, logs, third-party processors, email archives, CRM, HR systems | Create comprehensive data map; do not rely on single source; include data held by processors |
| 2. Apply exemptions | Review applicable exemptions for the specific regulation and request type; document exemption basis | Exemptions must be specific and documented; partial exemptions possible (redact exempt portions, provide rest) |
| 3. Prepare response | Format data per request type: access = copy of data + processing info; portability = structured machine-readable format (JSON/CSV); deletion = confirmation of deletion from all systems | Access response must include: purposes, categories, recipients, retention, rights information, source (Art. 14) |
| 4. Cite legal basis for denials | If denying (full or partial), cite specific legal provision: GDPR article, CCPA section, etc. | Never deny without legal basis citation; explain in plain language |
| 5. Inform of complaint right | Include information about right to lodge complaint with supervisory authority (name, contact details) | GDPR Art. 77; CCPA — right to complain to CPPA/AG; LGPD — right to complain to ANPD |
| 6. Document | Record complete request lifecycle: receipt date, verification, search scope, exemptions applied, response content, delivery method, delivery date | Retain documentation for statute of limitations period (typically 3-6 years); include decision rationale |
Response Format Requirements
| Request Type | GDPR Format | CCPA Format | General Best Practice |
|---|---|---|---|
| Access | Copy of data + Art. 15(1) info; electronic format if electronic request | Specific pieces of PI collected; categories; sources; purposes; third parties | Structured document; table format for data inventory |
| Deletion | Confirmation of deletion; list of systems; notification to recipients | Confirmation of deletion; confirmation that service providers also deleted | Written confirmation with scope of deletion |
| Correction | Confirmation of correction; notification to recipients Art. 19 | Confirmation of correction | Specify what was corrected |
| Portability | Structured, commonly used, machine-readable format (JSON, CSV, XML) | Categories and specific pieces in readily usable format | JSON preferred; include data dictionary |
---
Request Type Details
Access Requests — Required Information in Response
| Category | GDPR Art. 15(1) | Notes |
|---|---|---|
| Confirmation of processing | Yes/no whether data is processed | Even "no data" is a valid response |
| Copy of personal data | Complete copy of all personal data | Include derived/inferred data |
| Purposes of processing | Each purpose for which data is used | Be specific, not generic |
| Categories of data | Types of personal data processed | Use clear categories |
| Recipients | Named recipients or categories | Actual recipients preferred |
| Retention periods | Per category or criteria for determining | Specific periods or criteria |
| Data subject rights | Rectification, erasure, restriction, objection | Standard template clause |
| Right to complain | SA name and contact details | Territory-specific SA |
| Source of data | If not collected from data subject (Art. 14) | Name source if possible |
| Automated decisions | Existence, logic, significance, consequences | Art. 22 — meaningful info about logic |
| International transfers | Safeguards under Art. 46 | SCC/adequacy reference |
Deletion Requests — Scope Requirements
| System | Include in Deletion | Retention Exception |
|---|---|---|
| Production databases | Yes | Legal retention requirements |
| Backup systems | Yes (next rotation cycle acceptable) | May defer to backup rotation schedule |
| Logs and analytics | Yes (pseudonymize or delete) | Security log retention (limited period) |
| Third-party processors | Yes — notify per Art. 17(2) | Processor's own legal obligations |
| Email and communications | Yes | Litigation hold if applicable |
| Paper records | Yes | Archival requirements |
| Publicly available copies | "Reasonable steps" to inform third parties | Art. 17(2) best efforts |
---
Regulatory Monitoring
What to Monitor
| Area | Sources | Frequency |
|---|---|---|
| New legislation | Government gazettes, law firm alerts, IAPP, regulatory websites | Monthly |
| Enforcement actions | SA decision registers, court databases, GDPR Enforcement Tracker | Monthly |
| Regulatory guidance | SA guidelines, opinions, blog posts, consultation papers | Monthly |
| Industry standards | ISO standards updates, CoC developments, certification schemes | Quarterly |
| Transfer mechanism changes | Adequacy decision reviews, SCC updates, BCR developments | Quarterly |
5-Step Monitoring Approach
| Step | Action | Output |
|---|---|---|
| 1 | Subscribe — Set up alerts for all applicable SAs and regulatory bodies | Alert feeds configured |
| 2 | Triage — Weekly review of alerts; categorize by relevance and urgency | Prioritized change list |
| 3 | Assess impact — For relevant changes, assess impact on current practices and documented obligations | Impact assessment document |
| 4 | Plan remediation — If practice changes needed, create action plan with timeline and responsible parties | Remediation plan |
| 5 | Implement and document — Execute changes; update policies, notices, DPAs, training materials; log the change | Updated documentation |
Escalation Criteria
| Trigger | Action | Timeline |
|---|---|---|
| New regulation enacted in jurisdiction where data subjects reside | Full applicability assessment | 30 days from enactment |
| SA issues enforcement action in your sector | Review own practices against findings | 14 days |
| SCC/adequacy decision invalidated or amended | Re-assess all transfers relying on mechanism | Immediately |
| New SA guidance on DSR handling | Review and update DSR procedures | 30 days |
| Regulatory investigation or inquiry received | Engage legal counsel; preserve all records; respond within deadline | Immediately |
| Data breach potentially triggering multi-regulation notification | Assess notification obligations per regulation; notify within shortest applicable deadline | Within 24 hours |
| Significant change to processing activities | Re-run regulation applicability assessment | Before new processing begins |
Global Privacy Regulations Comparison
Comprehensive comparison of 9 major privacy regulations for multi-jurisdictional compliance planning.
---
Table of Contents
- Regulation Overview
- Territorial Scope
- Legal Bases for Processing
- Data Subject Rights Comparison
- Breach Notification Requirements
- Cross-Border Transfer Mechanisms
- DPO Requirements
- Penalty Structures
- Cross-Regulation Comparison Matrix
- Enforcement Trends
---
Regulation Overview
| Regulation | Jurisdiction | Effective Date | Supervising Authority | Key Legislation |
|---|---|---|---|---|
| GDPR | EU/EEA | 25 May 2018 | National DPAs (lead SA mechanism) | Regulation (EU) 2016/679 |
| CCPA/CPRA | California, USA | 1 Jan 2020 / 1 Jan 2023 | CPPA (California Privacy Protection Agency) | Cal. Civ. Code §1798.100-199.100 |
| LGPD | Brazil | 18 Sep 2020 | ANPD (Autoridade Nacional de Proteção de Dados) | Law 13,709/2018 |
| POPIA | South Africa | 1 Jul 2021 | Information Regulator | Act 4 of 2013 |
| PIPEDA | Canada (federal) | 1 Jan 2001 | OPC (Office of the Privacy Commissioner) | S.C. 2000, c. 5 |
| PDPA | Singapore | 2 Jul 2014 | PDPC (Personal Data Protection Commission) | Act 26 of 2012 |
| Privacy Act | Australia | 12 Mar 1988 (amended 2024) | OAIC (Office of the Australian Information Commissioner) | Privacy Act 1988 (Cth) |
| PIPL | China | 1 Nov 2021 | CAC (Cyberspace Administration of China) | Personal Information Protection Law |
| UK GDPR | United Kingdom | 1 Jan 2021 | ICO (Information Commissioner's Office) | UK GDPR + Data Protection Act 2018 |
---
Territorial Scope
| Regulation | Applies To | Extraterritorial Reach | Representative Required |
|---|---|---|---|
| GDPR | Controllers/processors established in EU; or offering goods/services to EU residents; or monitoring EU resident behavior | Yes — applies regardless of establishment location if targeting EU residents | Art. 27 representative if no EU establishment |
| CCPA/CPRA | For-profit businesses meeting thresholds: >$25M revenue, >100K consumers/households, or >50% revenue from selling PI | Yes — any business meeting thresholds with CA consumers | No representative requirement |
| LGPD | Any processing of data collected in Brazil, of individuals in Brazil, or for offering goods/services in Brazil | Yes — broad extraterritorial scope similar to GDPR | Legal representative required if no BR establishment |
| POPIA | Processing of PI of data subjects in South Africa by responsible parties (controllers) | Limited — focuses on processing within SA | Information officer must be registered |
| PIPEDA | Commercial activities in Canada; federal works/undertakings; personal information crossing provincial borders | Limited extraterritorial — primarily territorial | Privacy officer designation required |
| PDPA | Organizations collecting, using, or disclosing personal data in Singapore | Yes — for organizations not in SG if they process SG residents' data | DPO designation required |
| Privacy Act | Organizations with >AUD 3M turnover; health service providers; some government agencies | Yes — for acts/practices with Australian link | No representative requirement |
| PIPL | Processing PI of individuals within China; or processing PI outside China for providing products/services to, or analyzing behavior of, individuals in China | Yes — broad extraterritorial scope | Designated representative or local entity required |
| UK GDPR | Controllers/processors established in UK; or offering goods/services to UK residents; or monitoring UK resident behavior | Yes — mirrors GDPR extraterritorial reach | UK representative required if no UK establishment |
---
Legal Bases for Processing
| Regulation | Consent | Contract | Legal Obligation | Legitimate Interests | Other Bases |
|---|---|---|---|---|---|
| GDPR | Art. 6(1)(a) — freely given, specific, informed, unambiguous | Art. 6(1)(b) — necessary for contract performance | Art. 6(1)(c) — compliance with legal obligation | Art. 6(1)(f) — subject to balancing test | Vital interests Art. 6(1)(d); Public task Art. 6(1)(e) |
| CCPA/CPRA | Not a legal basis model — opt-out regime | N/A | N/A | N/A | Notice at collection; opt-out of sale/sharing |
| LGPD | Art. 7(I) — specific, informed consent | Art. 7(V) — contract execution | Art. 7(II) — legal or regulatory obligation | Art. 7(IX) — legitimate interests with balancing | 10 legal bases total including credit protection, research, health |
| POPIA | §11 — voluntary, specific, informed consent | §11(1)(b) — contractual necessity | §11(1)(c) — legal obligation | §11(1)(f) — legitimate interests | Public law duty §11(1)(d); Vital interests §11(1)(e) |
| PIPEDA | Principle 3 — meaningful consent (express or implied) | Implied consent for reasonable commercial activity | N/A — uses consent framework | Legitimate business interests (limited) | Publicly available information exemption |
| PDPA | §13-17 — consent required unless exception applies | Contractual necessity | Legal obligation exception | §25A — legitimate interests (since 2021 amendment) | Business improvement, research, publicly available |
| Privacy Act | APP 3 — consent for collection of sensitive information | Reasonable expectation in context | Required or authorized by law | N/A — no explicit legitimate interests basis | Direct marketing subject to opt-out (APP 7) |
| PIPL | Art. 13(1) — separate consent for sensitive data and cross-border | Art. 13(2) — contract necessity | Art. 13(3) — legal duties/obligations | N/A — no legitimate interests basis | Statutory duties, public health, public interest, news reporting |
| UK GDPR | Art. 6(1)(a) — same as EU GDPR | Art. 6(1)(b) | Art. 6(1)(c) — UK law | Art. 6(1)(f) — subject to balancing test | Same as EU GDPR |
---
Data Subject Rights Comparison
| Right | GDPR | CCPA/CPRA | LGPD | POPIA | PIPEDA | PDPA | Privacy Act (AU) | PIPL | UK GDPR |
|---|---|---|---|---|---|---|---|---|---|
| Access | Art. 15 | §1798.100 | Art. 18(II) | §23 | Principle 9 | §21 | APP 12 | Art. 44 | Art. 15 |
| Deletion/Erasure | Art. 17 | §1798.105 | Art. 18(VI) | §24 | Limited | §26H | 2024 amendment | Art. 47 | Art. 17 |
| Correction | Art. 16 | §1798.106 | Art. 18(III) | §24 | Principle 9.5 | §22 | APP 13 | Art. 46 | Art. 16 |
| Portability | Art. 20 | §1798.130 | Art. 18(V) | No | No | §26F | No | Art. 45 | Art. 20 |
| Restriction | Art. 18 | No | Art. 18(IV) | No | No | No | No | Art. 44 | Art. 18 |
| Objection | Art. 21 | §1798.120 (opt-out) | Art. 18(IV) | §11(3) | Consent withdrawal | §16 (withdrawal) | No | No | Art. 21 |
| Automated decisions | Art. 22 | §1798.185 | Art. 20 | §71 | Limited | No | No | Art. 24 | Art. 22 |
| Withdraw consent | Art. 7(3) | N/A | Art. 18(IX) | §11(2)(b) | Principle 3 | §16 | N/A | Art. 15 | Art. 7(3) |
| Opt-out of sale | N/A | §1798.120 | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
| Limit sensitive use | N/A | §1798.121 | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
| Non-discrimination | Implicit | §1798.125 | N/A | N/A | N/A | N/A | N/A | N/A | Implicit |
---
Breach Notification Requirements
| Regulation | Notify Authority | Timeline (Authority) | Notify Individuals | Timeline (Individuals) | Content Requirements |
|---|---|---|---|---|---|
| GDPR | Yes — lead supervisory authority | 72 hours | Yes — if high risk to rights | Without undue delay | Nature, DPO contact, consequences, measures |
| CCPA/CPRA | California AG (>500 residents) | Most expedient time possible | Yes | Most expedient time possible | Description, types of PI, remediation steps |
| LGPD | Yes — ANPD | Reasonable timeframe (ANPD guidance says 2 business days) | Yes — if significant risk | Reasonable timeframe | Description, data types, risks, measures, recommendations |
| POPIA | Yes — Information Regulator | As soon as reasonably possible | Yes — if reasonable grounds | As soon as reasonably possible | Description, PI involved, identity of unauthorized person (if known) |
| PIPEDA | Yes — OPC | As soon as feasible | Yes — if real risk of significant harm | As soon as feasible | Description, date, PI involved, measures, complaint contact |
| PDPA | Yes — PDPC | 3 calendar days | Yes — if significant harm likely | As soon as practicable | Facts, PI affected, what organization is doing |
| Privacy Act (AU) | Yes — OAIC | Within 30 days of awareness (eligible breach) | Yes — if eligible data breach | As soon as practicable after assessment | Description, kind of information, recommendations |
| PIPL | Yes — CAC/relevant department | Promptly (no specific hour count) | Yes | Promptly | Causes, PI types, remedial measures, individual mitigation steps |
| UK GDPR | Yes — ICO | 72 hours | Yes — if high risk | Without undue delay | Same as GDPR |
---
Cross-Border Transfer Mechanisms
| Regulation | Adequacy Decisions | Standard Contractual Clauses | Binding Corporate Rules | Other Mechanisms |
|---|---|---|---|---|
| GDPR | EU Commission adequacy (14 countries + US via DPF) | EU SCCs (June 2021) — 4 modules | BCRs approved by lead SA | Derogations Art. 49 (limited), codes of conduct, certification |
| CCPA/CPRA | N/A — no transfer restriction model | Service provider agreements required | N/A | Due diligence on service providers |
| LGPD | ANPD adequacy decisions (limited) | ANPD-approved SCCs | BCRs | Specific consent, international cooperation, ANPD authorization |
| POPIA | Not yet issued | Binding agreements required | BCRs | SA Information Regulator approval, consent |
| PIPEDA | No formal adequacy | Contractual protections with comparable safeguards | N/A | Accountability model — transferor remains responsible |
| PDPA | No formal adequacy | Contractual obligations to equivalent standard | BCRs | Consent, necessity, publicly available |
| Privacy Act (AU) | No formal adequacy | APP 8 — reasonable steps for compliance | N/A | Binding contract, consent, required by law |
| PIPL | CAC security assessment (mandatory for CII and >1M records) | Standard contract filed with CAC | Certification by accredited institution | Security assessment, separate consent |
| UK GDPR | UK adequacy regulations (limited list) | EU SCCs + UK Addendum OR UK IDTA | UK BCRs | Derogations, codes of conduct |
---
DPO Requirements
| Regulation | DPO Required | When Required | Qualifications | Registration |
|---|---|---|---|---|
| GDPR | Yes (Art. 37) | Public authority; core activities require monitoring; large-scale special category processing | Expert knowledge of data protection law and practices | Communicated to supervisory authority |
| CCPA/CPRA | No | N/A | N/A | N/A |
| LGPD | Yes (Art. 41) | All controllers — called "Encarregado" | No formal qualification requirement (ANPD guidance) | Published on website |
| POPIA | Yes | All responsible parties — called "Information Officer" | No formal requirement | Registered with Information Regulator |
| PIPEDA | Yes | All organizations — called "Privacy Officer" | Designated individual | N/A |
| PDPA | Yes | All organizations | No formal requirement | N/A |
| Privacy Act (AU) | No (recommended) | N/A | N/A | N/A |
| PIPL | Yes (Art. 52) | Processing above threshold (>1M individuals) | No formal requirement | Published and filed with CAC |
| UK GDPR | Yes (mirrors GDPR Art. 37) | Same triggers as GDPR | Expert knowledge | Communicated to ICO |
---
Penalty Structures
| Regulation | Maximum Fine | Calculation Method | Notable Fines (2024-2026) |
|---|---|---|---|
| GDPR | EUR 20M or 4% global annual turnover (whichever greater) | Severity, duration, negligence, cooperation, categories of data | Meta EUR 1.2B (2023 transfers); Amazon EUR 746M (targeting); TikTok EUR 345M (children) |
| CCPA/CPRA | $2,500 per unintentional / $7,500 per intentional violation | Per-violation basis; private right of action for breaches ($100-$750 per consumer per incident) | Sephora $1.2M (2022); ongoing enforcement actions |
| LGPD | 2% of revenue in Brazil, max BRL 50M per violation | Severity, good faith, cooperation, economic condition | Active enforcement since 2023 |
| POPIA | ZAR 10M fine or imprisonment up to 10 years | Severity and nature of infringement | Enforcement ramping up since 2022 |
| PIPEDA | CAD 100,000 per violation (PIPEDA); up to CAD 25M under Bill C-27 if enacted | Findings model; penalties under newer amendments | Recommendations model transitioning to penalties |
| PDPA | SGD 1M or 10% annual turnover (whichever greater) — since 2022 amendment | Severity, turnover, cooperation | SingHealth SGD 250,000 (2019); Grab SGD 10,000 (2021) |
| Privacy Act (AU) | AUD 50M, 30% adjusted turnover, or 3x benefit (whichever greatest) — since 2022 amendment | Severity, previous conduct, turnover | Medibank (pending); Optus (pending) |
| PIPL | CNY 50M or 5% annual revenue; personal liability for responsible persons | Severity, duration, illegal gains | Didi Global (2022 — combined cyber/data violation); ride-hailing apps |
| UK GDPR | GBP 17.5M or 4% global annual turnover | Mirrors GDPR methodology | Clearview AI GBP 7.5M (2022); TikTok GBP 12.7M (2023 children) |
---
Cross-Regulation Comparison Matrix
| Dimension | GDPR | CCPA/CPRA | LGPD | POPIA | PIPEDA | PDPA | Privacy Act | PIPL | UK GDPR |
|---|---|---|---|---|---|---|---|---|---|
| Model | Rights-based | Consumer protection | Rights-based | Rights-based | Fair info principles | Consent-based | Principles-based | State control | Rights-based |
| Default consent | Opt-in | Opt-out | Opt-in | Opt-in | Opt-in | Opt-in | Opt-in (sensitive) | Opt-in | Opt-in |
| Sensitive data extra protection | Art. 9 | §1798.121 | Art. 11 | §26-33 | Principle 4.3.4 | Limited | APP 3.3 | Art. 28-32 | Art. 9 |
| Data localization | No (transfer controls) | No | No (transfer controls) | No (transfer controls) | No (accountability) | No | No | Yes (CII) | No (transfer controls) |
| Private right of action | Varies by member state | Yes (data breaches) | Yes (Art. 42) | No | No (complaint to OPC) | No | No | Yes (Art. 69-70) | Yes (limited) |
| Maturity | High | Medium-high | Medium | Medium-low | High | Medium | Medium-high | Medium | High |
---
Enforcement Trends
2024-2026 Key Trends
| Trend | Affected Regulations | Impact |
|---|---|---|
| AI and automated processing scrutiny | GDPR, PIPL, CCPA/CPRA, UK GDPR | Increased enforcement of Art. 22 equivalent; DPIA requirements for AI; transparency obligations |
| Children's data enforcement | GDPR, CCPA/CPRA, UK GDPR, PIPL | Age verification mandates; design codes; higher penalties |
| Cross-border transfer enforcement | GDPR, PIPL, UK GDPR | Post-Schrems II TIA requirements; PIPL security assessments; UK IDTA adoption |
| Cookie and tracking enforcement | GDPR, CCPA/CPRA | Cookie banner enforcement; GPC signal requirements; ePrivacy convergence |
| Employee monitoring | GDPR, LGPD, POPIA | Remote work surveillance limits; proportionality requirements; works council notification |
| Dark patterns crackdown | GDPR, CCPA/CPRA | Deceptive consent interfaces; manipulative design; hidden opt-outs |
| Data broker regulation | CCPA/CPRA, GDPR | Delete Act (CA); registration requirements; enhanced opt-out |
Upcoming Regulatory Changes
| Change | Jurisdiction | Expected Timeline | Impact |
|---|---|---|---|
| ePrivacy Regulation | EU | Ongoing negotiations | Cookie consent harmonization; electronic communications |
| Bill C-27 (CPPA) | Canada | Under consideration | Replaces PIPEDA; higher penalties; new rights |
| Privacy Act reform | Australia | 2025-2026 | Right to erasure; children's code; direct right of action |
| ADPPA (federal privacy) | USA | Uncertain | Would preempt state laws; national baseline |
| UK Data Protection Bill | UK | 2025-2026 | Reforms to UK GDPR; legitimate interests expansion |
---
Practical Compliance Strategy
Unified Program Approach
Build compliance to the strictest standard (typically GDPR) as baseline, then layer jurisdiction-specific requirements:
| Baseline (GDPR) | Layer for CCPA/CPRA | Layer for PIPL | Layer for LGPD |
|---|---|---|---|
| Lawful basis documented | Add "Do Not Sell/Share" link | Add data localization assessment | Appoint Encarregado |
| Privacy notice Art. 13/14 | Add annual metrics disclosure | Add CAC security assessment for cross-border | Add 10 legal bases mapping |
| DSR process (30 days) | Add 10-business-day acknowledgment | Adjust to 15-day timeline | Adjust to 15-day timeline |
| Breach process (72 hours) | Add CA AG notification for >500 | Add CAC notification | Add ANPD 2-business-day notification |
| DPO appointed | N/A (not required) | File with CAC if >1M records | Publish on website |
| DPIA for high risk | Add CPRA risk assessments | Add PI impact assessment (Art. 55) | Add privacy impact assessment (Art. 38) |
| SCCs for transfers | Service provider agreements | CAC security assessment or standard contract | ANPD-approved mechanisms |
#!/usr/bin/env python3
"""
Data Subject Request (DSR) Tracker
Tracks DSR lifecycle across multiple privacy regulations with deadline calculation,
status management, and overdue alerts.
Usage:
python dsr_tracker.py add --type access --regulation gdpr --subject "Jane Smith" --email "jane@example.com"
python dsr_tracker.py list
python dsr_tracker.py list --overdue
python dsr_tracker.py update --id DSR-0001 --status verified
python dsr_tracker.py dashboard
python dsr_tracker.py dashboard --json
"""
import argparse
import json
import os
import sys
from datetime import datetime, timedelta
from pathlib import Path
from typing import Dict, List, Optional
DEFAULT_DATA_FILE = "dsr_requests.json"
REQUEST_TYPES = [
"access", "deletion", "correction", "portability",
"restriction", "objection", "automated_decision", "withdraw_consent",
]
VALID_STATUSES = ["received", "verified", "processing", "completed", "denied", "extended"]
REGULATION_DEADLINES: Dict[str, Dict] = {
"gdpr": {
"name": "GDPR",
"initial_days": 30,
"calendar_type": "calendar",
"extension_days": 60,
"ack_business_days": None,
"max_total_days": 90,
},
"ccpa": {
"name": "CCPA/CPRA",
"initial_days": 45,
"calendar_type": "calendar",
"extension_days": 45,
"ack_business_days": 10,
"max_total_days": 90,
},
"lgpd": {
"name": "LGPD",
"initial_days": 15,
"calendar_type": "calendar",
"extension_days": 0,
"ack_business_days": None,
"max_total_days": 15,
},
"popia": {
"name": "POPIA",
"initial_days": 30,
"calendar_type": "calendar",
"extension_days": 0,
"ack_business_days": None,
"max_total_days": 30,
},
"pipeda": {
"name": "PIPEDA",
"initial_days": 30,
"calendar_type": "calendar",
"extension_days": 30,
"ack_business_days": None,
"max_total_days": 60,
},
"pdpa": {
"name": "PDPA",
"initial_days": 30,
"calendar_type": "calendar",
"extension_days": 0,
"ack_business_days": None,
"max_total_days": 30,
},
"privacy_act_au": {
"name": "Privacy Act (AU)",
"initial_days": 30,
"calendar_type": "calendar",
"extension_days": 30,
"ack_business_days": None,
"max_total_days": 60,
},
"pipl": {
"name": "PIPL",
"initial_days": 15,
"calendar_type": "calendar",
"extension_days": 15,
"ack_business_days": None,
"max_total_days": 30,
},
"uk_gdpr": {
"name": "UK GDPR",
"initial_days": 30,
"calendar_type": "calendar",
"extension_days": 60,
"ack_business_days": None,
"max_total_days": 90,
},
}
def load_data(data_file: str) -> Dict:
"""Load DSR data from JSON file."""
path = Path(data_file)
if path.exists():
with open(path, "r") as f:
return json.load(f)
return {"requests": [], "next_id": 1}
def save_data(data: Dict, data_file: str) -> None:
"""Save DSR data to JSON file."""
with open(data_file, "w") as f:
json.dump(data, f, indent=2, default=str)
def calculate_deadline(received_date: str, regulation: str, is_extended: bool = False) -> Dict:
"""Calculate deadline based on regulation and extension status."""
reg = REGULATION_DEADLINES.get(regulation)
if not reg:
return {"error": f"Unknown regulation: {regulation}"}
received = datetime.fromisoformat(received_date)
initial_deadline = received + timedelta(days=reg["initial_days"])
if is_extended and reg["extension_days"] > 0:
final_deadline = received + timedelta(days=reg["max_total_days"])
else:
final_deadline = initial_deadline
now = datetime.now()
remaining = (final_deadline - now).days
ack_deadline = None
ack_remaining = None
if reg["ack_business_days"]:
# Approximate business days (skip weekends)
bd = reg["ack_business_days"]
ack_date = received
added = 0
while added < bd:
ack_date += timedelta(days=1)
if ack_date.weekday() < 5:
added += 1
ack_deadline = ack_date.isoformat()
ack_remaining = (ack_date - now).days
return {
"initial_deadline": initial_deadline.isoformat(),
"final_deadline": final_deadline.isoformat(),
"days_remaining": remaining,
"is_overdue": remaining < 0,
"ack_deadline": ack_deadline,
"ack_days_remaining": ack_remaining,
"extension_available": not is_extended and reg["extension_days"] > 0,
"extension_days": reg["extension_days"],
}
def add_request(data: Dict, request_type: str, regulation: str,
subject: str, email: str) -> Dict:
"""Add a new DSR to the tracker."""
req_id = f"DSR-{data['next_id']:04d}"
now = datetime.now().isoformat()
deadline_info = calculate_deadline(now, regulation)
request = {
"id": req_id,
"type": request_type,
"regulation": regulation,
"regulation_name": REGULATION_DEADLINES[regulation]["name"],
"subject": subject,
"email": email,
"status": "received",
"received_date": now,
"initial_deadline": deadline_info["initial_deadline"],
"final_deadline": deadline_info["final_deadline"],
"ack_deadline": deadline_info.get("ack_deadline"),
"is_extended": False,
"status_history": [
{"status": "received", "date": now, "note": "Request logged"}
],
}
data["requests"].append(request)
data["next_id"] += 1
return request
def update_status(data: Dict, req_id: str, new_status: str, note: str = "") -> Optional[Dict]:
"""Update the status of a DSR."""
for req in data["requests"]:
if req["id"] == req_id:
old_status = req["status"]
req["status"] = new_status
now = datetime.now().isoformat()
if new_status == "extended":
req["is_extended"] = True
deadline_info = calculate_deadline(req["received_date"], req["regulation"], True)
req["final_deadline"] = deadline_info["final_deadline"]
entry = {"status": new_status, "date": now, "note": note or f"Status changed from {old_status}"}
req["status_history"].append(entry)
return req
return None
def list_requests(data: Dict, overdue_only: bool = False) -> List[Dict]:
"""List requests with current deadline status."""
results = []
for req in data["requests"]:
if req["status"] in ("completed", "denied"):
if overdue_only:
continue
results.append({**req, "days_remaining": None, "is_overdue": False})
continue
deadline_info = calculate_deadline(
req["received_date"], req["regulation"], req.get("is_extended", False)
)
enriched = {
**req,
"days_remaining": deadline_info["days_remaining"],
"is_overdue": deadline_info["is_overdue"],
"ack_days_remaining": deadline_info.get("ack_days_remaining"),
"extension_available": deadline_info.get("extension_available", False),
}
if overdue_only and not deadline_info["is_overdue"]:
continue
results.append(enriched)
return results
def generate_dashboard(data: Dict) -> Dict:
"""Generate dashboard summary with alerts."""
all_requests = list_requests(data)
open_requests = [r for r in all_requests if r["status"] not in ("completed", "denied")]
overdue = [r for r in open_requests if r.get("is_overdue")]
urgent = [r for r in open_requests if not r.get("is_overdue") and r.get("days_remaining") is not None and r["days_remaining"] <= 7]
completed = [r for r in all_requests if r["status"] == "completed"]
denied = [r for r in all_requests if r["status"] == "denied"]
by_regulation = {}
for r in open_requests:
reg = r.get("regulation_name", r.get("regulation", "unknown"))
by_regulation.setdefault(reg, 0)
by_regulation[reg] += 1
by_type = {}
for r in open_requests:
by_type.setdefault(r["type"], 0)
by_type[r["type"]] += 1
return {
"generated": datetime.now().isoformat(),
"summary": {
"total_requests": len(all_requests),
"open": len(open_requests),
"overdue": len(overdue),
"urgent_within_7_days": len(urgent),
"completed": len(completed),
"denied": len(denied),
},
"by_regulation": by_regulation,
"by_type": by_type,
"overdue_requests": [
{"id": r["id"], "type": r["type"], "regulation": r.get("regulation_name", ""),
"subject": r["subject"], "days_overdue": abs(r["days_remaining"]),
"status": r["status"]}
for r in overdue
],
"urgent_requests": [
{"id": r["id"], "type": r["type"], "regulation": r.get("regulation_name", ""),
"subject": r["subject"], "days_remaining": r["days_remaining"],
"status": r["status"]}
for r in urgent
],
}
def format_dashboard_text(dashboard: Dict) -> str:
"""Format dashboard as human-readable text."""
lines = []
s = dashboard["summary"]
lines.append("=" * 60)
lines.append("DSR TRACKER DASHBOARD")
lines.append(f"Generated: {dashboard['generated'][:16]}")
lines.append("=" * 60)
lines.append(f"\n Total Requests: {s['total_requests']}")
lines.append(f" Open: {s['open']}")
lines.append(f" Overdue: {s['overdue']}")
lines.append(f" Urgent (<=7 days): {s['urgent_within_7_days']}")
lines.append(f" Completed: {s['completed']}")
lines.append(f" Denied: {s['denied']}")
if dashboard["by_regulation"]:
lines.append("\n Open by Regulation:")
for reg, count in dashboard["by_regulation"].items():
lines.append(f" {reg}: {count}")
if dashboard["overdue_requests"]:
lines.append(f"\n{'!' * 60}")
lines.append(" OVERDUE REQUESTS")
lines.append(f"{'!' * 60}")
for r in dashboard["overdue_requests"]:
lines.append(f" [{r['id']}] {r['type']} ({r['regulation']}) — {r['subject']}")
lines.append(f" {r['days_overdue']} days overdue | Status: {r['status']}")
if dashboard["urgent_requests"]:
lines.append(f"\n{'-' * 60}")
lines.append(" URGENT REQUESTS (due within 7 days)")
lines.append(f"{'-' * 60}")
for r in dashboard["urgent_requests"]:
lines.append(f" [{r['id']}] {r['type']} ({r['regulation']}) — {r['subject']}")
lines.append(f" {r['days_remaining']} days remaining | Status: {r['status']}")
if not dashboard["overdue_requests"] and not dashboard["urgent_requests"]:
lines.append("\n No overdue or urgent requests.")
return "\n".join(lines)
def format_list_text(requests: List[Dict]) -> str:
"""Format request list as human-readable text."""
if not requests:
return "No requests found."
lines = []
lines.append(f"{'ID':<12} {'Type':<20} {'Regulation':<15} {'Subject':<20} {'Status':<12} {'Days Left':<10}")
lines.append("-" * 89)
for r in requests:
days = r.get("days_remaining")
days_str = str(days) if days is not None else "—"
if r.get("is_overdue"):
days_str = f"OVERDUE ({abs(days)}d)"
reg_name = r.get("regulation_name", r.get("regulation", ""))
lines.append(f"{r['id']:<12} {r['type']:<20} {reg_name:<15} {r['subject']:<20} {r['status']:<12} {days_str:<10}")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="Data Subject Request Lifecycle Tracker")
subparsers = parser.add_subparsers(dest="command", help="Command to execute")
# Shared arguments for all subcommands
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument("--json", action="store_true", help="Output in JSON format")
parent_parser.add_argument("--data-file", default=DEFAULT_DATA_FILE, help="Path to data file")
# Add command
add_parser = subparsers.add_parser("add", help="Add a new DSR", parents=[parent_parser])
add_parser.add_argument("--type", required=True, choices=REQUEST_TYPES, help="Request type")
add_parser.add_argument("--regulation", required=True, choices=list(REGULATION_DEADLINES.keys()), help="Applicable regulation")
add_parser.add_argument("--subject", required=True, help="Data subject name")
add_parser.add_argument("--email", required=True, help="Data subject email")
# List command
list_parser = subparsers.add_parser("list", help="List DSRs", parents=[parent_parser])
list_parser.add_argument("--overdue", action="store_true", help="Show overdue only")
# Update command
update_parser = subparsers.add_parser("update", help="Update DSR status", parents=[parent_parser])
update_parser.add_argument("--id", required=True, help="Request ID (e.g., DSR-0001)")
update_parser.add_argument("--status", required=True, choices=VALID_STATUSES, help="New status")
update_parser.add_argument("--note", default="", help="Optional note")
# Dashboard command
subparsers.add_parser("dashboard", help="Show dashboard summary", parents=[parent_parser])
args = parser.parse_args()
if not args.command:
parser.print_help()
sys.exit(1)
try:
data = load_data(args.data_file)
if args.command == "add":
request = add_request(data, args.type, args.regulation, args.subject, args.email)
save_data(data, args.data_file)
if args.json:
print(json.dumps(request, indent=2, default=str))
else:
dl = request["initial_deadline"][:10]
print(f"Created {request['id']}: {request['type']} ({request['regulation_name']})")
print(f" Subject: {request['subject']} <{request['email']}>")
print(f" Deadline: {dl}")
if request.get("ack_deadline"):
print(f" Acknowledgment deadline: {request['ack_deadline'][:10]}")
elif args.command == "list":
requests = list_requests(data, overdue_only=args.overdue)
if args.json:
print(json.dumps(requests, indent=2, default=str))
else:
print(format_list_text(requests))
elif args.command == "update":
result = update_status(data, args.id, args.status, args.note)
if result is None:
print(f"Error: Request {args.id} not found.", file=sys.stderr)
sys.exit(1)
save_data(data, args.data_file)
if args.json:
print(json.dumps(result, indent=2, default=str))
else:
print(f"Updated {result['id']}: status -> {result['status']}")
if args.status == "extended":
print(f" Extended deadline: {result['final_deadline'][:10]}")
elif args.command == "dashboard":
dashboard = generate_dashboard(data)
if args.json:
print(json.dumps(dashboard, indent=2, default=str))
else:
print(format_dashboard_text(dashboard))
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Privacy Regulation Checker
Determines which privacy regulations apply to an organization based on location,
data subjects, data types, and processing activities. Maps obligations per regulation
and flags gaps where current practices may not meet requirements.
Usage:
python privacy_regulation_checker.py --org-location DE --data-subjects EU,US --data-types personal,sensitive --processing-activities marketing,analytics
python privacy_regulation_checker.py --org-location US-CA --data-subjects EU,BR --data-types personal --processing-activities ecommerce --json
python privacy_regulation_checker.py --org-location SG --data-subjects SG,AU --data-types health --processing-activities healthcare --current-practices consent_mechanism,breach_process
"""
import argparse
import json
import sys
from datetime import datetime
from typing import Dict, List, Optional, Set, Tuple
REGULATIONS: Dict[str, Dict] = {
"gdpr": {
"name": "GDPR (EU)",
"full_name": "General Data Protection Regulation (EU) 2016/679",
"territorial_scope": ["EU"],
"applies_when": "Processing personal data of EU/EEA residents, or organization established in EU",
"dpo_required": True,
"breach_notification_hours": 72,
"max_penalty_pct": 4.0,
"max_penalty_amount": "EUR 20M",
"dsr_deadline_days": 30,
"dsr_extension_days": 60,
"legal_bases": ["consent", "contract", "legal_obligation", "vital_interests", "public_task", "legitimate_interests"],
"key_obligations": [
"Lawful basis for processing (Art. 6)",
"Data subject rights (Art. 15-22)",
"Records of processing activities (Art. 30)",
"Data Protection Impact Assessment (Art. 35)",
"Data Protection Officer appointment (Art. 37)",
"Breach notification within 72 hours (Art. 33)",
"International transfer safeguards (Chapter V)",
"Privacy by design and default (Art. 25)",
],
"data_subject_rights": ["access", "rectification", "erasure", "restriction", "portability", "objection", "automated_decision"],
},
"ccpa": {
"name": "CCPA/CPRA (California)",
"full_name": "California Consumer Privacy Act / California Privacy Rights Act",
"territorial_scope": ["US"],
"applies_when": "For-profit business meeting revenue/data thresholds processing CA residents' data",
"dpo_required": False,
"breach_notification_hours": None,
"max_penalty_pct": None,
"max_penalty_amount": "USD 7,500 per violation",
"dsr_deadline_days": 45,
"dsr_extension_days": 45,
"dsr_ack_business_days": 10,
"legal_bases": ["notice_and_opt_out"],
"key_obligations": [
"Privacy notice at collection (§1798.100)",
"Right to opt-out of sale/sharing (§1798.120)",
"Do Not Sell or Share link (§1798.135)",
"Honor Global Privacy Control signal",
"Annual metrics disclosure",
"Service provider contract requirements",
"Risk assessments for high-risk processing (CPRA)",
"Limit use of sensitive personal information",
],
"data_subject_rights": ["access", "deletion", "correction", "opt_out_sale", "limit_sensitive", "portability"],
},
"lgpd": {
"name": "LGPD (Brazil)",
"full_name": "Lei Geral de Proteção de Dados (Law 13,709/2018)",
"territorial_scope": ["BR"],
"applies_when": "Processing personal data collected in Brazil or of individuals in Brazil",
"dpo_required": True,
"breach_notification_hours": None,
"max_penalty_pct": 2.0,
"max_penalty_amount": "BRL 50M per violation",
"dsr_deadline_days": 15,
"dsr_extension_days": 0,
"legal_bases": ["consent", "legal_obligation", "public_policy", "research", "contract", "legitimate_interests",
"health_protection", "credit_protection", "life_protection", "regulatory_exercise"],
"key_obligations": [
"Lawful basis for processing (Art. 7)",
"Data subject rights (Art. 18)",
"DPO appointment (Art. 41) — called Encarregado",
"International transfer restrictions (Art. 33)",
"Breach notification to ANPD (Art. 48)",
"Privacy Impact Assessment (Art. 38)",
"Records of processing activities (Art. 37)",
],
"data_subject_rights": ["access", "correction", "anonymization", "portability", "deletion", "information_sharing",
"consent_info", "objection", "review_automated"],
},
"popia": {
"name": "POPIA (South Africa)",
"full_name": "Protection of Personal Information Act 4 of 2013",
"territorial_scope": ["ZA"],
"applies_when": "Processing personal information of South African data subjects",
"dpo_required": True,
"breach_notification_hours": None,
"max_penalty_pct": None,
"max_penalty_amount": "ZAR 10M or imprisonment",
"dsr_deadline_days": 30,
"dsr_extension_days": 0,
"legal_bases": ["consent", "contract", "legal_obligation", "legitimate_interests", "public_law", "public_interest"],
"key_obligations": [
"Lawful processing conditions (Section 9-12)",
"Information Officer registration (Section 55)",
"Security safeguards (Section 19)",
"Breach notification to Information Regulator (Section 22)",
"Cross-border transfer restrictions (Section 72)",
"Data subject rights (Section 23-25)",
],
"data_subject_rights": ["access", "correction", "deletion", "objection"],
},
"pipeda": {
"name": "PIPEDA (Canada)",
"full_name": "Personal Information Protection and Electronic Documents Act",
"territorial_scope": ["CA"],
"applies_when": "Commercial activity involving personal information in Canada",
"dpo_required": True,
"breach_notification_hours": None,
"max_penalty_pct": None,
"max_penalty_amount": "CAD 100,000 per violation",
"dsr_deadline_days": 30,
"dsr_extension_days": 30,
"legal_bases": ["consent", "legitimate_purpose"],
"key_obligations": [
"10 fair information principles (Schedule 1)",
"Meaningful consent requirements",
"Breach notification to OPC and individuals",
"Privacy Officer designation (Principle 1)",
"Breach record-keeping",
"Cross-border transfer accountability",
],
"data_subject_rights": ["access", "correction", "withdrawal_consent", "complaint"],
},
"pdpa": {
"name": "PDPA (Singapore)",
"full_name": "Personal Data Protection Act 2012",
"territorial_scope": ["SG"],
"applies_when": "Organization collecting, using, or disclosing personal data in Singapore",
"dpo_required": True,
"breach_notification_hours": 72,
"max_penalty_pct": None,
"max_penalty_amount": "SGD 1M or 10% annual turnover",
"dsr_deadline_days": 30,
"dsr_extension_days": 0,
"legal_bases": ["consent", "legitimate_interests", "business_improvement", "contractual_necessity"],
"key_obligations": [
"Consent obligation",
"Purpose limitation obligation",
"Data Protection Officer appointment",
"Notification obligation (data breaches)",
"Transfer limitation obligation",
"Data portability obligation",
"Do Not Call Registry compliance",
],
"data_subject_rights": ["access", "correction", "portability"],
},
"privacy_act_au": {
"name": "Privacy Act (Australia)",
"full_name": "Privacy Act 1988 (Cth) with 2024 amendments",
"territorial_scope": ["AU"],
"applies_when": "Organization with AUD 3M+ annual turnover handling personal information in Australia",
"dpo_required": False,
"breach_notification_hours": None,
"max_penalty_pct": None,
"max_penalty_amount": "AUD 50M or 30% turnover or 3x benefit",
"dsr_deadline_days": 30,
"dsr_extension_days": 30,
"legal_bases": ["consent", "reasonable_expectation"],
"key_obligations": [
"13 Australian Privacy Principles (APPs)",
"Notifiable Data Breaches scheme (Part IIIC)",
"Cross-border disclosure restrictions (APP 8)",
"Privacy Impact Assessment (for high-risk activities)",
"Direct marketing opt-out (APP 7)",
],
"data_subject_rights": ["access", "correction", "complaint", "erasure"],
},
"pipl": {
"name": "PIPL (China)",
"full_name": "Personal Information Protection Law of the PRC",
"territorial_scope": ["CN"],
"applies_when": "Processing personal information of individuals in China",
"dpo_required": True,
"breach_notification_hours": None,
"max_penalty_pct": 5.0,
"max_penalty_amount": "CNY 50M or 5% annual revenue",
"dsr_deadline_days": 15,
"dsr_extension_days": 15,
"legal_bases": ["consent", "contract", "legal_obligation", "public_health", "public_interest", "legitimate_interests"],
"key_obligations": [
"Separate consent for sensitive data and cross-border transfers",
"Data localization (critical information infrastructure)",
"Security assessment for cross-border transfers",
"Personal Information Impact Assessment (Art. 55)",
"DPO appointment for threshold processing",
"Government access and cooperation requirements",
],
"data_subject_rights": ["access", "correction", "deletion", "portability", "restriction", "automated_decision_explanation"],
},
"uk_gdpr": {
"name": "UK GDPR",
"full_name": "UK General Data Protection Regulation (retained EU law)",
"territorial_scope": ["UK"],
"applies_when": "Processing personal data of UK residents or organization established in UK",
"dpo_required": True,
"breach_notification_hours": 72,
"max_penalty_pct": 4.0,
"max_penalty_amount": "GBP 17.5M",
"dsr_deadline_days": 30,
"dsr_extension_days": 60,
"legal_bases": ["consent", "contract", "legal_obligation", "vital_interests", "public_task", "legitimate_interests"],
"key_obligations": [
"Substantially mirrors GDPR obligations",
"UK International Data Transfer Agreement (IDTA)",
"UK Addendum to EU SCCs",
"ICO registration and fee payment",
"Breach notification to ICO within 72 hours",
"UK-specific adequacy decisions for transfers",
],
"data_subject_rights": ["access", "rectification", "erasure", "restriction", "portability", "objection", "automated_decision"],
},
}
REGION_MAPPING = {
"EU": ["gdpr"],
"US": ["ccpa"],
"US-CA": ["ccpa"],
"BR": ["lgpd"],
"ZA": ["popia"],
"CA": ["pipeda"],
"SG": ["pdpa"],
"AU": ["privacy_act_au"],
"CN": ["pipl"],
"UK": ["uk_gdpr"],
}
EU_COUNTRIES = {"AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "DE", "GR",
"HU", "IE", "IT", "LV", "LT", "LU", "MT", "NL", "PL", "PT", "RO", "SK",
"SI", "ES", "SE", "IS", "LI", "NO"}
CURRENT_PRACTICES_EXPECTED = {
"consent_mechanism": "Consent collection and management",
"breach_process": "Breach notification process",
"retention_policy": "Data retention policy",
"dpo_appointed": "Data Protection Officer appointed",
"dsr_process": "Data subject request handling process",
"privacy_notice": "Privacy notice published",
"ropa": "Records of processing activities",
"dpia_process": "Data protection impact assessment process",
"transfer_mechanism": "International transfer safeguards",
"vendor_management": "Processor/vendor DPA management",
}
def resolve_regions(locations: List[str]) -> Set[str]:
"""Resolve location codes to applicable regulation keys."""
regs: Set[str] = set()
for loc in locations:
loc_upper = loc.upper().strip()
if loc_upper in EU_COUNTRIES:
regs.update(REGION_MAPPING.get("EU", []))
elif loc_upper in REGION_MAPPING:
regs.update(REGION_MAPPING[loc_upper])
elif loc_upper == "EU":
regs.update(REGION_MAPPING["EU"])
return regs
def determine_applicable(org_location: str, data_subjects: List[str],
data_types: List[str], processing_activities: List[str]) -> List[Dict]:
"""Determine which regulations apply and why."""
applicable = []
from_org = resolve_regions([org_location])
from_subjects = resolve_regions(data_subjects)
all_regs = from_org | from_subjects
for reg_key in sorted(all_regs):
reg = REGULATIONS[reg_key]
reasons = []
if reg_key in from_org:
reasons.append(f"Organization established in scope territory ({org_location})")
if reg_key in from_subjects:
matching = [s for s in data_subjects if reg_key in resolve_regions([s])]
reasons.append(f"Data subjects located in: {', '.join(matching)}")
risk_factors = []
if "sensitive" in data_types or "health" in data_types or "biometric" in data_types:
risk_factors.append("Processes sensitive/special category data — heightened obligations")
if "children" in data_types:
risk_factors.append("Processes children's data — additional consent requirements")
if "profiling" in processing_activities:
risk_factors.append("Profiling activity — may trigger DPIA and Art. 22 obligations")
applicable.append({
"regulation": reg_key,
"name": reg["name"],
"full_name": reg["full_name"],
"reasons": reasons,
"risk_factors": risk_factors,
"obligations": reg["key_obligations"],
"data_subject_rights": reg["data_subject_rights"],
"dsr_deadline_days": reg["dsr_deadline_days"],
"dsr_extension_days": reg.get("dsr_extension_days", 0),
"breach_notification_hours": reg.get("breach_notification_hours"),
"dpo_required": reg["dpo_required"],
"max_penalty": reg.get("max_penalty_amount", "N/A"),
})
return applicable
def gap_analysis(applicable: List[Dict], current_practices: List[str]) -> List[Dict]:
"""Analyze gaps between current practices and regulatory requirements."""
gaps = []
practice_set = set(p.strip().lower() for p in current_practices)
required_map = {
"consent_mechanism": ["gdpr", "lgpd", "popia", "pipeda", "pdpa", "pipl", "uk_gdpr"],
"breach_process": ["gdpr", "ccpa", "lgpd", "popia", "pipeda", "pdpa", "privacy_act_au", "pipl", "uk_gdpr"],
"retention_policy": ["gdpr", "ccpa", "lgpd", "popia", "pipeda", "pdpa", "privacy_act_au", "pipl", "uk_gdpr"],
"dpo_appointed": ["gdpr", "lgpd", "popia", "pipeda", "pdpa", "pipl", "uk_gdpr"],
"dsr_process": ["gdpr", "ccpa", "lgpd", "popia", "pipeda", "pdpa", "privacy_act_au", "pipl", "uk_gdpr"],
"privacy_notice": ["gdpr", "ccpa", "lgpd", "popia", "pipeda", "pdpa", "privacy_act_au", "pipl", "uk_gdpr"],
"ropa": ["gdpr", "lgpd", "uk_gdpr"],
"dpia_process": ["gdpr", "lgpd", "pipl", "uk_gdpr"],
"transfer_mechanism": ["gdpr", "lgpd", "popia", "pipl", "uk_gdpr"],
"vendor_management": ["gdpr", "ccpa", "lgpd", "uk_gdpr"],
}
applicable_keys = {a["regulation"] for a in applicable}
for practice_key, required_by in required_map.items():
affected_regs = [r for r in required_by if r in applicable_keys]
if not affected_regs:
continue
if practice_key not in practice_set:
risk = "critical" if len(affected_regs) >= 3 else ("high" if len(affected_regs) >= 2 else "medium")
gaps.append({
"practice": practice_key,
"description": CURRENT_PRACTICES_EXPECTED.get(practice_key, practice_key),
"missing": True,
"required_by": [REGULATIONS[r]["name"] for r in affected_regs],
"risk": risk,
})
return sorted(gaps, key=lambda g: {"critical": 0, "high": 1, "medium": 2}.get(g["risk"], 3))
def format_text(applicable: List[Dict], gaps: Optional[List[Dict]] = None) -> str:
"""Format results as human-readable text."""
lines = []
lines.append("=" * 70)
lines.append("PRIVACY REGULATION APPLICABILITY REPORT")
lines.append(f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
lines.append("=" * 70)
if not applicable:
lines.append("\nNo applicable regulations identified for the given parameters.")
return "\n".join(lines)
lines.append(f"\nApplicable Regulations: {len(applicable)}\n")
for reg in applicable:
lines.append("-" * 50)
lines.append(f" {reg['name']}")
lines.append(f" {reg['full_name']}")
lines.append(f" Reasons:")
for r in reg["reasons"]:
lines.append(f" - {r}")
if reg["risk_factors"]:
lines.append(f" Risk Factors:")
for rf in reg["risk_factors"]:
lines.append(f" ! {rf}")
lines.append(f" DPO Required: {'Yes' if reg['dpo_required'] else 'No'}")
lines.append(f" DSR Deadline: {reg['dsr_deadline_days']} days (ext. +{reg['dsr_extension_days']}d)")
breach = reg.get("breach_notification_hours")
lines.append(f" Breach Notification: {f'{breach} hours' if breach else 'As soon as reasonably possible'}")
lines.append(f" Max Penalty: {reg['max_penalty']}")
lines.append(f" Key Obligations:")
for ob in reg["obligations"]:
lines.append(f" - {ob}")
lines.append(f" Data Subject Rights: {', '.join(reg['data_subject_rights'])}")
lines.append("")
if gaps is not None:
lines.append("=" * 70)
lines.append("GAP ANALYSIS")
lines.append("=" * 70)
if not gaps:
lines.append("\nNo gaps identified — all expected practices in place.")
else:
for g in gaps:
risk_icon = {"critical": "[!!!]", "high": "[!!]", "medium": "[!]"}.get(g["risk"], "[?]")
lines.append(f"\n{risk_icon} {g['risk'].upper()}: {g['description']}")
lines.append(f" Status: MISSING")
lines.append(f" Required by: {', '.join(g['required_by'])}")
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(
description="Determine applicable privacy regulations for an organization"
)
parser.add_argument("--org-location", required=True, help="Organization HQ (ISO code: DE, US-CA, SG, etc.)")
parser.add_argument("--data-subjects", required=True, help="Data subject locations (comma-separated: EU,US,BR)")
parser.add_argument("--data-types", required=True, help="Data types (comma-separated: personal,sensitive,financial,health,biometric,children)")
parser.add_argument("--processing-activities", required=True, help="Activities (comma-separated: marketing,analytics,hr,ecommerce,profiling,healthcare,research)")
parser.add_argument("--current-practices", default=None, help="Current practices for gap analysis (comma-separated)")
parser.add_argument("--json", action="store_true", help="Output in JSON format")
args = parser.parse_args()
try:
subjects = [s.strip() for s in args.data_subjects.split(",")]
data_types = [d.strip() for d in args.data_types.split(",")]
activities = [a.strip() for a in args.processing_activities.split(",")]
applicable = determine_applicable(args.org_location, subjects, data_types, activities)
gaps = None
if args.current_practices:
practices = [p.strip() for p in args.current_practices.split(",")]
gaps = gap_analysis(applicable, practices)
if args.json:
output = {
"report_date": datetime.now().isoformat(),
"parameters": {
"org_location": args.org_location,
"data_subjects": subjects,
"data_types": data_types,
"processing_activities": activities,
},
"applicable_regulations": applicable,
"total_applicable": len(applicable),
}
if gaps is not None:
output["gap_analysis"] = gaps
output["total_gaps"] = len(gaps)
print(json.dumps(output, indent=2))
else:
print(format_text(applicable, gaps))
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
Related skills
FAQ
How many privacy regulations does it cover?
Nine: GDPR, CCPA, LGPD, POPIA, PIPEDA, PDPA (SG), Privacy Act (AU), PIPL and UK GDPR.
Does it give legal advice?
No. It is marked experimental, is for educational purposes only, and says to consult qualified legal professionals.