Back to rules

CCPA Opt-Out of Sale/Sharing Honored

consistencycritical

Validates that when a consumer has opted out of the sale or sharing of their personal information, no records for that consumer appear in sale or sharing transaction tables after the opt-out date. This ensures businesses honor the consumer's right to say no to data monetization.

v1.0.0by dqhub439 downloads4.7 (31)
cprasaleprivacycomplianceccpaopt-outsharingconsumer-rights
Try This Rule

Parameters

column_namestringrequired

The column containing email addresses

thresholdfloatdefault: 0.99

Minimum fraction of valid emails (0.0 to 1.0)

Compliance Mapping

CCPACal. Civ. Code 1798.120 — Right to Opt-Out of Sale

VCDPAVa. Code 59.1-577(A)(5) — Right to Opt Out

CPRACal. Civ. Code 1798.120/1798.121 — Right to Opt-Out of Sale and Sharing

CPAC.R.S. 6-1-1306(1)(a)(I) — Right to Opt Out

Install

soda
checks for {{table_name}}:
  - invalid_percent({{column_name}}) < {{(1 - threshold) * 100}}:
      valid regex: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
dbt
{% test valid_email(model, column_name) %}
select {{ column_name }}
from {{ model }}
where {{ column_name }} not regexp '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
{% endtest %}
sql
SELECT COUNT(*) as total,
  SUM(CASE WHEN {{column_name}} REGEXP
    '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
    THEN 1 ELSE 0 END) as valid
FROM {{table_name}}
Great Expectations
{
  "expectation_type": "expect_column_values_to_match_regex",
  "kwargs": {
    "column": "{{column_name}}",
    "regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
    "mostly": {{threshold}}
  }
}
spark
from pyspark.sql.functions import col
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
invalid = df.filter(~col("{{column_name}}").rlike(pattern)).count()

Test Data

Passing Examples

idvalue
1alice@example.com
2bob.smith@company.co.uk
3charlie+tag@domain.org

Failing Examples

idvalue
1not-an-email
2@missing-local.com
3spaces in@email.com

CLI

Terminal
npx dqhub install ccpa-opt-out-honored --format soda --table YOUR_TABLE
npx dqhub install ccpa-opt-out-honored --format dbt --model YOUR_MODEL
npx dqhub install ccpa-opt-out-honored --format sql --dialect snowflake