Skip to main content

CCPA Compliance Implementation: Opt-out choice is honored across the full consumer journey

A guide on how to ensure CCPA opt-out persistence with ObservePoint. Validate that "Do Not Sell or Share" choices follow the user across the entire journey and prevent data leakage.

Written by Luiza Gircoveanu

Overview

This check extends the single-page opt-out validation into a full, multi-step consumer journey (landing page through category, product, and cart pages, for example) confirming the opt-out state persists through every subsequent step rather than resetting or leaking partway through.

Note: This guide is provided for informational purposes only and does not constitute legal advice. Consult qualified legal counsel regarding your organization's specific CCPA/CPRA compliance obligations

Why is it important

An opt-out is not a per-page signal; once selected, CCPA requires it to persist across the entire session and across subsequent visits from the same browser. A CMP can pass a single-page Reject-All test and still leak on a later page in the journey if, for example, a single-page-application route change re-initializes a tag before checking the stored consent state, or a third-party checkout iframe doesn't inherit the parent page's consent context.

Implementation

  1. Build a Journey that opts out via the CMP as its first step, then navigates a representative multi-step flow (landing, category, product, and cart/checkout pages).

  2. Create a Rule with a WHEN condition matching your advertising/sharing tag accounts (by tag ID or a regex on the request/tag name) and an EXPECT assertion that none of them fire, then attach it via update_journey_rules at the action level to every step after the opt-out (landing, category, product, and cart) not just journey-wide, since a journey-level rule would average across steps and could mask a leak that appears on only one of them.

  3. Run the Journey and pull get_journey_run_rule_results for the per-step pass/fail verdict, then use analyze_journey_tags on the same run to see exactly which tag reappeared and on which step if a rule failed.

Remediation

When a later journey step reintroduces a blocked tag, check whether the page uses client-side routing that bypasses the tag manager's normal page-load listener — SPA route changes often require an explicit consent re-check on each virtual pageview rather than relying on the original page-load consent gate. For third-party iframes or embedded checkout flows, confirm the embedded component reads the parent's consent signal (via postMessage, a shared cookie or the CMP vendor's cross-domain consent API) rather than defaulting to an ungated state. Re-run the full Journey after each fix and confirm every per-step Rule now passes in get_journey_run_rule_results, then schedule the Journey to run on your daily critical-page cadence given how easily a single route or checkout change can reintroduce the leak.

Conclusion

Single-page opt-out checks catch the most obvious violations, but only a full-journey Journey test catches the routing and third-party-iframe leaks that are invisible from a single page load. This is the check that proves the opt-out actually holds for a real user, not just a test page.

Did this answer your question?