
Ccpa Cpra Privacy Expert
- 80 installs
- 451 repo stars
- Updated July 21, 2026
- borghei/claude-skills
ccpa-cpra-privacy-expert is a skill that audits organizations for CCPA/CPRA compliance and maps personal-information flows.
About
This skill audits organizations for CCPA and CPRA compliance and maps their personal-information flows. Its compliance checker scores readiness across categories like privacy policy, consumer rights, and opt-out mechanisms, and its data mapper tracks the 11 CCPA PI categories and sensitive PI. Teams use it for California privacy assessments, data mapping, and privacy policy review.
- Audits organizations against CCPA/CPRA requirements with a 0-100 compliance score
- Maps all 11 CCPA personal information categories and flags sensitive PI
- Ships a compliance checker and a data mapper with a 6-month implementation roadmap
Ccpa Cpra Privacy Expert by the numbers
- 80 all-time installs (skills.sh)
- Ranked #1,098 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
ccpa-cpra-privacy-expert capabilities & compatibility
- Capabilities
- compliance audit · data mapping · privacy policy review
- Use cases
- security audit · research
- Pricing
- Free
What ccpa-cpra-privacy-expert says it does
Audits organizations for California privacy law compliance, maps personal information flows, validates consumer rights readiness, and checks technical safeguards.
Maps all 11 CCPA personal information categories
Overall compliance score (0-100)
npx skills add https://github.com/borghei/claude-skills --skill ccpa-cpra-privacy-expertAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 80 |
|---|---|
| repo stars | ★ 451 |
| Last updated | July 21, 2026 |
| Repository | borghei/claude-skills ↗ |
What it does
Audit and document CCPA/CPRA privacy compliance and map personal-information flows for a California-facing product.
Who is it for?
Teams doing California privacy assessments, CPRA readiness checks, data mapping, or privacy policy review.
Skip if: GDPR-only or non-California privacy programs as the primary framework.
When should I use this skill?
You need a CCPA/CPRA compliance assessment, data map, or consumer-rights readiness check.
What you get
A scored compliance report with prioritized findings and a data inventory covering all CCPA PI categories.
- compliance score report
- data inventory
- data flow diagram
By the numbers
- compliance score 0-100
- maps all 11 CCPA personal information categories
- 6-month implementation roadmap
Files
CCPA/CPRA Privacy Expert
Tools and guidance for California Consumer Privacy Act (CCPA) and California Privacy Rights Act (CPRA) compliance.
---
Table of Contents
---
Tools
CCPA Compliance Checker
Evaluates organizational readiness against all CCPA/CPRA requirements. Validates privacy policies, consumer rights handling, technical safeguards, and opt-out mechanisms.
# Check compliance from a JSON profile
python scripts/ccpa_compliance_checker.py --input company_profile.json
# Generate a blank input template
python scripts/ccpa_compliance_checker.py --template > company_profile.json
# JSON output for automation
python scripts/ccpa_compliance_checker.py --input company_profile.json --json
# Export report to file
python scripts/ccpa_compliance_checker.py --input company_profile.json --output report.jsonAssessment Categories:
| Category | Key Checks |
|---|---|
| Applicability | Revenue threshold, consumer count, data selling revenue |
| Privacy Policy | Required disclosures, update cadence, accessibility |
| Consumer Rights | Request handling, verification, timelines |
| Opt-Out Mechanisms | "Do Not Sell" link, GPC signal, cookie consent |
| Sensitive PI | SPI categories, use limitation link, handling controls |
| Technical Safeguards | Encryption, access controls, security measures |
| Service Providers | Agreement requirements, data processing terms |
| Risk Assessments | Annual audits, processing risk evaluations |
Output:
- Overall compliance score (0-100)
- Per-category scores with pass/fail/partial status
- Prioritized findings with regulatory references
- Remediation recommendations
---
CCPA Data Mapper
Maps personal information categories, identifies sensitive personal information, tracks data flows across collection, use, sharing, and selling. Generates data inventory reports.
# Map data from a JSON data inventory
python scripts/ccpa_data_mapper.py --input data_inventory.json
# Generate a blank inventory template
python scripts/ccpa_data_mapper.py --template > data_inventory.json
# Export mapping report
python scripts/ccpa_data_mapper.py --input data_inventory.json --output mapping_report.json
# Generate data flow diagram (text-based)
python scripts/ccpa_data_mapper.py --input data_inventory.json --flow-diagramFeatures:
- Maps all 11 CCPA personal information categories
- Identifies sensitive personal information (SPI) per CPRA definitions
- Tracks data flows: collection sources, business purposes, sharing/selling recipients
- Maps data to service providers, contractors, and third parties
- Generates CCPA-compliant data inventory for privacy policy disclosures
- Flags cross-border data transfers
- Detects data retention gaps
Personal Information Categories Tracked:
| Category | CCPA Section | Examples |
|---|---|---|
| Identifiers | 1798.140(v)(1)(A) | Name, SSN, IP address, email |
| Customer Records | 1798.140(v)(1)(B) | Financial info, medical info |
| Protected Classifications | 1798.140(v)(1)(C) | Race, sex, age, disability |
| Commercial Information | 1798.140(v)(1)(D) | Purchase history, tendencies |
| Biometric Information | 1798.140(v)(1)(E) | Fingerprints, face geometry |
| Internet Activity | 1798.140(v)(1)(F) | Browsing, search, interaction |
| Geolocation Data | 1798.140(v)(1)(G) | Precise location |
| Sensory Data | 1798.140(v)(1)(H) | Audio, visual, thermal |
| Professional Info | 1798.140(v)(1)(I) | Employment, education |
| Education Info | 1798.140(v)(1)(J) | Non-public education records |
| Inferences | 1798.140(v)(1)(K) | Profiles, preferences |
---
Reference Guides
CCPA/CPRA Requirements Guide
references/ccpa-cpra-requirements-guide.md
Complete regulatory requirements covering:
- Full CCPA/CPRA text analysis with section references
- Consumer rights implementation guidance (Right to Know, Delete, Opt-Out, Correct, Portability, Limit SPI Use)
- Privacy policy content requirements and templates
- Service provider and contractor agreement requirements
- Comparison with Virginia VCDPA, Colorado CPA, Connecticut CTDPA, and GDPR
- Enforcement and penalty structure
CCPA Implementation Playbook
references/ccpa-implementation-playbook.md
Step-by-step implementation guidance:
- 6-month implementation roadmap
- Data mapping methodology and templates
- Privacy policy drafting guide
- Opt-out mechanism implementation (website, GPC, universal opt-out)
- Consumer request workflow design with SLA tracking
- Employee and vendor training program outline
- Annual cybersecurity audit planning
- Ongoing compliance monitoring
---
Workflows
Workflow 1: Initial CCPA/CPRA Compliance Assessment
Step 1: Determine applicability
→ Check $25M revenue, 100K+ consumers, 50%+ PI revenue thresholds
→ Review exemptions (HIPAA, GLBA, employment data)
Step 2: Generate compliance profile template
→ python scripts/ccpa_compliance_checker.py --template > profile.json
→ Fill in organizational details
Step 3: Run compliance assessment
→ python scripts/ccpa_compliance_checker.py --input profile.json
Step 4: Review scores and findings
→ Address critical gaps first (opt-out link, privacy policy)
→ Plan remediation by category
Step 5: Create data inventory
→ python scripts/ccpa_data_mapper.py --template > inventory.json
→ Document all PI categories collected
→ python scripts/ccpa_data_mapper.py --input inventory.json
Step 6: Develop implementation plan
→ See references/ccpa-implementation-playbook.mdWorkflow 2: Consumer Rights Request Handling
Step 1: Receive consumer request
→ Identify request type (Know, Delete, Opt-Out, Correct, Portability, Limit SPI)
Step 2: Acknowledge within 10 business days (confirm receipt)
→ Document request in tracking system
Step 3: Verify consumer identity
→ Match 2+ data points for standard requests
→ Match 3+ data points for sensitive data requests
→ No verification needed for opt-out requests
Step 4: Fulfill request within 45 calendar days
→ Extension: up to 45 additional days with notice
→ Search all systems using data inventory
→ python scripts/ccpa_data_mapper.py --input inventory.json
Step 5: Deliver response
→ Provide information in portable format if requested
→ Document completion and response
Step 6: Monitor compliance
→ Track response times and completion rates
→ Generate quarterly compliance reportsWorkflow 3: Privacy Policy Update Cycle
Step 1: Review current privacy policy against requirements
→ python scripts/ccpa_compliance_checker.py --input profile.json
→ Check privacy_policy category score
Step 2: Update data inventory
→ python scripts/ccpa_data_mapper.py --input inventory.json
→ Verify all PI categories are disclosed
Step 3: Verify required disclosures
→ Categories of PI collected (past 12 months)
→ Sources of PI
→ Business/commercial purposes
→ Categories of third parties
→ Consumer rights description
→ "Do Not Sell or Share" link
→ "Limit the Use of My Sensitive PI" link
Step 4: Update and publish
→ Annual update at minimum
→ Update within 30 days of material changes
→ Maintain prior version archive---
Regulatory Overview
CCPA/CPRA Timeline
| Date | Milestone |
|---|---|
| Jan 1, 2020 | CCPA effective |
| Jul 1, 2020 | AG enforcement begins |
| Nov 3, 2020 | CPRA passed (Proposition 24) |
| Jan 1, 2023 | CPRA amendments effective |
| Jul 1, 2023 | CPPA enforcement of CPRA begins |
| 2026 | Employment and B2B data exemptions status review |
Scope and Applicability
A business is subject to CCPA/CPRA if it:
- Has annual gross revenue exceeding $25 million
- Buys, sells, or shares PI of 100,000+ consumers or households annually
- Derives 50% or more of annual revenue from selling or sharing consumers' PI
Entity Types:
| Entity | Definition | Obligations |
|---|---|---|
| Business | Determines purposes and means of processing | Full CCPA/CPRA compliance |
| Service Provider | Processes PI on behalf of a business (contractual) | Limited use, deletion obligations |
| Contractor | Processes PI via written contract (CPRA addition) | Certification, limited use, audit rights |
| Third Party | Receives PI not as service provider/contractor | Subject to opt-out rights |
Exemptions:
- HIPAA-covered entities: Health data governed by HIPAA exempt
- GLBA: Financial data subject to GLBA exempt
- Employment data: Employee/applicant PI (subject to review through 2026)
- B2B data: Business contact PI in B2B transactions (subject to review through 2026)
- FCRA: Data subject to Fair Credit Reporting Act
Consumer Rights
| Right | CCPA Section | Description | Timeline |
|---|---|---|---|
| Right to Know | §1798.100, §1798.110 | Categories and specific pieces of PI collected | 45 days |
| Right to Delete | §1798.105 | Delete PI collected from the consumer | 45 days |
| Right to Opt-Out | §1798.120 | Opt out of sale or sharing of PI | Immediate |
| Right to Non-Discrimination | §1798.125 | No retaliation for exercising rights | Ongoing |
| Right to Correct | §1798.106 | Correct inaccurate PI (CPRA) | 45 days |
| Right to Limit SPI Use | §1798.121 | Limit use of sensitive PI (CPRA) | Immediate |
| Right to Data Portability | §1798.130 | Receive PI in portable format (CPRA) | 45 days |
Sensitive Personal Information (CPRA)
SPI categories requiring enhanced protections under CPRA §1798.140(ae):
- Social Security number, driver's license, state ID, passport number
- Account log-in credentials (username + password/security question)
- Financial account number with access credentials
- Precise geolocation (within 1,850 feet / radius)
- Racial or ethnic origin
- Religious or philosophical beliefs
- Union membership
- Contents of mail, email, and text messages (unless business is intended recipient)
- Genetic data
- Biometric data for identification
- Health information
- Sex life or sexual orientation data
Enforcement and Penalties
| Violation Type | Penalty | Enforcer |
|---|---|---|
| Unintentional violation | $2,500 per violation | CPPA / AG |
| Intentional violation | $7,500 per violation | CPPA / AG |
| Violations involving minors (under 16) | $7,500 per violation | CPPA / AG |
| Data breach (private action) | $100-$750 per consumer per incident | Consumer (court) |
Enforcement Bodies:
- California Privacy Protection Agency (CPPA): Primary enforcer under CPRA (operational 2023)
- California Attorney General: Retains enforcement authority
- Private right of action: Limited to data breaches from failure to maintain reasonable security
CCPA vs GDPR Comparison
| Aspect | CCPA/CPRA | GDPR |
|---|---|---|
| Scope | California consumers | EU/EEA data subjects |
| Legal basis | Opt-out model | Opt-in (consent or legal basis) |
| Data covered | Personal information | Personal data |
| Sensitive data | SPI with limit-use right | Special category with explicit consent |
| Breach notification | AG notification, private action | 72-hour DPA notification |
| DPO requirement | None | Required for certain processing |
| Penalties | $2,500-$7,500 per violation | Up to 4% global revenue or €20M |
| Private right of action | Data breaches only | Varies by member state |
| Cross-border transfers | No restrictions | Adequacy decisions, SCCs, BCRs |
| Children's data | Opt-in for under 16, parental for under 13 | Parental consent for under 16 (variable) |
Infrastructure Privacy Controls
Cookie Consent Management:
- Implement cookie consent banner for non-essential cookies
- Honor Global Privacy Control (GPC) browser signals (legally required)
- Maintain cookie inventory with retention periods
- Categorize cookies: strictly necessary, functional, analytics, advertising
Global Privacy Control (GPC):
- Businesses must treat GPC signal as valid opt-out request (§1798.135)
- Technical implementation: detect
Sec-GPC: 1header ornavigator.globalPrivacyControl - Apply opt-out to sale AND sharing of PI
- No re-authentication required for GPC
Privacy by Design:
- Data minimization: collect only PI necessary for disclosed purposes
- Purpose limitation: use PI only for purposes disclosed at collection
- Storage limitation: retain PI only as long as necessary
- Security by default: encrypt PI at rest and in transit
Data Inventory and Mapping:
- Maintain comprehensive PI inventory across all systems
- Map data flows: collection → processing → sharing → deletion
- Document retention schedules per PI category
- Track cross-border data transfers
Automated Decision-Making:
- Disclose use of automated decision-making technology
- Provide opt-out for profiling that produces legal or significant effects
- CPRA regulations may require access to logic of automated decisions
Compliance Roadmap
Month 1-2: Discovery and Assessment
- Determine CCPA/CPRA applicability
- Conduct data inventory and mapping
- Gap analysis against requirements
- Assign compliance ownership
Month 3-4: Implementation
- Draft/update privacy policy
- Implement "Do Not Sell or Share" link
- Implement "Limit Use of SPI" link
- Deploy GPC signal detection
- Build consumer request intake and fulfillment workflows
- Draft service provider/contractor agreements
Month 5-6: Operationalization
- Train employees on privacy obligations
- Test consumer request workflows end-to-end
- Conduct initial risk assessment
- Plan annual cybersecurity audit
- Establish ongoing monitoring and metrics
- Document compliance program for regulatory defense
---
Troubleshooting
| Problem | Possible Cause | Resolution |
|---|---|---|
| Compliance score unexpectedly low despite privacy policy updates | Policy disclosures incomplete -- missing SPI categories, retention periods, or sale/sharing categories | Run ccpa_compliance_checker.py --input profile.json and review per-category scores; cross-reference privacy policy against the 17+ required disclosure elements |
| Data mapper flags cross-border transfers but organization operates only in US | Data inventory includes cloud services with non-US processing locations | Review data inventory entries for cloud provider data processing locations; document all sub-processor locations per service provider agreements |
| Consumer rights requests consistently exceed 45-day response deadline | Manual fulfillment process without tracking system or unclear ownership | Implement ccpa_data_mapper.py to map PI across all systems; deploy request tracking with automated deadline alerts; assign per-system data stewards |
| GPC signal detection not working | Application does not check Sec-GPC: 1 header or navigator.globalPrivacyControl | Implement server-side header detection and client-side JavaScript check; test with browsers that support GPC (Firefox, Brave); log detection events |
| CPPA enforcement inquiry received | Potential compliance gap discovered during regulatory sweep or consumer complaint | Immediately run full compliance assessment; prioritize critical gaps (opt-out link, GPC, privacy policy); engage privacy counsel; document remediation timeline |
| Vendor contracts missing CCPA-required provisions | Service provider agreements predate CPRA amendments | Audit all vendor agreements against CCPA service provider/contractor requirements; update contracts to include certification, limited use, audit rights, and data deletion obligations |
| Risk assessment requirements unclear | New CPRA regulations (effective January 1, 2026) mandate risk assessments for six processing categories | Review processing activities against the six "significant risk" categories; document risk assessments per CPPA regulatory template; plan for April 2028 attestation deadline |
---
Success Criteria
- Overall compliance score of 80+ on initial assessment -- indicating foundational CCPA/CPRA controls are in place, with per-category scores identifying targeted remediation areas
- All consumer rights requests fulfilled within 45 calendar days -- with 10-business-day acknowledgment, tracked through a request management system with automated deadline alerts
- Privacy policy updated at least annually -- with documented reviews quarterly, disclosing all 11 PI categories collected, sources, purposes, third-party sharing, and all seven consumer rights
- GPC signal honored automatically -- detected via
Sec-GPC: 1header andnavigator.globalPrivacyControl, applied to both sale and sharing of PI, with no re-authentication required - Complete data inventory maintained -- all PI categories mapped to collection sources, business purposes, sharing recipients, and retention schedules using
ccpa_data_mapper.py - Service provider and contractor agreements include all CCPA-required provisions -- including certification of limited use, deletion obligations, audit rights, and sub-contractor chain documentation
- Risk assessments completed for all applicable processing activities -- covering the six CPRA significant-risk categories, with attestation readiness by the April 2028 deadline
---
Scope & Limitations
In Scope:
- CCPA/CPRA applicability determination (revenue, consumer count, PI revenue thresholds)
- Privacy policy compliance assessment against all required disclosures
- Consumer rights readiness validation (Know, Delete, Opt-Out, Correct, Portability, Limit SPI Use)
- Data inventory mapping across all 11 CCPA personal information categories
- Sensitive personal information identification per CPRA definitions
- Technical safeguard assessment (encryption, access controls, opt-out mechanisms)
- Service provider and contractor agreement requirements
Out of Scope:
- Legal advice or determination of exemption applicability (HIPAA, GLBA, FCRA, employment data) -- consult privacy counsel for exemption analysis
- Implementation of cookie consent management platforms or GPC signal handling code
- CCPA private right of action defense (data breach litigation) -- consult legal counsel
- Other state privacy laws (Virginia VCDPA, Colorado CPA, Connecticut CTDPA) beyond the comparison tables provided -- use jurisdiction-specific guidance
- Automated decision-making technology (ADMT) compliance under CPRA regulations effective January 2027 -- monitor CPPA rulemaking for final requirements
Important Notes:
- CPPA enforcement is escalating significantly in 2025-2026, with fines exceeding $1.3M in individual cases and joint multi-state enforcement sweeps targeting GPC non-compliance
- New CPRA regulations effective January 1, 2026 add risk assessment, cybersecurity audit, and updated compliance requirements -- plan implementation accordingly
---
Integration Points
| Skill | Integration | When to Use |
|---|---|---|
gdpr-dsgvo-expert | Unified privacy program satisfying both GDPR and CCPA; cross-framework privacy mapping | When organization operates in both EU and California markets |
infrastructure-compliance-auditor | Technical safeguard validation (encryption, access controls, logging) for CCPA reasonable security | When assessing infrastructure controls supporting CCPA compliance |
information-security-manager-iso27001 | Security controls supporting CCPA "reasonable security" requirement | When building security program that satisfies both ISO 27001 and CCPA |
soc2-compliance-expert | SOC 2 controls mapped to CCPA technical safeguard requirements | When SOC 2 audit evidence supports CCPA security compliance |
---
Tool Reference
ccpa_compliance_checker.py
Evaluates organizational readiness against all CCPA/CPRA requirements across 8 assessment categories.
| Flag | Required | Description |
|---|---|---|
--input <file> | Yes (unless --template) | Path to JSON company profile for assessment |
--template | No | Generate blank input template to stdout |
--json | No | Output results in JSON format for automation |
--output <file> | No | Export report to specified file path |
Output: Overall compliance score (0-100), per-category scores with pass/fail/partial status, prioritized findings with regulatory references, and remediation recommendations.
ccpa_data_mapper.py
Maps personal information categories, tracks data flows, and generates data inventory reports.
| Flag | Required | Description |
|---|---|---|
--input <file> | Yes (unless --template) | Path to JSON data inventory for mapping |
--template | No | Generate blank inventory template to stdout |
--output <file> | No | Export mapping report to specified file path |
--flow-diagram | No | Generate text-based data flow diagram showing collection, use, sharing, and selling paths |
Output: PI category mapping across all 11 CCPA categories, SPI identification, data flow analysis (sources, purposes, recipients), cross-border transfer flags, and data retention gap detection.
CCPA/CPRA Requirements Guide
Complete requirements reference for the California Consumer Privacy Act (CCPA) and California Privacy Rights Act (CPRA), with regulatory references, implementation guidance, and multi-state privacy law comparison.
---
Table of Contents
- Regulatory Framework
- Consumer Rights Requirements
- Privacy Policy Requirements
- Service Provider and Contractor Requirements
- Sensitive Personal Information Requirements
- Enforcement and Penalties
- Multi-State Privacy Law Comparison
- CCPA vs GDPR Detailed Comparison
---
Regulatory Framework
CCPA (Cal. Civ. Code §1798.100-1798.199.100)
| Section | Title | Key Requirement |
|---|---|---|
| §1798.100 | General Duties | Disclose PI categories, business purposes; data minimization (CPRA) |
| §1798.105 | Right to Delete | Delete PI upon verifiable consumer request |
| §1798.106 | Right to Correct | Correct inaccurate PI (CPRA addition) |
| §1798.110 | Right to Know | Disclose categories and specific pieces of PI |
| §1798.115 | Right to Know (Disclosure) | Disclose PI sold, shared, or disclosed for business purpose |
| §1798.120 | Right to Opt-Out | Opt out of sale or sharing of PI |
| §1798.121 | Right to Limit SPI Use | Limit use and disclosure of SPI (CPRA addition) |
| §1798.125 | Non-Discrimination | No retaliation for exercising rights |
| §1798.130 | How Rights are Exercised | Methods for submitting requests, response timelines |
| §1798.135 | Opt-Out Requirements | "Do Not Sell or Share" link, GPC, opt-out mechanisms |
| §1798.140 | Definitions | Personal information, business, service provider, SPI, etc. |
| §1798.145 | Exemptions | HIPAA, GLBA, FCRA, employment, B2B exemptions |
| §1798.150 | Private Right of Action | Data breach private action, $100-$750 per consumer |
| §1798.155 | CPPA Enforcement | Administrative enforcement by CPPA |
| §1798.185 | Rulemaking | CPPA rulemaking authority, cybersecurity audits, risk assessments |
| §1798.199.10-40 | CPPA | Establishment of California Privacy Protection Agency |
CPRA Key Amendments (Effective January 1, 2023)
1. Created California Privacy Protection Agency (CPPA) as dedicated enforcement body 2. Right to Correct inaccurate PI (§1798.106) 3. Right to Limit Use of SPI (§1798.121) 4. Data minimization and purpose limitation (§1798.100(c)) 5. Sensitive Personal Information category with enhanced protections 6. Contractor distinction from service providers (§1798.140(j)) 7. Automated decision-making disclosure requirements (§1798.185(a)(16)) 8. Cybersecurity audits for high-risk processing (§1798.185(a)(15)(B)) 9. Risk assessments for processing presenting significant risk (§1798.185(a)(15)(A)) 10. Consumer threshold increased from 50,000 to 100,000 consumers/households 11. Right to Data Portability in machine-readable format (§1798.130) 12. Expanded opt-out to cover "sharing" (cross-context behavioral advertising)
---
Consumer Rights Requirements
Right to Know (§1798.100, §1798.110)
What businesses must disclose upon request:
- Categories of PI collected
- Specific pieces of PI collected
- Categories of sources from which PI is collected
- Business or commercial purpose for collecting, selling, or sharing PI
- Categories of third parties to whom PI is disclosed
- Categories of PI sold or shared (past 12 months)
Implementation Requirements:
- Provide at least two methods for submitting requests (toll-free number + one other method)
- Online-only businesses may provide email-only method
- Respond within 45 calendar days of receipt
- May extend up to 90 days total with notice to consumer
- Deliver information covering the 12-month period preceding the request
- Provide information in a portable, readily usable format
- Free of charge (no more than twice in a 12-month period)
Right to Delete (§1798.105)
Requirements:
- Delete PI collected from the consumer upon verifiable request
- Direct service providers and contractors to delete
- Notify third parties to whom PI was sold or shared
Exceptions (§1798.105(d)):
- Complete the transaction for which PI was collected
- Detect security incidents or protect against malicious activity
- Debug to identify and repair functionality errors
- Exercise free speech or another right provided by law
- Comply with California Electronic Communications Privacy Act
- Scientific, historical, or statistical research in the public interest
- Internal uses reasonably aligned with consumer expectations
- Comply with a legal obligation
Right to Opt-Out of Sale/Sharing (§1798.120)
Requirements:
- Consumer right to direct business not to sell or share PI
- "Sell" includes monetary or other valuable consideration
- "Share" includes cross-context behavioral advertising (CPRA)
- Must provide "Do Not Sell or Share My Personal Information" link
- Must honor Global Privacy Control (GPC) signals
- No verification required for opt-out requests
- Wait at least 12 months before requesting re-opt-in
- Children under 16: affirmative opt-in required
- Children under 13: parental/guardian consent required
Right to Correct (§1798.106, CPRA)
Requirements:
- Consumer right to request correction of inaccurate PI
- Business must use commercially reasonable efforts to correct
- Must consider the nature and documented purpose of PI
- Must direct service providers and contractors to correct
- Response timeline: 45 calendar days
Right to Limit Use of SPI (§1798.121, CPRA)
Requirements:
- Consumer right to limit use and disclosure of SPI
- Business must limit use to purposes necessary for service/goods requested
- Must provide "Limit the Use of My Sensitive Personal Information" link
- Permitted uses: performing services, ensuring security/integrity, short-lived uses, quality/safety of products, servicing accounts
Right to Non-Discrimination (§1798.125)
Prohibited discrimination includes:
- Denying goods or services
- Charging different prices or rates
- Providing a different level or quality of goods or services
- Suggesting any of the above
Permitted practices:
- Financial incentive programs with consumer opt-in
- Loyalty programs with value proportional to PI provided
- Different pricing for services funded by PI sale (with disclosure)
Right to Data Portability (§1798.130, CPRA)
Requirements:
- PI must be provided in a portable, readily usable format
- Format must be technically feasible for transmission to another entity
- Applies to Right to Know requests for specific pieces of PI
---
Privacy Policy Requirements
Required Content (§1798.130(a)(5))
A privacy policy must include:
1. Categories of PI collected in the preceding 12 months 2. Categories of SPI collected (CPRA) 3. Categories of sources from which PI is collected 4. Business or commercial purposes for collecting, selling, or sharing 5. Categories of third parties to whom PI is disclosed 6. Categories of PI sold or shared in the preceding 12 months (by PI category and third-party category) 7. Categories of PI disclosed for business purpose in preceding 12 months 8. Retention periods for each category of PI (CPRA) 9. Consumer rights description and how to exercise them 10. Methods for submitting requests (toll-free number, website address) 11. "Do Not Sell or Share My Personal Information" link or explanation 12. "Limit the Use of My Sensitive Personal Information" link (CPRA) 13. Right to non-discrimination statement 14. Date of last update
Format Requirements
- Written in plain, straightforward language
- Available in the languages in which the business operates
- Posted conspicuously on the business's website homepage
- Accessible to consumers with disabilities (WCAG compliance recommended)
- Updated at least every 12 months
- Include effective date of last update
Notice at Collection (§1798.100(b))
At or before the point of collection, businesses must inform consumers of:
- Categories of PI to be collected
- Purposes for which PI will be used
- Whether PI is sold or shared
- Retention periods
- Link to full privacy policy
---
Service Provider and Contractor Requirements
Service Provider Agreements (§1798.140(ag))
Written agreement must include:
- Identify specific business purpose for processing
- Prohibit selling or sharing PI received from/on behalf of business
- Prohibit retaining, using, or disclosing PI outside the direct business relationship
- Prohibit combining PI with other sources (unless permitted)
- Require compliance with CCPA/CPRA obligations
- Grant business right to ensure provider uses PI consistently with CCPA
- Require notification if unable to meet obligations
- Require provider to use reasonable security measures
- Allow business to stop and remediate unauthorized use
Contractor Agreements (§1798.140(j), CPRA)
In addition to service provider requirements:
- Contractor must certify understanding of restrictions
- Contract must prohibit selling or sharing PI
- Must grant audit rights to the business
- Must require notification to business of subcontractor engagement
Third-Party Obligations
- Must comply with consumer opt-out requests
- Must provide same level of privacy protection as the business
- Must notify business if unable to meet obligations
- Business must take steps to stop and remediate unauthorized use
---
Sensitive Personal Information Requirements
SPI Categories (§1798.140(ae))
| # | Category | Examples |
|---|---|---|
| 1 | Government identifiers | SSN, driver's license, state ID, passport |
| 2 | Account credentials | Username + password, security question, access code |
| 3 | Financial with credentials | Account number + access code allowing account access |
| 4 | Precise geolocation | Location within 1,850-foot radius |
| 5 | Protected classifications | Racial/ethnic origin, religious beliefs, union membership |
| 6 | Genetic data | DNA sequences, genetic markers |
| 7 | Communications content | Mail, email, text message content (unless intended recipient) |
| 8 | Biometric data | Used for purpose of uniquely identifying a consumer |
| 9 | Health information | Physical or mental health condition or treatment |
| 10 | Sex life/orientation | Sexual orientation, sex life data |
SPI Business Obligations
- Provide "Limit the Use of My Sensitive Personal Information" link on homepage
- Limit use to what is necessary to perform services/provide goods
- Do not use SPI for purposes beyond those disclosed at collection
- Apply enhanced security controls (encryption, access restrictions)
- Include SPI categories in privacy policy disclosures
- Honor consumer requests to limit SPI use without verification burden
---
Enforcement and Penalties
CPPA Enforcement (§1798.155, §1798.199.10-40)
- Investigative powers: Subpoenas, audits, inspections
- Administrative fines: $2,500 per unintentional violation, $7,500 per intentional violation
- 30-day cure period: Eliminated under CPRA for CPPA enforcement (AG may still offer)
- Rulemaking authority: Cybersecurity audit rules, risk assessment rules, automated decision-making
AG Enforcement
- Retains enforcement authority alongside CPPA
- May bring civil actions in superior court
- Penalties: $2,500 per unintentional, $7,500 per intentional violation
- No cap on total penalties (per-violation basis)
Private Right of Action (§1798.150)
- Limited scope: Only for data breaches resulting from failure to maintain reasonable security
- Statutory damages: $100-$750 per consumer per incident (or actual damages, whichever greater)
- 30-day cure notice: Consumer must provide 30-day written notice before filing suit
- AG may intervene: AG can prosecute action instead of consumer
- No private right of action for other CCPA violations
---
Multi-State Privacy Law Comparison
Key US State Privacy Laws
| Feature | CCPA/CPRA (CA) | VCDPA (VA) | CPA (CO) | CTDPA (CT) | TDPSA (TX) |
|---|---|---|---|---|---|
| Effective | Jan 2020 / Jan 2023 | Jan 2023 | Jul 2023 | Jul 2023 | Jul 2024 |
| Scope | $25M rev, 100K consumers, or 50% PI rev | 100K consumers or 25K + 50% rev | 100K consumers or 25K + PI rev | 100K consumers or 25K + 50% rev | Process PI of TX residents |
| Opt-out model | Yes | Yes | Yes (universal opt-out) | Yes (universal opt-out) | Yes |
| Right to Know | Yes | Yes | Yes | Yes | Yes |
| Right to Delete | Yes | Yes | Yes | Yes | Yes |
| Right to Correct | Yes (CPRA) | Yes | Yes | Yes | Yes |
| Right to Portability | Yes (CPRA) | Yes | Yes | Yes | Yes |
| Right to Opt-Out Sale | Yes | Yes (sale, profiling, targeted ads) | Yes (sale, profiling, targeted ads) | Yes (sale, profiling, targeted ads) | Yes |
| SPI Category | Yes (CPRA) | Consent-based | Consent-based | Consent-based | Consent-based |
| Private Right of Action | Data breaches only | No | No | No | No |
| Cure Period | No (CPPA) | 30 days (sunsets 2025) | 60 days (sunsets 2025) | 60 days | 30 days |
| Enforcer | CPPA + AG | AG | AG | AG | AG |
| Data Minimization | Yes (CPRA) | Yes | Yes | Yes | Yes |
| DPIA Required | Risk assessments (CPRA) | Yes | Yes | Yes | Yes |
| Universal Opt-Out | GPC required | Opt-out mechanism by 2025 | Required by Jul 2024 | Required by Jan 2025 | No |
State Law Interaction Strategy
For organizations operating across multiple states: 1. Use CCPA/CPRA as baseline — it is the most comprehensive and strictest 2. Layer state-specific requirements on top (e.g., VCDPA's DPIA requirements) 3. Implement universal opt-out signals (GPC) to satisfy multiple states simultaneously 4. Maintain a single comprehensive privacy policy addressing all state requirements 5. Track new state laws — 15+ states have enacted comprehensive privacy laws as of 2025
---
CCPA vs GDPR Detailed Comparison
| Aspect | CCPA/CPRA | GDPR |
|---|---|---|
| Jurisdiction | California residents | EU/EEA data subjects globally |
| Legal basis model | Opt-out (no legal basis required for collection) | Opt-in (requires legal basis per Art. 6) |
| Data scope | Personal information (broadly defined) | Personal data (broadly defined) |
| Controller/processor | Business / service provider / contractor | Controller / processor |
| Consent standard | Opt-out of sale/sharing; opt-in for minors | Freely given, specific, informed, unambiguous |
| Sensitive data | SPI with limit-use right | Special category with explicit consent (Art. 9) |
| DPO requirement | None | Required for certain processing (Art. 37) |
| Breach notification | AG notification, private right of action | 72-hour DPA notification (Art. 33), data subject notification (Art. 34) |
| Penalties | $2,500-$7,500 per violation + private action ($100-$750) | Up to 4% global annual revenue or EUR 20M |
| Cross-border transfers | No transfer restrictions | Adequacy, SCCs, BCRs, or derogations |
| Records of processing | Privacy policy disclosures | Record of processing activities (Art. 30) |
| Children's data | Opt-in under 16, parental under 13 | Varies by member state (13-16), parental consent |
| Right to object | Opt-out of sale/sharing | Object to legitimate interest processing (Art. 21) |
| Automated decisions | Disclosure (CPRA rulemaking) | Right not to be subject to solely automated decisions (Art. 22) |
| Private action | Data breaches only | Varies by member state (Art. 82) |
| Regulatory body | CPPA (state-level) | DPAs (per member state) + EDPB |
| Extraterritorial | Businesses meeting thresholds doing business in CA | Any entity processing EU residents' data |
Dual Compliance Strategy
For organizations subject to both CCPA/CPRA and GDPR: 1. Use GDPR's higher consent standard as default for EU users 2. Apply CCPA/CPRA opt-out model for California consumers 3. Implement GPC and cookie consent for both frameworks 4. Maintain unified data subject/consumer rights workflow with framework-specific response templates 5. Map CCPA PI categories to GDPR data categories in a single data inventory 6. Apply the stricter requirement where frameworks overlap
CCPA/CPRA Implementation Playbook
Step-by-step implementation guide for achieving and maintaining CCPA/CPRA compliance, including data mapping methodology, privacy policy drafting, opt-out mechanisms, consumer request workflows, training, and audit planning.
---
Table of Contents
- 6-Month Implementation Roadmap
- Data Mapping Methodology
- Privacy Policy Drafting Guide
- Opt-Out Mechanism Implementation
- Consumer Request Workflow Design
- Training Program Outline
- Annual Cybersecurity Audit Planning
- Ongoing Compliance Monitoring
---
6-Month Implementation Roadmap
Month 1: Discovery and Scoping
| Week | Activity | Deliverable |
|---|---|---|
| 1 | Determine CCPA/CPRA applicability | Applicability determination memo |
| 1 | Assign compliance ownership (DPO / privacy lead) | RACI matrix |
| 2 | Identify all data systems processing PI | System inventory spreadsheet |
| 2 | Identify all PI categories collected | PI category inventory |
| 3 | Map data flows (collection, use, sharing, selling) | Data flow diagrams |
| 3 | Identify all service providers, contractors, third parties | Vendor inventory |
| 4 | Conduct gap analysis against CCPA/CPRA requirements | Gap analysis report |
| 4 | Prioritize remediation actions | Prioritized action plan |
Month 2: Data Inventory and Mapping
| Week | Activity | Deliverable |
|---|---|---|
| 1 | Complete detailed data inventory per system | Data inventory (JSON or spreadsheet) |
| 1 | Identify all SPI categories and systems | SPI inventory |
| 2 | Document collection sources per PI category | Source mapping document |
| 2 | Document business purposes per PI category | Purpose mapping document |
| 3 | Map third-party sharing and selling flows | Third-party data flow map |
| 3 | Document retention periods per PI category | Retention schedule |
| 4 | Validate data inventory with system owners | Signed-off data inventory |
| 4 | Identify cross-border data transfers | Transfer documentation |
Month 3: Policy and Documentation
| Week | Activity | Deliverable |
|---|---|---|
| 1 | Draft privacy policy using requirements checklist | Draft privacy policy |
| 1 | Draft notice at collection | Notice at collection text |
| 2 | Draft service provider agreement addendum | SP agreement template |
| 2 | Draft contractor agreement addendum | Contractor agreement template |
| 3 | Legal review of all documents | Legal review memo |
| 3 | Create privacy policy archive process | Version control procedure |
| 4 | Publish privacy policy on website | Live privacy policy URL |
| 4 | Implement notice at collection across channels | Deployed notices |
Month 4: Technical Implementation
| Week | Activity | Deliverable |
|---|---|---|
| 1 | Implement "Do Not Sell or Share" link on homepage | Live opt-out link |
| 1 | Implement "Limit Use of SPI" link on homepage | Live SPI limit link |
| 2 | Implement GPC signal detection | GPC technical implementation |
| 2 | Deploy cookie consent management platform | Cookie consent banner |
| 3 | Build consumer request intake form | Online request form |
| 3 | Set up toll-free number (or email for online-only) | Request intake channels |
| 4 | Build consumer request fulfillment workflow | Workflow documentation |
| 4 | Implement identity verification process | Verification procedure |
Month 5: Operationalization
| Week | Activity | Deliverable |
|---|---|---|
| 1 | Test consumer request workflow end-to-end | Test results report |
| 1 | Test opt-out mechanisms (website, GPC, cookies) | Test results report |
| 2 | Execute service provider/contractor agreements | Signed agreements |
| 2 | Train customer-facing staff on request handling | Training completion records |
| 3 | Train all employees on privacy obligations | Training completion records |
| 3 | Conduct tabletop exercise for data breach scenario | Exercise report |
| 4 | Document compliance program for regulatory defense | Compliance program documentation |
| 4 | Establish ongoing metrics and monitoring | Dashboard / KPI tracking |
Month 6: Verification and Audit
| Week | Activity | Deliverable |
|---|---|---|
| 1 | Conduct internal compliance assessment | Assessment report |
| 1 | Remediate any remaining gaps | Remediation evidence |
| 2 | Plan annual cybersecurity audit | Audit plan |
| 2 | Conduct risk assessment for high-risk processing | Risk assessment report |
| 3 | Finalize compliance documentation package | Compliance package |
| 3 | Brief executive leadership on compliance status | Executive briefing |
| 4 | Establish quarterly review cadence | Review calendar |
| 4 | Document lessons learned and improvement plan | Improvement plan |
---
Data Mapping Methodology
Step 1: Inventory Data Systems
Document every system that collects, stores, processes, or transmits PI:
For each system, capture:
- System name and owner
- System type (CRM, ERP, analytics, marketing, HR, etc.)
- Description and business function
- PI categories processed (map to 11 CCPA categories)
- SPI categories processed (map to CPRA SPI categories)
- Data volume (number of consumer records)
- Data retention period
- Geographic location (data center region)Step 2: Map Collection Sources
For each PI category, document:
- Direct collection: Website forms, mobile apps, in-person, phone
- Indirect collection: Third-party data purchases, public records, social media
- Automatic collection: Cookies, pixels, device fingerprinting, server logs
- Employee/agent collection: Customer service interactions, sales interactions
Step 3: Map Business and Commercial Purposes
Document purposes per CCPA-defined categories:
- Auditing: Ad impressions, compliance with regulations
- Security: Detecting security incidents, protecting against fraud
- Debugging: Identifying and repairing functionality errors
- Short-lived use: Contextual ad customization (not profiling)
- Services: Performing services, maintaining accounts
- Quality/safety: Verifying or maintaining quality, safety
- Product improvement: Advancing commercial or economic interests
Step 4: Map Sharing and Selling
Document all PI flows to external parties:
| PI Category | Recipient | Recipient Type | Purpose | Legal Basis |
|---|---|---|---|---|
| (category) | (name) | SP / Contractor / Third Party | (purpose) | (sale / sharing / business purpose) |
Step 5: Document Retention
For each PI category:
- Define retention period and justification
- Document deletion/anonymization procedures
- Specify exceptions (legal hold, regulatory requirement)
- Ensure retention is "no longer than reasonably necessary" (CPRA §1798.100(c))
Step 6: Validate and Maintain
- Quarterly review: Validate data inventory accuracy with system owners
- Trigger-based updates: New systems, new PI categories, new vendors
- Annual comprehensive review: Full data mapping refresh
---
Privacy Policy Drafting Guide
Structure Template
1. Introduction and Scope
2. Categories of Personal Information Collected
3. Categories of Sensitive Personal Information Collected
4. Sources of Personal Information
5. Purposes for Collecting and Using Personal Information
6. How We Share Personal Information
7. Categories of PI Sold or Shared (past 12 months)
8. Categories of PI Disclosed for Business Purpose (past 12 months)
9. Retention Periods
10. Your Privacy Rights
a. Right to Know
b. Right to Delete
c. Right to Correct
d. Right to Opt-Out of Sale/Sharing
e. Right to Limit Use of SPI
f. Right to Data Portability
g. Right to Non-Discrimination
11. How to Exercise Your Rights
12. Verification Process
13. Authorized Agents
14. Children's Privacy
15. Do Not Sell or Share My Personal Information
16. Limit the Use of My Sensitive Personal Information
17. Changes to This Policy
18. Contact Information
19. Effective DateDrafting Best Practices
- Use plain language (8th-grade reading level target)
- Avoid legal jargon where possible
- Use tables for PI category disclosures
- Provide specific examples of PI in each category
- Include clear instructions for exercising rights
- Specify response timelines
- Update the effective date on every revision
- Maintain an archive of all prior versions with dates
---
Opt-Out Mechanism Implementation
"Do Not Sell or Share" Link
Placement:
- Homepage footer (required)
- All landing pages (recommended)
- Mobile app settings (if applicable)
- Email footer (recommended)
Technical Implementation: 1. Create dedicated opt-out page with clear form 2. Associate opt-out preference with consumer identifier (cookie, account, device) 3. Propagate opt-out to all downstream systems (ad tech, analytics, third parties) 4. Persist preference indefinitely (do not reset) 5. Confirm opt-out to consumer
Global Privacy Control (GPC)
Detection methods:
HTTP Header: Sec-GPC: 1
JavaScript API: navigator.globalPrivacyControl === trueImplementation requirements:
- Detect GPC signal on every page load
- Treat GPC as valid opt-out of sale AND sharing
- Do not require additional steps from consumer
- Apply opt-out to the browser or device (not just session)
- Do not serve tracking cookies if GPC detected
- Log GPC detection for compliance records
"Limit Use of SPI" Link
Placement:
- Homepage footer (required under CPRA)
- May combine with "Do Not Sell or Share" link using alternative link labeled "Your Privacy Choices" or similar (per CPPA guidance)
Implementation: 1. Create preference center for SPI use limitation 2. Document which SPI uses will be limited 3. Implement technical controls to restrict SPI processing 4. Persist preference and propagate to all systems
Cookie Consent Management
Categories to implement:
- Strictly necessary (no consent required)
- Functional (consent recommended)
- Analytics (consent or opt-out required)
- Advertising (must honor opt-out)
Platform requirements:
- Load non-essential cookies only after consent or in absence of opt-out
- Integrate with GPC detection
- Maintain cookie inventory with vendor, purpose, expiration
- Provide granular category controls
---
Consumer Request Workflow Design
Request Intake
Channels:
- Online form (primary) — accessible from privacy policy and footer
- Toll-free phone number — staffed or IVR with callback
- Email — privacy-specific address (e.g., privacy@company.com)
Information to capture:
- Request type (Know, Delete, Correct, Opt-Out, Limit SPI, Portability)
- Consumer name and contact information
- Consumer identifier (email, account number, etc.)
- Specific details (for correction requests)
- Authorized agent documentation (if applicable)
Identity Verification
Standard requests (categories of PI):
- Match 2+ data points against existing records
- Examples: name + email, name + account number, name + phone
Specific pieces of PI requests:
- Match 3+ data points against existing records
- Examples: name + email + last 4 SSN, name + account + DOB
Opt-out requests:
- No verification required (must be processed immediately)
Authorized agents:
- Verify agent's authority (power of attorney or signed authorization)
- May also verify consumer identity directly
- Registered with Secretary of State (if business entity)
Request Tracking
SLA tracking:
- Receipt date and time
- 10-business-day acknowledgment deadline
- 45-calendar-day response deadline
- Extension date (if applicable, up to 90 days total)
- Completion date
- Escalation triggers at 30 days and 40 days
Status workflow:
Received → Acknowledged → Verification Pending → Verified →
In Progress → Ready for Review → Response Sent → CompletedMetrics to track:
- Request volume by type (monthly/quarterly)
- Average response time
- On-time completion rate
- Denial rate and reasons
- Appeal rate and outcomes
Response Templates
Develop standardized response templates for:
- Acknowledgment of receipt (within 10 business days)
- Verification request
- Extension notice (with reason)
- Right to Know response (categories)
- Right to Know response (specific pieces)
- Right to Delete confirmation
- Right to Correct confirmation
- Opt-out confirmation
- Limit SPI confirmation
- Denial with explanation and appeal rights
- Authorized agent response
---
Training Program Outline
Tier 1: All Employees (Annual)
Duration: 30-45 minutes Content:
- What is CCPA/CPRA and why it matters
- What is personal information (with examples)
- How to recognize a consumer privacy request
- Where to direct consumer requests
- Data handling best practices
- Consequences of non-compliance
Tier 2: Customer-Facing Staff (Quarterly)
Duration: 60-90 minutes Content:
- Detailed consumer rights overview
- How to accept and log requests
- Identity verification procedures
- Escalation procedures
- Scripts for common consumer scenarios
- Handling difficult or complex requests
- Non-discrimination requirements
Tier 3: Privacy and Compliance Team (Ongoing)
Duration: 2-4 hours initial, monthly updates Content:
- Full CCPA/CPRA text analysis
- CPPA regulations and guidance updates
- Request fulfillment procedures
- Data inventory management
- Vendor management and agreements
- Risk assessment methodology
- Audit preparation
- Incident response
Training Delivery
- Learning management system (LMS) for tracking completion
- Annual certification requirement for all employees
- Role-specific assessments
- New hire orientation inclusion
- Refresher training after regulatory updates
---
Annual Cybersecurity Audit Planning
CPRA Audit Requirement (§1798.185(a)(15)(B))
The CPPA is authorized to issue regulations requiring annual cybersecurity audits for businesses whose processing of PI presents "significant risk to consumers' privacy or security."
Audit Scope
| Area | Key Controls to Audit |
|---|---|
| Access management | RBAC, MFA, privileged access management, access reviews |
| Encryption | At rest, in transit, key management, certificate lifecycle |
| Incident response | IR plan, tabletop exercises, breach notification readiness |
| Vulnerability management | Scanning frequency, patch SLAs, penetration testing |
| Data protection | DLP, backup/recovery, data classification, retention |
| Vendor security | SP assessments, contractual requirements, monitoring |
| Network security | Firewalls, segmentation, monitoring, WAF |
| Employee security | Background checks, training, acceptable use, offboarding |
| Physical security | Data center controls, office access, media disposal |
Audit Process
1. Scoping (Month 1): Define systems and data in scope 2. Evidence collection (Month 2-3): Gather policies, configurations, logs 3. Testing (Month 3-4): Validate controls through sampling, inspection, testing 4. Findings (Month 4): Document findings, assign severity ratings 5. Remediation (Month 5-6): Implement corrective actions for findings 6. Reporting (Month 6): Final audit report with management attestation
Risk Assessment for Processing Activities
For each processing activity involving SPI or large-scale PI processing:
- Describe the processing activity and purpose
- Assess risks to consumers' privacy and security
- Evaluate safeguards applied to mitigate risks
- Determine whether benefits outweigh risks
- Document residual risk and acceptance rationale
- Review annually or when processing changes materially
---
Ongoing Compliance Monitoring
Quarterly Activities
- [ ] Review consumer request metrics (volume, timing, completions)
- [ ] Validate data inventory accuracy with system owners
- [ ] Review vendor compliance with SP/contractor agreements
- [ ] Test opt-out mechanisms (website, GPC, cookies)
- [ ] Review privacy policy for necessary updates
- [ ] Monitor CPPA enforcement actions and guidance
Annual Activities
- [ ] Comprehensive data mapping refresh
- [ ] Privacy policy annual update
- [ ] Cybersecurity audit (if required)
- [ ] Risk assessments for processing activities
- [ ] Employee training refresh and certification
- [ ] Vendor agreement review and renewal
- [ ] Board/executive compliance briefing
- [ ] Regulatory landscape scan (new state laws, CPPA rules)
KPIs to Track
| KPI | Target | Frequency |
|---|---|---|
| Consumer request on-time completion | > 95% | Monthly |
| Average request response time | < 30 days | Monthly |
| Privacy policy accuracy | 100% current | Quarterly |
| Employee training completion | 100% | Annually |
| SP/contractor agreement coverage | 100% | Quarterly |
| Data inventory freshness | < 90 days old | Quarterly |
| Opt-out mechanism uptime | 99.9% | Monthly |
| GPC signal detection rate | 100% accuracy | Quarterly |
| Open audit findings | 0 critical, < 5 high | Monthly |
Regulatory Monitoring
Track and respond to:
- CPPA rulemaking and proposed regulations
- CPPA enforcement actions and published decisions
- AG enforcement actions
- Court decisions affecting CCPA/CPRA interpretation
- New state privacy law enactments
- Federal privacy law developments
- Industry-specific guidance
#!/usr/bin/env python3
"""
CCPA/CPRA Compliance Checker
Evaluates organizational readiness against all CCPA/CPRA requirements.
Validates privacy policies, consumer rights handling, technical safeguards,
opt-out mechanisms, and sensitive personal information controls.
Usage:
python ccpa_compliance_checker.py --template > profile.json
python ccpa_compliance_checker.py --input profile.json
python ccpa_compliance_checker.py --input profile.json --json
python ccpa_compliance_checker.py --input profile.json --output report.json
"""
import argparse
import json
import sys
from datetime import datetime
from typing import Any, Dict, List, Tuple
TEMPLATE = {
"organization": {
"name": "",
"annual_revenue_usd": 0,
"consumers_or_households_count": 0,
"percent_revenue_from_selling_sharing_pi": 0,
"is_hipaa_covered_entity": False,
"is_glba_covered": False,
"processes_employee_data_only": False,
"processes_b2b_data_only": False
},
"privacy_policy": {
"exists": False,
"last_updated": "",
"available_online": False,
"accessible_format": False,
"languages": [],
"discloses_pi_categories_collected": False,
"discloses_pi_sources": False,
"discloses_business_purposes": False,
"discloses_commercial_purposes": False,
"discloses_third_party_categories": False,
"discloses_consumer_rights": False,
"discloses_right_to_know": False,
"discloses_right_to_delete": False,
"discloses_right_to_opt_out": False,
"discloses_right_to_correct": False,
"discloses_right_to_limit_spi": False,
"discloses_right_to_portability": False,
"discloses_right_to_non_discrimination": False,
"discloses_retention_periods": False,
"discloses_sale_sharing_categories": False,
"discloses_spi_categories": False,
"updated_annually": False,
"prior_versions_archived": False
},
"consumer_rights": {
"request_intake_mechanism": False,
"toll_free_number": False,
"online_request_form": False,
"email_request_option": False,
"identity_verification_process": False,
"two_data_point_verification": False,
"three_data_point_for_sensitive": False,
"authorized_agent_process": False,
"acknowledgment_within_10_days": False,
"fulfillment_within_45_days": False,
"extension_process_with_notice": False,
"right_to_know_implemented": False,
"right_to_delete_implemented": False,
"right_to_opt_out_implemented": False,
"right_to_correct_implemented": False,
"right_to_limit_spi_implemented": False,
"right_to_portability_implemented": False,
"non_discrimination_policy": False,
"appeal_process": False,
"request_tracking_system": False,
"response_templates": False,
"staff_trained_on_handling": False
},
"opt_out_mechanisms": {
"do_not_sell_or_share_link": False,
"link_on_homepage": False,
"link_clear_and_conspicuous": False,
"limit_use_of_spi_link": False,
"spi_link_on_homepage": False,
"global_privacy_control_honored": False,
"gpc_technical_detection": False,
"cookie_consent_banner": False,
"cookie_categories_defined": False,
"opt_out_preference_signal_respected": False,
"no_dark_patterns": False,
"opt_out_easy_as_opt_in": False,
"minor_opt_in_required_under_16": False,
"parental_consent_under_13": False
},
"sensitive_personal_information": {
"spi_categories_identified": False,
"ssn_protected": False,
"financial_accounts_protected": False,
"precise_geolocation_controlled": False,
"racial_ethnic_data_controlled": False,
"biometric_data_controlled": False,
"health_data_controlled": False,
"sexual_orientation_data_controlled": False,
"email_text_content_controlled": False,
"login_credentials_protected": False,
"genetic_data_controlled": False,
"spi_use_limited_to_disclosed_purposes": False,
"spi_processing_minimized": False
},
"technical_safeguards": {
"encryption_at_rest": False,
"encryption_in_transit": False,
"access_controls_implemented": False,
"role_based_access": False,
"mfa_for_pi_access": False,
"audit_logging": False,
"data_loss_prevention": False,
"incident_response_plan": False,
"breach_notification_process": False,
"vulnerability_management": False,
"penetration_testing": False,
"security_awareness_training": False,
"vendor_security_assessments": False,
"data_backup_and_recovery": False
},
"service_providers": {
"sp_agreements_in_place": False,
"agreements_restrict_pi_use": False,
"agreements_require_deletion": False,
"agreements_allow_audits": False,
"contractor_agreements_in_place": False,
"contractor_certification_obtained": False,
"third_party_data_sharing_documented": False,
"third_party_opt_out_honored": False,
"data_processing_agreements": False,
"sp_security_requirements": False,
"sp_breach_notification_clause": False,
"subprocessor_management": False
},
"risk_assessments": {
"annual_cybersecurity_audit_planned": False,
"risk_assessment_for_processing": False,
"data_inventory_maintained": False,
"data_flow_mapping_current": False,
"retention_schedule_documented": False,
"cross_border_transfers_documented": False,
"automated_decision_making_disclosed": False,
"data_minimization_practiced": False,
"purpose_limitation_enforced": False
}
}
CATEGORY_WEIGHTS = {
"applicability": 5,
"privacy_policy": 20,
"consumer_rights": 25,
"opt_out_mechanisms": 15,
"sensitive_personal_information": 10,
"technical_safeguards": 10,
"service_providers": 10,
"risk_assessments": 5
}
def check_applicability(data: Dict) -> Tuple[float, List[Dict]]:
"""Check if the organization is subject to CCPA/CPRA."""
org = data.get("organization", {})
findings = []
triggers = 0
total_triggers = 3
revenue = org.get("annual_revenue_usd", 0)
if revenue >= 25_000_000:
triggers += 1
findings.append({
"check": "Revenue threshold",
"status": "triggered",
"detail": f"Revenue ${revenue:,.0f} exceeds $25M threshold",
"reference": "Cal. Civ. Code §1798.140(d)(1)(A)"
})
else:
findings.append({
"check": "Revenue threshold",
"status": "not_triggered",
"detail": f"Revenue ${revenue:,.0f} below $25M threshold",
"reference": "Cal. Civ. Code §1798.140(d)(1)(A)"
})
consumers = org.get("consumers_or_households_count", 0)
if consumers >= 100_000:
triggers += 1
findings.append({
"check": "Consumer count threshold",
"status": "triggered",
"detail": f"{consumers:,} consumers/households exceeds 100K threshold",
"reference": "Cal. Civ. Code §1798.140(d)(1)(B)"
})
else:
findings.append({
"check": "Consumer count threshold",
"status": "not_triggered",
"detail": f"{consumers:,} consumers/households below 100K threshold",
"reference": "Cal. Civ. Code §1798.140(d)(1)(B)"
})
pct_revenue = org.get("percent_revenue_from_selling_sharing_pi", 0)
if pct_revenue >= 50:
triggers += 1
findings.append({
"check": "PI revenue threshold",
"status": "triggered",
"detail": f"{pct_revenue}% revenue from selling/sharing PI exceeds 50% threshold",
"reference": "Cal. Civ. Code §1798.140(d)(1)(C)"
})
else:
findings.append({
"check": "PI revenue threshold",
"status": "not_triggered",
"detail": f"{pct_revenue}% revenue from selling/sharing PI below 50% threshold",
"reference": "Cal. Civ. Code §1798.140(d)(1)(C)"
})
# Check exemptions
exemptions = []
if org.get("is_hipaa_covered_entity"):
exemptions.append("HIPAA-covered entity (§1798.145(c))")
if org.get("is_glba_covered"):
exemptions.append("GLBA-covered (§1798.145(e))")
if org.get("processes_employee_data_only"):
exemptions.append("Employee data exemption (under review through 2026)")
if org.get("processes_b2b_data_only"):
exemptions.append("B2B data exemption (under review through 2026)")
if exemptions:
for ex in exemptions:
findings.append({
"check": "Exemption",
"status": "info",
"detail": ex,
"reference": "Cal. Civ. Code §1798.145"
})
is_subject = triggers >= 1 and not (
org.get("is_hipaa_covered_entity") or org.get("is_glba_covered")
)
score = 100.0 if is_subject else (0.0 if triggers == 0 else 50.0)
findings.insert(0, {
"check": "CCPA/CPRA applicability",
"status": "subject" if is_subject else "not_subject",
"detail": f"{triggers} of {total_triggers} thresholds triggered",
"reference": "Cal. Civ. Code §1798.140(d)"
})
return score, findings
def check_boolean_section(data: Dict, section_key: str,
checks: List[Dict]) -> Tuple[float, List[Dict]]:
"""Evaluate a section of boolean compliance checks."""
section = data.get(section_key, {})
findings = []
passed = 0
total = len(checks)
for check in checks:
key = check["key"]
value = section.get(key, False)
status = "pass" if value else "fail"
if value:
passed += 1
findings.append({
"check": check["name"],
"status": status,
"detail": check.get("detail_pass" if value else "detail_fail", ""),
"reference": check.get("reference", ""),
"severity": check.get("severity", "medium")
})
score = (passed / total * 100) if total > 0 else 0
return score, findings
PRIVACY_POLICY_CHECKS = [
{"key": "exists", "name": "Privacy policy exists",
"detail_pass": "Privacy policy documented",
"detail_fail": "No privacy policy found — required under §1798.100(b)",
"reference": "§1798.100(b)", "severity": "critical"},
{"key": "available_online", "name": "Available online",
"detail_pass": "Policy accessible on website",
"detail_fail": "Policy not available online — must be posted conspicuously",
"reference": "§1798.130(a)(5)", "severity": "critical"},
{"key": "accessible_format", "name": "Accessible format",
"detail_pass": "Policy in accessible format",
"detail_fail": "Policy not in accessible format for consumers with disabilities",
"reference": "§1798.130(a)(5)", "severity": "medium"},
{"key": "discloses_pi_categories_collected", "name": "PI categories disclosed",
"detail_pass": "Categories of PI collected are disclosed",
"detail_fail": "Must disclose categories of PI collected in past 12 months",
"reference": "§1798.100(a)", "severity": "critical"},
{"key": "discloses_pi_sources", "name": "PI sources disclosed",
"detail_pass": "Sources of PI are disclosed",
"detail_fail": "Must disclose categories of sources from which PI is collected",
"reference": "§1798.110(c)(2)", "severity": "high"},
{"key": "discloses_business_purposes", "name": "Business purposes disclosed",
"detail_pass": "Business purposes for collection are disclosed",
"detail_fail": "Must disclose business or commercial purposes for collecting PI",
"reference": "§1798.110(c)(3)", "severity": "high"},
{"key": "discloses_third_party_categories", "name": "Third party categories disclosed",
"detail_pass": "Categories of third parties are disclosed",
"detail_fail": "Must disclose categories of third parties to whom PI is disclosed",
"reference": "§1798.110(c)(4)", "severity": "high"},
{"key": "discloses_consumer_rights", "name": "Consumer rights described",
"detail_pass": "Consumer rights are described in policy",
"detail_fail": "Must describe consumer rights and how to exercise them",
"reference": "§1798.130(a)(2)", "severity": "critical"},
{"key": "discloses_right_to_know", "name": "Right to Know disclosed",
"detail_pass": "Right to Know is described",
"detail_fail": "Must disclose Right to Know categories and specific pieces of PI",
"reference": "§1798.100, §1798.110", "severity": "high"},
{"key": "discloses_right_to_delete", "name": "Right to Delete disclosed",
"detail_pass": "Right to Delete is described",
"detail_fail": "Must disclose Right to Delete PI",
"reference": "§1798.105", "severity": "high"},
{"key": "discloses_right_to_opt_out", "name": "Right to Opt-Out disclosed",
"detail_pass": "Right to Opt-Out of sale/sharing is described",
"detail_fail": "Must disclose Right to Opt-Out of sale or sharing",
"reference": "§1798.120", "severity": "high"},
{"key": "discloses_right_to_correct", "name": "Right to Correct disclosed",
"detail_pass": "Right to Correct is described (CPRA)",
"detail_fail": "Must disclose Right to Correct inaccurate PI (CPRA requirement)",
"reference": "§1798.106", "severity": "high"},
{"key": "discloses_right_to_limit_spi", "name": "Right to Limit SPI Use disclosed",
"detail_pass": "Right to Limit Use of SPI is described (CPRA)",
"detail_fail": "Must disclose Right to Limit Use of Sensitive PI",
"reference": "§1798.121", "severity": "high"},
{"key": "discloses_right_to_portability", "name": "Right to Portability disclosed",
"detail_pass": "Right to Data Portability is described (CPRA)",
"detail_fail": "Must disclose Right to Data Portability",
"reference": "§1798.130", "severity": "medium"},
{"key": "discloses_right_to_non_discrimination", "name": "Non-discrimination disclosed",
"detail_pass": "Right to Non-Discrimination is described",
"detail_fail": "Must disclose Right to Non-Discrimination for exercising rights",
"reference": "§1798.125", "severity": "high"},
{"key": "discloses_retention_periods", "name": "Retention periods disclosed",
"detail_pass": "Retention periods are disclosed (CPRA)",
"detail_fail": "Must disclose retention periods for each PI category (CPRA)",
"reference": "§1798.100(a)(3)", "severity": "medium"},
{"key": "discloses_sale_sharing_categories", "name": "Sale/sharing categories disclosed",
"detail_pass": "Categories of PI sold or shared are disclosed",
"detail_fail": "Must disclose categories of PI sold or shared in past 12 months",
"reference": "§1798.115(c)", "severity": "high"},
{"key": "discloses_spi_categories", "name": "SPI categories disclosed",
"detail_pass": "Sensitive PI categories collected are disclosed",
"detail_fail": "Must disclose categories of SPI collected (CPRA)",
"reference": "§1798.100(a)(2)", "severity": "high"},
{"key": "updated_annually", "name": "Updated annually",
"detail_pass": "Policy updated at least annually",
"detail_fail": "Policy must be updated at least every 12 months",
"reference": "§1798.130(a)(5)", "severity": "medium"},
{"key": "prior_versions_archived", "name": "Prior versions archived",
"detail_pass": "Prior policy versions are archived",
"detail_fail": "Best practice to maintain archive of prior policy versions",
"reference": "Best practice", "severity": "low"}
]
CONSUMER_RIGHTS_CHECKS = [
{"key": "request_intake_mechanism", "name": "Request intake mechanism",
"detail_pass": "Consumer request intake mechanism exists",
"detail_fail": "Must provide at least two methods for submitting requests",
"reference": "§1798.130(a)(1)", "severity": "critical"},
{"key": "toll_free_number", "name": "Toll-free number",
"detail_pass": "Toll-free number available for requests",
"detail_fail": "Must provide toll-free number (unless online-only business)",
"reference": "§1798.130(a)(1)(A)", "severity": "high"},
{"key": "online_request_form", "name": "Online request form",
"detail_pass": "Online request form available",
"detail_fail": "Should provide online request submission mechanism",
"reference": "§1798.130(a)(1)", "severity": "high"},
{"key": "identity_verification_process", "name": "Identity verification",
"detail_pass": "Identity verification process established",
"detail_fail": "Must verify identity of consumers making requests",
"reference": "§1798.140(ak)", "severity": "critical"},
{"key": "two_data_point_verification", "name": "Two-point verification",
"detail_pass": "Two data point verification for standard requests",
"detail_fail": "Standard requests require matching 2+ data points",
"reference": "CCPA Regulations §999.325", "severity": "high"},
{"key": "three_data_point_for_sensitive", "name": "Three-point for sensitive",
"detail_pass": "Three data point verification for specific PI requests",
"detail_fail": "Requests for specific pieces of PI require 3+ data point match",
"reference": "CCPA Regulations §999.325", "severity": "high"},
{"key": "authorized_agent_process", "name": "Authorized agent process",
"detail_pass": "Authorized agent request process exists",
"detail_fail": "Must allow authorized agents to submit requests on consumer behalf",
"reference": "§1798.135(c)", "severity": "medium"},
{"key": "acknowledgment_within_10_days", "name": "10-day acknowledgment",
"detail_pass": "Requests acknowledged within 10 business days",
"detail_fail": "Must confirm receipt within 10 business days",
"reference": "§1798.130(a)(1)", "severity": "high"},
{"key": "fulfillment_within_45_days", "name": "45-day fulfillment",
"detail_pass": "Requests fulfilled within 45 calendar days",
"detail_fail": "Must fulfill requests within 45 calendar days of receipt",
"reference": "§1798.130(a)(2)", "severity": "critical"},
{"key": "extension_process_with_notice", "name": "Extension process",
"detail_pass": "Extension process with consumer notice exists",
"detail_fail": "May extend 45 additional days with notice to consumer",
"reference": "§1798.130(a)(2)", "severity": "medium"},
{"key": "right_to_know_implemented", "name": "Right to Know operational",
"detail_pass": "Right to Know request fulfillment operational",
"detail_fail": "Must implement Right to Know (categories and specific pieces)",
"reference": "§1798.100, §1798.110", "severity": "critical"},
{"key": "right_to_delete_implemented", "name": "Right to Delete operational",
"detail_pass": "Right to Delete request fulfillment operational",
"detail_fail": "Must implement Right to Delete and notify service providers",
"reference": "§1798.105", "severity": "critical"},
{"key": "right_to_opt_out_implemented", "name": "Right to Opt-Out operational",
"detail_pass": "Right to Opt-Out of sale/sharing operational",
"detail_fail": "Must implement opt-out of sale and sharing of PI",
"reference": "§1798.120", "severity": "critical"},
{"key": "right_to_correct_implemented", "name": "Right to Correct operational",
"detail_pass": "Right to Correct inaccurate PI operational (CPRA)",
"detail_fail": "Must implement Right to Correct (CPRA requirement)",
"reference": "§1798.106", "severity": "high"},
{"key": "right_to_limit_spi_implemented", "name": "Right to Limit SPI operational",
"detail_pass": "Right to Limit SPI Use operational (CPRA)",
"detail_fail": "Must implement Right to Limit Use of SPI (CPRA)",
"reference": "§1798.121", "severity": "high"},
{"key": "right_to_portability_implemented", "name": "Right to Portability operational",
"detail_pass": "Right to Data Portability operational (CPRA)",
"detail_fail": "Must implement Right to Data Portability in machine-readable format",
"reference": "§1798.130", "severity": "medium"},
{"key": "non_discrimination_policy", "name": "Non-discrimination enforced",
"detail_pass": "Non-discrimination policy for rights exercise enforced",
"detail_fail": "Must not discriminate against consumers who exercise rights",
"reference": "§1798.125", "severity": "high"},
{"key": "appeal_process", "name": "Appeal process",
"detail_pass": "Appeal process for denied requests exists",
"detail_fail": "Should provide appeal mechanism for denied or partial requests",
"reference": "Best practice", "severity": "low"},
{"key": "request_tracking_system", "name": "Request tracking system",
"detail_pass": "Request tracking system in place",
"detail_fail": "Should implement tracking for request SLAs and compliance reporting",
"reference": "Best practice", "severity": "medium"},
{"key": "staff_trained_on_handling", "name": "Staff trained",
"detail_pass": "Staff trained on consumer request handling",
"detail_fail": "Staff handling requests must be informed of CCPA requirements",
"reference": "§1798.130(a)(6)", "severity": "high"}
]
OPT_OUT_CHECKS = [
{"key": "do_not_sell_or_share_link", "name": "Do Not Sell/Share link",
"detail_pass": "'Do Not Sell or Share My Personal Information' link exists",
"detail_fail": "Must provide 'Do Not Sell or Share My Personal Information' link",
"reference": "§1798.135(a)(1)", "severity": "critical"},
{"key": "link_on_homepage", "name": "Link on homepage",
"detail_pass": "Opt-out link on homepage",
"detail_fail": "Link must be on homepage or clearly accessible",
"reference": "§1798.135(a)(1)", "severity": "critical"},
{"key": "link_clear_and_conspicuous", "name": "Link clear and conspicuous",
"detail_pass": "Opt-out link is clear and conspicuous",
"detail_fail": "Link must be clear, conspicuous, and not buried in footer",
"reference": "§1798.135(a)(1)", "severity": "high"},
{"key": "limit_use_of_spi_link", "name": "Limit SPI Use link",
"detail_pass": "'Limit the Use of My Sensitive Personal Information' link exists",
"detail_fail": "Must provide 'Limit the Use of My Sensitive Personal Information' link (CPRA)",
"reference": "§1798.135(a)(2)", "severity": "critical"},
{"key": "spi_link_on_homepage", "name": "SPI link on homepage",
"detail_pass": "SPI limit link on homepage",
"detail_fail": "SPI limit link must be on homepage (CPRA)",
"reference": "§1798.135(a)(2)", "severity": "high"},
{"key": "global_privacy_control_honored", "name": "GPC honored",
"detail_pass": "Global Privacy Control browser signal is honored",
"detail_fail": "Must treat GPC signal as valid opt-out request",
"reference": "§1798.135(b)(1)", "severity": "critical"},
{"key": "gpc_technical_detection", "name": "GPC technical detection",
"detail_pass": "GPC signal technically detected (Sec-GPC header / JS API)",
"detail_fail": "Must detect Sec-GPC:1 header or navigator.globalPrivacyControl",
"reference": "§1798.135(b)(1)", "severity": "high"},
{"key": "cookie_consent_banner", "name": "Cookie consent banner",
"detail_pass": "Cookie consent banner implemented",
"detail_fail": "Should implement cookie consent for non-essential cookies",
"reference": "Best practice / §1798.135", "severity": "medium"},
{"key": "cookie_categories_defined", "name": "Cookie categories defined",
"detail_pass": "Cookie categories (necessary, functional, analytics, ads) defined",
"detail_fail": "Should categorize cookies for granular consent",
"reference": "Best practice", "severity": "low"},
{"key": "opt_out_preference_signal_respected", "name": "Opt-out preference signals",
"detail_pass": "Opt-out preference signals respected",
"detail_fail": "Must respect opt-out preference signals per CPPA regulations",
"reference": "§1798.135(b)", "severity": "high"},
{"key": "no_dark_patterns", "name": "No dark patterns",
"detail_pass": "No dark patterns in opt-out UX",
"detail_fail": "Must not use dark patterns that subvert consumer opt-out choices",
"reference": "§1798.140(l)", "severity": "high"},
{"key": "opt_out_easy_as_opt_in", "name": "Opt-out ease parity",
"detail_pass": "Opt-out process as easy as opt-in",
"detail_fail": "Opt-out must be as easy as opting in (symmetric choice)",
"reference": "§1798.135(b)(1)", "severity": "medium"},
{"key": "minor_opt_in_required_under_16", "name": "Minor opt-in (under 16)",
"detail_pass": "Opt-in required for consumers under 16 before selling PI",
"detail_fail": "Must obtain opt-in consent before selling PI of minors under 16",
"reference": "§1798.120(c)", "severity": "high"},
{"key": "parental_consent_under_13", "name": "Parental consent (under 13)",
"detail_pass": "Parental consent obtained for consumers under 13",
"detail_fail": "Must obtain parental/guardian consent for children under 13",
"reference": "§1798.120(c)", "severity": "high"}
]
SPI_CHECKS = [
{"key": "spi_categories_identified", "name": "SPI categories identified",
"detail_pass": "Sensitive PI categories identified and documented",
"detail_fail": "Must identify all SPI categories per §1798.140(ae)",
"reference": "§1798.140(ae)", "severity": "critical"},
{"key": "ssn_protected", "name": "SSN protected",
"detail_pass": "Social Security numbers protected with enhanced controls",
"detail_fail": "SSN is SPI — requires enhanced protection and use limitation",
"reference": "§1798.140(ae)(1)", "severity": "critical"},
{"key": "financial_accounts_protected", "name": "Financial accounts protected",
"detail_pass": "Financial account information protected",
"detail_fail": "Financial account numbers with access credentials are SPI",
"reference": "§1798.140(ae)(3)", "severity": "critical"},
{"key": "precise_geolocation_controlled", "name": "Precise geolocation controlled",
"detail_pass": "Precise geolocation data controlled",
"detail_fail": "Precise geolocation (within 1,850 ft) is SPI requiring controls",
"reference": "§1798.140(ae)(4)", "severity": "high"},
{"key": "racial_ethnic_data_controlled", "name": "Racial/ethnic data controlled",
"detail_pass": "Racial or ethnic origin data controlled",
"detail_fail": "Racial or ethnic origin is SPI under CPRA",
"reference": "§1798.140(ae)(5)", "severity": "high"},
{"key": "biometric_data_controlled", "name": "Biometric data controlled",
"detail_pass": "Biometric data for identification controlled",
"detail_fail": "Biometric data used for identification is SPI",
"reference": "§1798.140(ae)(8)", "severity": "high"},
{"key": "health_data_controlled", "name": "Health data controlled",
"detail_pass": "Health information controlled",
"detail_fail": "Health information is SPI requiring enhanced controls",
"reference": "§1798.140(ae)(9)", "severity": "high"},
{"key": "sexual_orientation_data_controlled", "name": "Sex life/orientation controlled",
"detail_pass": "Sex life or sexual orientation data controlled",
"detail_fail": "Sex life or sexual orientation data is SPI",
"reference": "§1798.140(ae)(10)", "severity": "high"},
{"key": "email_text_content_controlled", "name": "Email/text content controlled",
"detail_pass": "Email and text message content controlled",
"detail_fail": "Contents of mail, email, text messages are SPI (unless intended recipient)",
"reference": "§1798.140(ae)(7)", "severity": "medium"},
{"key": "login_credentials_protected", "name": "Login credentials protected",
"detail_pass": "Account login credentials protected",
"detail_fail": "Username with password or security question/answer is SPI",
"reference": "§1798.140(ae)(2)", "severity": "critical"},
{"key": "genetic_data_controlled", "name": "Genetic data controlled",
"detail_pass": "Genetic data controlled",
"detail_fail": "Genetic data is SPI under CPRA",
"reference": "§1798.140(ae)(6)", "severity": "high"},
{"key": "spi_use_limited_to_disclosed_purposes", "name": "SPI use limited",
"detail_pass": "SPI use limited to disclosed purposes",
"detail_fail": "Must limit SPI use to purposes disclosed at collection or consumer-directed",
"reference": "§1798.121(a)", "severity": "critical"},
{"key": "spi_processing_minimized", "name": "SPI processing minimized",
"detail_pass": "SPI processing minimized to what is necessary",
"detail_fail": "Must minimize SPI processing to what is reasonably necessary",
"reference": "§1798.100(c)", "severity": "high"}
]
TECHNICAL_SAFEGUARD_CHECKS = [
{"key": "encryption_at_rest", "name": "Encryption at rest",
"detail_pass": "PI encrypted at rest",
"detail_fail": "Must implement reasonable security including encryption at rest",
"reference": "§1798.150(a)(1)", "severity": "critical"},
{"key": "encryption_in_transit", "name": "Encryption in transit",
"detail_pass": "PI encrypted in transit",
"detail_fail": "Must encrypt PI in transit (TLS/HTTPS)",
"reference": "§1798.150(a)(1)", "severity": "critical"},
{"key": "access_controls_implemented", "name": "Access controls",
"detail_pass": "Access controls for PI implemented",
"detail_fail": "Must implement access controls to limit PI access",
"reference": "§1798.150(a)(1)", "severity": "critical"},
{"key": "role_based_access", "name": "Role-based access",
"detail_pass": "Role-based access control for PI",
"detail_fail": "Should implement RBAC for PI access based on need-to-know",
"reference": "Best practice", "severity": "high"},
{"key": "mfa_for_pi_access", "name": "MFA for PI access",
"detail_pass": "Multi-factor authentication for PI system access",
"detail_fail": "Should require MFA for accessing PI systems",
"reference": "Best practice", "severity": "medium"},
{"key": "audit_logging", "name": "Audit logging",
"detail_pass": "Audit logging for PI access and modifications",
"detail_fail": "Should log access and modifications to PI for accountability",
"reference": "Best practice", "severity": "high"},
{"key": "data_loss_prevention", "name": "Data loss prevention",
"detail_pass": "Data loss prevention measures in place",
"detail_fail": "Should implement DLP to prevent unauthorized PI disclosure",
"reference": "Best practice", "severity": "medium"},
{"key": "incident_response_plan", "name": "Incident response plan",
"detail_pass": "Incident response plan documented",
"detail_fail": "Must have incident response plan for data breaches",
"reference": "§1798.150", "severity": "critical"},
{"key": "breach_notification_process", "name": "Breach notification",
"detail_pass": "Breach notification process established",
"detail_fail": "Must notify AG and consumers of breaches per Cal. Civ. Code §1798.82",
"reference": "Cal. Civ. Code §1798.82", "severity": "critical"},
{"key": "vulnerability_management", "name": "Vulnerability management",
"detail_pass": "Vulnerability management program in place",
"detail_fail": "Should implement vulnerability scanning and patching program",
"reference": "Best practice", "severity": "high"},
{"key": "penetration_testing", "name": "Penetration testing",
"detail_pass": "Regular penetration testing conducted",
"detail_fail": "Should conduct regular penetration testing of PI systems",
"reference": "Best practice", "severity": "medium"},
{"key": "security_awareness_training", "name": "Security training",
"detail_pass": "Security awareness training for PI handlers",
"detail_fail": "Should train staff on security practices for handling PI",
"reference": "§1798.130(a)(6)", "severity": "high"},
{"key": "vendor_security_assessments", "name": "Vendor security assessments",
"detail_pass": "Vendor security assessments conducted",
"detail_fail": "Should assess security practices of vendors processing PI",
"reference": "Best practice", "severity": "medium"},
{"key": "data_backup_and_recovery", "name": "Backup and recovery",
"detail_pass": "Data backup and recovery procedures in place",
"detail_fail": "Should implement backup and recovery for PI systems",
"reference": "Best practice", "severity": "medium"}
]
SERVICE_PROVIDER_CHECKS = [
{"key": "sp_agreements_in_place", "name": "SP agreements in place",
"detail_pass": "Service provider agreements executed",
"detail_fail": "Must have written agreements with all service providers",
"reference": "§1798.140(ag)", "severity": "critical"},
{"key": "agreements_restrict_pi_use", "name": "PI use restricted in agreements",
"detail_pass": "Agreements restrict PI use to specified purposes",
"detail_fail": "SP agreements must restrict PI use to contracted purposes",
"reference": "§1798.140(ag)(1)(A)", "severity": "critical"},
{"key": "agreements_require_deletion", "name": "Deletion clause",
"detail_pass": "Agreements require PI deletion upon request or contract end",
"detail_fail": "SP agreements must include PI deletion obligations",
"reference": "§1798.105(c)", "severity": "high"},
{"key": "agreements_allow_audits", "name": "Audit rights",
"detail_pass": "Agreements include audit rights",
"detail_fail": "Agreements should allow compliance audits of service providers",
"reference": "Best practice / CPRA", "severity": "medium"},
{"key": "contractor_agreements_in_place", "name": "Contractor agreements",
"detail_pass": "Contractor agreements in place (CPRA)",
"detail_fail": "Must have written agreements with contractors (CPRA distinction)",
"reference": "§1798.140(j)", "severity": "high"},
{"key": "contractor_certification_obtained", "name": "Contractor certification",
"detail_pass": "Contractors certify understanding of CCPA obligations",
"detail_fail": "Contractors must certify they understand and will comply with CCPA",
"reference": "§1798.140(j)(1)", "severity": "high"},
{"key": "third_party_data_sharing_documented", "name": "Third-party sharing documented",
"detail_pass": "Third-party data sharing documented",
"detail_fail": "Must document all third-party PI sharing arrangements",
"reference": "§1798.115", "severity": "high"},
{"key": "third_party_opt_out_honored", "name": "Third-party opt-out honored",
"detail_pass": "Consumer opt-outs communicated to third parties",
"detail_fail": "Must communicate opt-out requests to third parties receiving PI",
"reference": "§1798.120(b)", "severity": "critical"},
{"key": "data_processing_agreements", "name": "DPAs in place",
"detail_pass": "Data processing agreements executed",
"detail_fail": "Should have DPAs covering CCPA requirements",
"reference": "Best practice", "severity": "medium"},
{"key": "sp_security_requirements", "name": "SP security requirements",
"detail_pass": "Security requirements specified for service providers",
"detail_fail": "Agreements should specify security requirements for PI",
"reference": "Best practice", "severity": "medium"},
{"key": "sp_breach_notification_clause", "name": "SP breach notification",
"detail_pass": "Breach notification clauses in SP agreements",
"detail_fail": "SP agreements should require prompt breach notification",
"reference": "Best practice", "severity": "high"},
{"key": "subprocessor_management", "name": "Subprocessor management",
"detail_pass": "Subprocessor management process in place",
"detail_fail": "Should manage and approve subprocessors of service providers",
"reference": "Best practice", "severity": "medium"}
]
RISK_ASSESSMENT_CHECKS = [
{"key": "annual_cybersecurity_audit_planned", "name": "Annual cybersecurity audit",
"detail_pass": "Annual cybersecurity audit planned or conducted",
"detail_fail": "CPRA requires annual cybersecurity audits for significant risk processing",
"reference": "§1798.185(a)(15)(B)", "severity": "high"},
{"key": "risk_assessment_for_processing", "name": "Processing risk assessment",
"detail_pass": "Risk assessments conducted for processing activities",
"detail_fail": "CPRA requires risk assessments for processing that presents significant risk",
"reference": "§1798.185(a)(15)(A)", "severity": "high"},
{"key": "data_inventory_maintained", "name": "Data inventory",
"detail_pass": "Comprehensive PI data inventory maintained",
"detail_fail": "Must maintain inventory of all PI categories collected and processed",
"reference": "§1798.100(a)", "severity": "critical"},
{"key": "data_flow_mapping_current", "name": "Data flow mapping",
"detail_pass": "Data flow mapping is current",
"detail_fail": "Should map PI flows from collection through sharing/deletion",
"reference": "Best practice", "severity": "high"},
{"key": "retention_schedule_documented", "name": "Retention schedule",
"detail_pass": "Data retention schedule documented",
"detail_fail": "Must document retention periods; must not retain PI longer than necessary (CPRA)",
"reference": "§1798.100(a)(3)", "severity": "high"},
{"key": "cross_border_transfers_documented", "name": "Cross-border transfers",
"detail_pass": "Cross-border data transfers documented",
"detail_fail": "Should document cross-border PI transfers and safeguards",
"reference": "Best practice", "severity": "medium"},
{"key": "automated_decision_making_disclosed", "name": "Automated decisions disclosed",
"detail_pass": "Automated decision-making technology disclosed",
"detail_fail": "CPRA may require disclosure of automated decision-making use",
"reference": "§1798.185(a)(16)", "severity": "medium"},
{"key": "data_minimization_practiced", "name": "Data minimization",
"detail_pass": "Data minimization practiced (CPRA)",
"detail_fail": "Must not collect PI beyond what is reasonably necessary (CPRA)",
"reference": "§1798.100(c)", "severity": "high"},
{"key": "purpose_limitation_enforced", "name": "Purpose limitation",
"detail_pass": "Purpose limitation enforced (CPRA)",
"detail_fail": "Must not use PI for purposes incompatible with disclosed purposes (CPRA)",
"reference": "§1798.100(c)", "severity": "high"}
]
def run_assessment(data: Dict) -> Dict:
"""Run full CCPA/CPRA compliance assessment."""
results = {
"assessment_date": datetime.now().isoformat(),
"framework": "CCPA/CPRA",
"organization": data.get("organization", {}).get("name", "Unknown"),
"categories": {},
"overall_score": 0.0,
"overall_status": "",
"summary": {
"critical_findings": [],
"high_findings": [],
"recommendations": []
}
}
# Run all category checks
app_score, app_findings = check_applicability(data)
results["categories"]["applicability"] = {
"score": round(app_score, 1),
"findings": app_findings
}
category_checks = [
("privacy_policy", "privacy_policy", PRIVACY_POLICY_CHECKS),
("consumer_rights", "consumer_rights", CONSUMER_RIGHTS_CHECKS),
("opt_out_mechanisms", "opt_out_mechanisms", OPT_OUT_CHECKS),
("sensitive_personal_information", "sensitive_personal_information", SPI_CHECKS),
("technical_safeguards", "technical_safeguards", TECHNICAL_SAFEGUARD_CHECKS),
("service_providers", "service_providers", SERVICE_PROVIDER_CHECKS),
("risk_assessments", "risk_assessments", RISK_ASSESSMENT_CHECKS)
]
for cat_name, section_key, checks in category_checks:
score, findings = check_boolean_section(data, section_key, checks)
results["categories"][cat_name] = {
"score": round(score, 1),
"findings": findings
}
# Calculate weighted overall score
total_weight = sum(CATEGORY_WEIGHTS.values())
weighted_sum = 0
for cat, weight in CATEGORY_WEIGHTS.items():
cat_score = results["categories"].get(cat, {}).get("score", 0)
weighted_sum += cat_score * weight
results["overall_score"] = round(weighted_sum / total_weight, 1)
# Determine status
score = results["overall_score"]
if score >= 90:
results["overall_status"] = "Compliant"
elif score >= 70:
results["overall_status"] = "Substantially Compliant"
elif score >= 50:
results["overall_status"] = "Partially Compliant"
else:
results["overall_status"] = "Non-Compliant"
# Collect critical and high findings
for cat_name, cat_data in results["categories"].items():
for finding in cat_data.get("findings", []):
if finding["status"] == "fail":
entry = {
"category": cat_name,
"check": finding["check"],
"detail": finding["detail"],
"reference": finding["reference"]
}
if finding.get("severity") == "critical":
results["summary"]["critical_findings"].append(entry)
elif finding.get("severity") == "high":
results["summary"]["high_findings"].append(entry)
# Generate recommendations
if results["summary"]["critical_findings"]:
results["summary"]["recommendations"].append(
"Address all critical findings immediately — these represent direct "
"regulatory violations exposing the organization to enforcement action "
"($2,500-$7,500 per violation)."
)
if results["categories"].get("opt_out_mechanisms", {}).get("score", 0) < 50:
results["summary"]["recommendations"].append(
"Implement 'Do Not Sell or Share My Personal Information' and "
"'Limit the Use of My Sensitive Personal Information' links on homepage."
)
if results["categories"].get("consumer_rights", {}).get("score", 0) < 70:
results["summary"]["recommendations"].append(
"Establish consumer rights request intake, verification, and "
"fulfillment processes with 10-day acknowledgment and 45-day completion SLAs."
)
if results["categories"].get("privacy_policy", {}).get("score", 0) < 70:
results["summary"]["recommendations"].append(
"Update privacy policy to include all required CCPA/CPRA disclosures "
"including PI categories, sources, purposes, and consumer rights."
)
if results["categories"].get("technical_safeguards", {}).get("score", 0) < 70:
results["summary"]["recommendations"].append(
"Implement reasonable security measures (encryption, access controls, "
"incident response) to reduce private right of action exposure."
)
return results
def format_text_report(results: Dict) -> str:
"""Format results as human-readable text report."""
lines = []
lines.append("=" * 70)
lines.append("CCPA/CPRA COMPLIANCE ASSESSMENT REPORT")
lines.append("=" * 70)
lines.append(f"Organization: {results['organization']}")
lines.append(f"Assessment Date: {results['assessment_date']}")
lines.append(f"Overall Score: {results['overall_score']}/100")
lines.append(f"Status: {results['overall_status']}")
lines.append("")
# Category scores
lines.append("-" * 70)
lines.append("CATEGORY SCORES")
lines.append("-" * 70)
for cat_name, cat_data in results["categories"].items():
display_name = cat_name.replace("_", " ").title()
score = cat_data["score"]
bar_len = int(score / 5)
bar = "#" * bar_len + "." * (20 - bar_len)
lines.append(f" {display_name:<40} [{bar}] {score:>5.1f}")
lines.append("")
# Critical findings
critical = results["summary"]["critical_findings"]
if critical:
lines.append("-" * 70)
lines.append(f"CRITICAL FINDINGS ({len(critical)})")
lines.append("-" * 70)
for f in critical:
lines.append(f" [CRITICAL] {f['check']}")
lines.append(f" Category: {f['category'].replace('_', ' ').title()}")
lines.append(f" Detail: {f['detail']}")
lines.append(f" Ref: {f['reference']}")
lines.append("")
# High findings
high = results["summary"]["high_findings"]
if high:
lines.append("-" * 70)
lines.append(f"HIGH FINDINGS ({len(high)})")
lines.append("-" * 70)
for f in high:
lines.append(f" [HIGH] {f['check']}")
lines.append(f" Category: {f['category'].replace('_', ' ').title()}")
lines.append(f" Detail: {f['detail']}")
lines.append(f" Ref: {f['reference']}")
lines.append("")
# Recommendations
recs = results["summary"]["recommendations"]
if recs:
lines.append("-" * 70)
lines.append("RECOMMENDATIONS")
lines.append("-" * 70)
for i, rec in enumerate(recs, 1):
lines.append(f" {i}. {rec}")
lines.append("")
lines.append("=" * 70)
lines.append("End of Report")
lines.append("=" * 70)
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(
description="CCPA/CPRA Compliance Checker — evaluates organizational "
"readiness against California privacy law requirements."
)
parser.add_argument(
"--input", "-i",
help="Path to JSON file with organization compliance profile"
)
parser.add_argument(
"--template", "-t",
action="store_true",
help="Output a blank compliance profile template (JSON)"
)
parser.add_argument(
"--output", "-o",
help="Path to write the assessment report"
)
parser.add_argument(
"--json", "-j",
action="store_true",
help="Output results as JSON (default is human-readable text)"
)
args = parser.parse_args()
if args.template:
print(json.dumps(TEMPLATE, indent=2))
return
if not args.input:
parser.error("--input is required (or use --template to generate a blank profile)")
try:
with open(args.input, "r") as f:
data = json.load(f)
except FileNotFoundError:
print(f"Error: File not found: {args.input}", file=sys.stderr)
sys.exit(1)
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON in {args.input}: {e}", file=sys.stderr)
sys.exit(1)
results = run_assessment(data)
if args.json:
output = json.dumps(results, indent=2)
else:
output = format_text_report(results)
if args.output:
with open(args.output, "w") as f:
f.write(output)
print(f"Report written to {args.output}")
else:
print(output)
if __name__ == "__main__":
main()
Related skills
FAQ
How many PI categories does it map?
It maps all 11 CCPA personal information categories and identifies sensitive personal information per CPRA definitions.
What does the compliance checker output?
An overall compliance score from 0-100, per-category pass/fail/partial status, prioritized findings with regulatory references, and remediation recommendations.