Skip to content

server

2.8.0

Minor Changes

  • a580774: Add POST /v3/projects/:id/transfer, which moves a project to another organization after verifying the caller belongs to the target (via the Auth0 Management API, failing closed if it can't be verified). PATCH /v3/projects/:id is now rename-only — display_name is required and org_id is no longer accepted there, so the cross-organization move has a single authorized path.
  • 2ebb655: Add project-scoped scan schedules on /v3/projects/:id/schedule and a Schedule scan dialog on the Cookies page. Scheduled runs now keep the project UUID so they show up in project scan history.

Patch Changes

  • fecdc78: Drive the custom-site "Powered by Consent Pro" mark from the project's own config.

    The mark was decided entirely by plan tier: the served script inlined window.fs_consent_pro_attribution = true for free-tier sites and nothing else ever set it, so a paid custom site never showed it and the app's "Hide Consent Pro logo" toggle changed nothing outside the in-app preview. Preview links were worse — applyStored reassigns the global from the fetched payload, which never carries attribution, so a preview dropped the mark even on the free tier.

    consentpro-types

    • ConsentProV2RuntimeConfiguration gains hideBranding, carried through to the sanitized client config.

    server

    • projectConfigToRuntime maps banner_settings.hide_branding onto it, so it ships with every publish and with the preview config.

    consentpro-v2

    • Custom sites resolve showAttribution from that config, defaulting to showing the mark. The free tier's license-derived global still wins, so a free site cannot switch it off.
  • 8384efa: Show a placeholder overlay on iframes blocked for want of consent on custom (non-Webflow) sites.

    Custom sites have no pasted fs-consent-element="placeholder" markup, so a blocked embed simply lost its src and rendered as a blank box. The overlay now ships as a web component that core/v2 swaps into the blocked iframe itself.

    web-components

    • New <consentpro-placeholder> custom element, built as its own placeholder.js CDN bundle. Like every other component in this package, its props are plain JS properties observed as no attribute, and its buttons dispatch bubbling, composed consentpro:open-preferences / consentpro:allow events.

    consentpro-dictionary

    • getConsentCopy returns a placeholder block (message, preferencesText, acceptAllText), so the overlay is localized like every other component.

    server

    • GET /v2/cdn/web-components/placeholder.js serves the new bundle, and copy.json carries the placeholder strings.

    consentpro-v2

    • new/custom-site/placeholder.ts builds the blocked iframe's document as a string, which the existing blob path swaps into the iframe's src. It is self-contained: the CDN module that registers the element, plus the script that waits for that registration, creates the element and assigns the copy as JS properties. No markup is parsed, mutated or serialized on the way, and the copy is escaped into the script rather than interpolated into HTML.
    • That script tag is pinned with the build-time sha384 hash, so placeholder.js is now SRI-checked like the other component bundles.
    • Blocked iframes wire the overlay's events through custom-site/events.ts: the document is a same-origin blob:, so the component's consentpro:* events reach the consent-state layer directly.
    • A blocked iframe's own sandbox is stashed and dropped while the placeholder is shown, then restored verbatim before the original URL loads again. It applies to the untrusted embed, not to our placeholder, and without allow-scripts it kept the overlay from ever rendering.
    • iframe-blocked now fires once per blocked iframe, carrying the embed's URL. Re-rendering a placeholder whose copy arrived late no longer emits a second event whose src had already been replaced.
  • d3e426d: Link the custom-site banner to the project's own privacy policy, or show no link at all.

    The custom-platform banner always rendered a dead <a href="#">Privacy Policy</a>: the project's privacy-policy URL never reached the runtime.

    consentpro-dictionary

    • getConsentCopy returns messageHtmlWithoutPrivacyLink alongside messageHtml — the same message with the whole privacy sentence removed, cut from the tokenized template so every locale ends on its own sentence terminator. messageHtml is unchanged.

    server / consentpro-types

    • privacy_page_url maps to legal.privacyPolicyUrl, and sanitizeConfigForClient publishes that one field. cookiePolicyUrl and contactEmail stay server-side.

    consentpro-v2

    • The custom-site banner points the anchor at the configured URL (normalized through new URL() and restricted to http(s), opened in a new tab), and drops the privacy sentence when no URL is configured.
  • 28b754d: Stop putting the account email address in Finsweet Accounts navigation URLs. The Designer extension now links out with a short-lived opaque account reference, which the Consent Pro server resolves before redirecting. The destination journey is unchanged.

  • d7331e4: Style the preferences toggle and the dialog backdrop from the web app.

    web-app

    • The Open preferences colours card now carries Toggle Inactive Track, Toggle Active Track (the former "Preferences Checkbox"), Toggle Circular Handle and Preferences Overlay. Left on their defaults the columns stay null, so an existing banner looks exactly as before.
    • ColorField takes an alpha prop: an opacity track under the hue slider, a checkerboard behind every swatch, and a hex field that accepts #rrggbbaa. Only the overlay opts in — a colour that paints a surface has nothing to be translucent over.
    • The overlay starts at no backdrop (#00000000). Choosing a colour on a transparent field lands at 20% opacity rather than staying invisible; the opacity track can still take it back to nothing.

    web-components

    • ConsentPreferencesDialog's backdrop default drops from 10% black to transparent: a dialog washes the page only where a site asks for it. The backdrop box is unchanged otherwise, so click-to-close still works, and any site setting --consentpro-color-overlay is unaffected.

    server / consentpro-types

    • checkbox_inactive_color, checkbox_handle_color and preferences_overlay_color are read, validated and saved on banner_settings and banner_instances, and published as checkboxInactive, checkboxHandle and preferencesOverlay. The overlay column validates #rrggbb or #rrggbbaa; the rest stay six digits.

    consentpro-v2

    • Maps those to --consentpro-color-toggle-off, --consentpro-color-toggle-thumb and --consentpro-color-overlay. The handle keeps whatever colour is picked in both switch states — nothing recolours it from the track any more.
  • 29c6284: Authorize preview config with a server-side secret.

    POST /v3/projects/:id/debugger-token signed with DEBUGGER_TOKEN_SECRET, a hardcoded constant that ships inside the Designer extension bundle. That was fine while its only job was opening the debugger widget, but the preview branch of GET /v3/cdn/config/:siteId.json — which serves a project's latest saved config, banner copy and full tracker inventory included — made it forgeable authorization for any site id, and site ids are public markup.

    • The minted token now carries a proof claim: a second JWT signed with PREVIEW_TOKEN_SECRET, a Worker secret, with iss/aud set. The preview route verifies that proof alone — signature, exp, iss, aud, claim shape — and reads site and platform from it, never from the enclosing token.
    • The enclosing token is unchanged: same key, same claims, same exp. GET /v2/cdn/libraries/debugger.js and the Webflow extension's own token minting are untouched, so the widget behaves exactly as before.
    • Set PREVIEW_TOKEN_SECRET in every environment (wrangler secret put PREVIEW_TOKEN_SECRET). Without it, minting logs an error and returns a widget-only token; preview links then fall through to the published config instead of showing unpublished work.
  • 7119b2e: Fix reconnecting a disconnected Webflow site returning 500 forever.

    server

    • POST /v3/projects looked up the site with getProjectBySiteId, which hides soft-deleted rows, then inserted. idx_projects_site_id_platform is not partial, so the disconnected row still owned the site and every reconnect died on the unique index — leaving the site permanently unconnectable. It now revives that row (matching ensureProject's behaviour on the Webflow authorize path) and returns state: 'created'. A disconnected project belonging to another org answers 409 instead, so its configuration and consent history are never handed over.
    • POST /v3/projects/:id/migrate-site had the same blind spot in its pre-flight guard: a soft-deleted project on the target site slipped past the check and the UPDATE then hit the index. It now answers 409 with a message pointing at the disconnected project.
    • generateCustomSiteId counted only live projects when checking a candidate id for collisions, so a hit against a deleted custom project would 500 on insert.
  • 3b84208: Make a refused scan readable in the Webflow Designer extension.

    server

    The robots.txt pre-flight on POST /v2/scanner/scan answers 503/403 with a body carrying only error, but the shipped Designer extension's axios interceptor reads message. Site owners saw Request failed with status code 403 instead of the reason. Both refusals now go through scanRefusalBody, which keeps error as the HTML the web app renders and adds a tag-stripped message for the extension's text-only toast. The template copy is unchanged, and the addition is purely additive, so it reaches the installed extension without a Marketplace release.

  • 87e5bcd: Scope domain writes to the owning project so one organization can no longer reassign or delete another's domain row.

    server

    • domains.domain is no longer a global unique index. Two organizations may each connect the same hostname and each gets its own row (migration 0042_domains_per_project_unique); uniqueness is now per project over active rows, and same-org duplicates are still refused with a 409 by describeOrgDomainConflict.
    • insertProductionDomain no longer upserts on the hostname — it reuses the calling project's own row (reviving it when it was disconnected) or inserts a new one. POST /v3/projects/:id/domains and custom-project creation therefore leave other orgs' rows untouched.
    • updateDomainRecord no longer hard-deletes the row clashing on the new hostname; the rename is keyed by domain id and scoped to the project, so PATCH /v3/projects/:id/domains/:domainId can only ever touch the caller's own row.
    • setProjectStagingDomain likewise only touches the project's own rows.
    • Webflow domain sync now flags connectedElsewhere only for a sibling project in the same organization — a hostname another org holds is synced normally instead of being skipped.
  • cbdf40c: Add POST /v3/consents — the public consent ingest for the runtime SDK.

    server

    • New public route POST /v3/consents (mounted before auth, rate limited). Same payload as POST /v2/consents so the core runtime can switch by URL alone; it stores to the R2 data catalog, writes the analytics-engine event, and forwards to the site's custom_endpoint.
    • Consent ingestion is uncapped on every plan tier. Free-tier users test through Preview rather than a metered live banner, so no per-plan consent allowance is enforced and GET /v3/projects/:id/subscription reports the license only.
  • Updated dependencies [fecdc78]

  • Updated dependencies [9a490af]

  • Updated dependencies [fecdc78]

  • Updated dependencies [8384efa]

  • Updated dependencies [d3e426d]

  • Updated dependencies [a580774]

  • Updated dependencies [d7331e4]

  • Updated dependencies [2ebb655]

    • consentpro-types@1.3.0
    • consentpro-utils@2.1.1
    • consentpro-dictionary@0.1.6
    • consentpro-templates@0.0.2

2.7.0

Minor Changes

  • 9090632: Publish the registrable root domain alongside subdomain hostnames, so a site on marketing.example.com that is reverse-proxied behind example.com resolves a config on the parent domain. Roots that are public suffixes (site.webflow.io, app.pages.dev) and www. hosts are skipped.

Patch Changes

  • 6757be6: Honor a GPC signal that post-dates a visitor's stored consent.

    Previously the GPC signal only decided the defaults, so a visitor who consented first and enabled GPC afterwards kept their old consent indefinitely — while the banner still claimed the signal had been honored. The signal is now treated as a live opt-out request that wins over consent saved before it arrived, and a consent given knowingly after the signal was honored wins in turn (CCPA § 7025(c)(3)). The most recent expression of the visitor's preference governs.

    consentpro-v2

    • The consent cookie gains gpcHonoredAt: when the runtime first observed the signal that was still active as of that write. It is stamped on every write made while the signal is present and cleared on writes made while it is absent, which is what distinguishes consent given before the signal from consent given knowingly after it. Browsers expose no "enabled at" timestamp, so this is the only recency information available.
    • On page load, a stored consent that still grants a non-essential category and predates the signal is revoked before blocking, trackers and analytics initialize — so no tracker ever sees the stale consent, and cookies set under the revoked categories are cleaned up on the same load. A consent record is written with action: 'reject_all' and source: 'gpc', and is never collapsed into a consent the visitor gives in the second that follows: a processed opt-out request is a compliance event in its own right, not an intermediate state.
    • The revocation runs only on pages the resolved instance is configured for. On an excluded page nothing can block a tracker or clean up a cookie, so recording an opt-out there would claim an enforcement that never happened; the stored consent is left untouched until the visitor reaches a managed page.
    • Consent records now carry the id, action and source captured when the write happened, instead of reading them from the stores when the debounced request fires. Previously any two writes inside a second could hand the first record the second one's attribution.
    • The banner is re-shown once on the page load where a category was actually revoked, so the visitor is told their saved preferences changed and gets the chance to consent knowingly instead.
    • fs-consent-gpc now reflects whether the signal is being processed, not merely present, and updates live: it flips to "false" the moment a visitor accepts while a signal is active, hiding [fs-consent-element="gpc-honored"] rather than leaving a claim in place that is no longer true. This matters for § 7025(c)(6), which as of 1 January 2026 requires displaying whether the signal was processed.
    • Scope is unchanged: only Opt-Out and Do Not Sell instances. Opt-In consent is never revoked, and fs-consent-gpc stays "false" on those instances: the attribute now tracks the same condition the behavior does, so it never claims a signal was processed where nothing acts on one.
    • A stored consent whose gpcHonoredAt equals its own timestamp counts as a knowing override rather than a consent the signal outranks. The two can only match when they were written together, which a consent predating the signal never is — and a custom integration writing the cookie by hand can land both in the same millisecond.
    • FinsweetConsentPro.consents.set() now stamps action: 'submit' and source: 'api', like every other write path. Previously it inherited whatever wrote the consent before it, which with GPC in play would have recorded a site's own API call as a GPC-driven opt-out. It also means API-driven consent is recorded at all, where before the missing action caused the record to be dropped.

    Existing GPC visitors who had granted consent are opted out once, on their next page view, and see the banner that one time.

    documentation

    • developer/custom-integration.md documents gpcHonoredAt and shows how to carry it forward when writing the cookie by hand. A custom integration that omits the stamp while a signal is active writes a consent that Consent Pro cannot distinguish from one given before the signal, and revokes on the visitor's next Webflow page view.

    consentpro-types / server

    • ConsentSource and ConsentRecordSchema.source accept 'gpc'. The consents endpoint validates against that enum, so without this the GPC records would be rejected and silently dropped.
  • Updated dependencies [6757be6]

    • consentpro-types@1.2.1
    • consentpro-dictionary@0.1.5
    • consentpro-utils@2.1.0

2.6.0

Minor Changes

  • 4a1df08: Run v2 scans inside a Cloudflare Workflow so large sites finish instead of being killed by the queue consumer's wall-time limit. Each scan is one Workflow instance keyed by its tracking ID, reusing a single Browser Run session across sequential 40-page batches and checkpointing every batch to R2 under scan-jobs/{trackingId}/. A batch whose checkpoint already exists is skipped on retry, so a scan resumes rather than restarting. Failed steps retry natively.

    The queue now only dispatches: it creates the Workflow instance and acks after a successful create, so a redelivery cannot start a second instance and a dispatch that never succeeds lands in the dead-letter queue, where the scan is marked failed. Cancellation transitions the D1 row and clears the temporary R2 objects, and the Workflow stops at its next step boundary. A stale-scan reaper on the existing five-minute cron fails any queued or running scan whose row has not been touched for an hour, so a scan can no longer strand its origin.

    Adds /v2/scanner/admin for internal operations: start a scan against a site (POST /scan), inspect the D1 row plus Workflow instance status (GET /scan/:trackingId), and cancel (DELETE /scan/:trackingId). These run the normal manual scan lifecycle, including timeline events and the Designer result slot, and send no completion email. This replaces the scan routes previously exposed on the non-production /test endpoint.

    The result format, public API and Designer UI are unchanged.

    Deployment requires two things. The new SCAN_WORKFLOW binding is created by wrangler deploy. The SCANNER_INTERNAL_TOKEN secret must be set for each environment, sent as the X-Scanner-Admin-Secret header; until it is, /v2/scanner/admin fails closed with a 503 and the rest of the scanner is unaffected.

Patch Changes

  • 4a2d1af: chore(deps): clear the pnpm audit backlog

    pnpm audit went from 17 findings (5 high, 10 moderate, 2 low) to 0 unignored.

    Direct dependency updates:

    • server: hono 4.12.34 → 4.13.7, covering three advisories: unbounded dot-notation nesting in parseBody(), query parameters read after the URL fragment, and the incomplete toSSG() fix for CVE-2026-39408
    • root, app, server: vitest 4.1.0 → 4.1.11, for the @vitest/mocker path traversal

    Transitive pins added via pnpm.overrides:

    • @ai-sdk/provider-utils → 4.0.51 (uncontrolled resource consumption, via @ai-sdk/openai)
    • @vitest/mocker → 4.1.11
    • csv-parse → 7.0.2 (prototype replacement via columns, via @finsweet/webflow-apps-utils)
    • fflate → 0.4.9 (infinite loop in unzipSync on malformed input, via posthog-js)
    • qs → 6.16.0 (array-limit bypass and attacker-controlled isBuffer DoS, via webflow-api)

    Existing overrides refreshed, because the versions they pinned were themselves flagged since they were added:

    • js-yaml 3.15.1 → 3.15.2 and 4.3.1 → 4.3.2
    • sharp 0.35.3 → 0.35.4 (libheif vulnerabilities, via wranglerminiflare)

    Two advisories are added to pnpm.auditConfig.ignoreCves because no fixed release exists upstream yet. Both are archive-extraction symlink traversals reachable only from build and browser-download tooling, not from any runtime request path:

    • CVE-2026-19693, extract-zip <=2.0.1 via @cloudflare/puppeteer@puppeteer/browsers
    • CVE-2026-76845, adm-zip <=0.6.0 via @webflow/webflow-cli@module-federation/dts-plugin

    Both should be removed from the ignore list once upstream ships a fix.

2.5.1

Patch Changes

  • Updated dependencies [f528b4f]
    • consentpro-dictionary@0.1.4
    • consentpro-utils@2.1.0

2.5.0

Minor Changes

  • 55656ae: Add optional public hostname and path prefix so reverse-proxied sites publish a hostname.json for the visitor host and expose the site information the runtime uses to compose public URLs.

    The Webflow domain is unchanged. Custom-domain sites publish publicHostname and, when mounted under a prefix, pathPrefix. The runtime composes these with locale subdirectories and page slugs. Sites without these settings are unaffected.

Patch Changes

  • 55656ae: Keep CMS and locale page dedupe working on reverse-proxied scans by ignoring the mount prefix when grouping and ranking URLs.
  • 4afc228: Remove the dictionary-matched-review confirmation step. Trackers matched against our verified database now publish immediately without requiring manual confirmation, reducing steps to live. The "Confirm matched trackers from our verified database" action item group is removed from the UI, and any pre-existing resolved/unresolved rows of this type stop being surfaced.
  • Updated dependencies [55656ae]
  • Updated dependencies [4afc228]
    • consentpro-utils@2.1.0
    • consentpro-types@1.2.0
    • consentpro-dictionary@0.1.3

2.4.1

Patch Changes

  • 03bd744: chore(deps): resolve open Dependabot PRs and clear the pnpm audit backlog

    Direct dependency updates:

    • app: axios 1.16.0 → 1.18.0, posthog-js 1.336.1 → 1.417.0
    • consentpro-v1: nanoid 5.1.6 → 5.1.16, esbuild 0.27.3 → 0.28.1
    • consentpro-v2: esbuild 0.27.3 → 0.28.1
    • server: hono 4.12.21 → 4.12.34
    • consentpro-debugger: vite 7.3.2 → 7.3.6

    Transitive advisories are pinned to patched versions via pnpm.overrides (tar, undici, brace-expansion, js-yaml, protobufjs, fast-uri, ip-address, postcss, nanoid, form-data, ws, adm-zip, shell-quote, sharp, dompurify, esbuild), taking pnpm audit from 89 findings (1 critical, 41 high, 35 moderate, 12 low) to 0.

    The posthog-js bump also removes the @opentelemetry/* and protobufjs subtrees, which were never reachable from the shipped extension bundle. Telemetry configuration is unchanged and the pinned defaults: '2025-05-24' still applies, so capture behaviour is identical.

    Two advisories have no published fix and are recorded in pnpm.auditConfig.ignoreCves rather than resolved — CVE-2026-56876 (extract-zip, via @cloudflare/puppeteer) and CVE-2025-14505 (elliptic, via @webflow/webflow-cli). Neither is reachable from a shipped artifact.

2.4.0

Minor Changes

  • a3670d2: Add POST /v2/marketing/beta-testers, a public endpoint for the marketing site's beta tester sign-up form. Accepts an email form value (JSON or form-encoded) and uses the Brevo SDK to create a contact, or add an existing contact to list ID 37, on Brevo.

Patch Changes

  • 4d7fcb3: feat: add StackAdapt to known providers; add StackAdapt tracking pattern to tracker collapse patterns
  • Updated dependencies [4d7fcb3]
    • consentpro-dictionary@0.1.2
    • consentpro-utils@2.0.3

2.3.1

Patch Changes

  • e40ba4b: fix: clear scan error state in loadScanResultsForScan; ensure scan error is cleared in Manager.svelte

2.3.0

Minor Changes

  • ab66bf0: Add a /v2/checkout middleman redirect endpoint so the Finsweet Accounts checkout, which lives on a different domain, can still receive the Google Ads click cookies (_gcl_aw/_gcl_au) for attribution. The app now routes the "upgrade plan" flow through this endpoint instead of linking to Finsweet Accounts directly.

Patch Changes

  • 3ea0afe: Ensure a project record per site, and dual-write core config to D1.

    server

    • New services/v2/projects: ensureProject, getProjectUuidBySiteId, linkSiteAuthorizationProject. Project creation is idempotent and race-safe, and revives a soft-deleted project on re-authorization.
    • The Webflow OAuth callback creates the project and stamps it onto the site authorization on first authorization. Failures are logged and never block authorization.
    • Temporary R2 → D1 dual-write (configurator/temporary-d1-mirror): saveCoreConfig and site migration mirror the core runtime config into project_configs, webflow_project_configs, banner_instances, config_providers and config_trackers. R2 stays the source of truth and the mirror soft-fails, so a D1 error can never fail a publish. Sites only begin mirroring once they have a project row, so existing sites stay unmirrored until they re-authorize.
    • project_uuid is stamped on scans, scan schedules, action item resolutions, policy profiles and policy documents, without overwriting a value that is already set.
    • Schema: project_uuid foreign keys move from ON DELETE set null to ON DELETE cascade, and project_configs gains locales.
    • Migrations 0038 (adds project_configs.locales) and 0039 (the foreign key change). 0039 is hand-written rather than drizzle-generated: the generated table rebuild issues DROP TABLE, which on D1 fires the pre-existing policy_documentspolicy_profiles cascade and empties the table, because D1 runs each migration inside a transaction where PRAGMA foreign_keys=OFF is silently ignored. It uses ALTER TABLE DROP COLUMN / ADD COLUMN instead, so no table is ever dropped. Side effect: project_uuid becomes the last column on the six affected tables.

    consentpro-v2

    • The consent cookie is now always written with sameSite: 'lax', and secure is derived from location.protocol instead of configuration. storage.sameSite and storage.secure are no longer read by the v2 runtime.

    consentpro-types

    • ConsentV2TrackerDefinition gains an optional name for cookie trackers and an optional key for local-storage / session-storage trackers.
  • Updated dependencies [3ea0afe]

    • consentpro-types@1.1.5
    • consentpro-dictionary@0.1.1
    • consentpro-utils@2.0.3

2.2.1

Patch Changes

  • 81c0689: Harden Webflow Designer authentication, site isolation, and administrator permissions while reducing duplicate app boot work.

  • 7fa86ff: chore: add rate limits to the consents endpoint

  • 81c0689: Never render a blank email greeting, and share recipient resolution between the server and jobs workers via consentpro-utils/email. An organization member with an email but no profile name previously resolved to an empty userName, so notification templates rendered Hi ,; the greeting now falls back to Hi there.

  • 0da8c08: legacy compat: make site id optional in /history route

  • 7af655c: chore: remove tldts-icann in favor of main tldts

  • a468690: - scan pages max 2000, added a ordering and prioritizing

    • fix to prevent scanner triggering consents records actions, so that it uses the mode override param natively instead of calling the API during scanner
    • allow redirects to same domain/subdomain only
  • 3fb6710: UX improvements: regions, banners, and action items.

  • 81c0689: Remove site-level notification recipient lists. Scheduled scans again use a per-schedule email, and transactional emails (exports, proofs, scan updates) go to the signed-in session email.

  • 27d6762: add site id param to scanner history endpoint

  • 48c86f8: hotfix: send a license request when debugger is loaded

  • 6bdd208: fix: remove proxy use plain fetch and attach scanner headers

  • 6bdd208: allow legacy param when reading debugger with ?consentpro-debugger=true

  • Updated dependencies [a0173e0]

  • Updated dependencies [81c0689]

  • Updated dependencies [3fb6710]

  • Updated dependencies [81c0689]

  • Updated dependencies [9d4c732]

    • consentpro-dictionary@0.1.0
    • consentpro-utils@2.0.3
    • consentpro-types@1.1.4

2.2.0

Minor Changes

  • f64321d: Detect modern Wistia embeds and attach their scripts and iframes to the existing Wistia tracker, even when the player has not written storage yet.

2.1.1

Patch Changes

  • 1008b0b: feat: add proxy access control logic in proxy-access module; implement shared proxy handler for v1 and v2; update proxy routes to use new handler; remove proxy-guard module; update tests for proxy access and handler
  • caebb9b: Move core activation analytics off the Designer extension onto authenticated server routes so events use a reliable Auth0 sub as distinct_id.
  • 2487ddd: feat: report image trackers and cookie attribution
  • 4db7273: update scan schedule to always use the correct config url stored
  • Updated dependencies [cb1d15a]
  • Updated dependencies [2487ddd]
    • consentpro-utils@2.0.2
    • consentpro-types@1.1.3
    • consentpro-dictionary@0.0.11

2.1.0

Minor Changes

  • 83dc872: feat: public proxy security
  • f4ab509: feat: debugger auth
  • 4435f7e: feat: same-origin library imports

Patch Changes

  • 494b74c: feat: add ClickUp provider to known providers; add SPLITIO collapse patterns tests for ClickUp trackers

  • 73a3472: improve attribution of resources to storage

  • 5407450: fix cookie declaration hydration

  • 4fe563b: Ensure all requests to sites we are crawling or checking includes streamlined UA and custom header for Consent Pro

  • e46032c: fix: Polish policy status transitions

    • Regenerating a policy now clears the persisted last_status, so policies that previously showed the Not Found status correctly transition back to Ready to Publish / Published once the element is re-injected onto the canvas.
    • Clicking Save as Draft on an already-generated policy (e.g. one with status Ready to Publish) now reverts the document to Draft state by clearing generated_at and last_status.
    • Policies flagged as Not Found are now automatically re-verified against the canvas when the Policies view loads. If the user restored a deleted element outside the view (e.g. via Webflow's undo), the status resets to the resolved value (Ready to Publish / Published / Update Needed) without requiring manual action.
  • fa75381: Enhance policy generator

  • Updated dependencies [494b74c]

  • Updated dependencies [73a3472]

  • Updated dependencies [5407450]

  • Updated dependencies [e46032c]

    • consentpro-dictionary@0.0.10
    • consentpro-types@1.1.2
    • consentpro-utils@2.0.1

2.0.14

Patch Changes

  • e5d2aad: fix: Whitelist numeric storage keys to stop Shopyflow product caches from being flagged as trackers
  • Updated dependencies [e5d2aad]
    • consentpro-dictionary@0.0.9
    • consentpro-utils@2.0.1

2.0.13

Patch Changes

  • 353af98: feat: Implement tracker collapse functionality for improved analytics
  • Updated dependencies [353af98]
    • consentpro-dictionary@0.0.8
    • consentpro-utils@2.0.1

2.0.12

Patch Changes

  • ded7f80: update namings in usages of consent-pro-** to consentpro-**
  • 73aa49f: feat: consent pro debugger
  • Updated dependencies [ded7f80]
  • Updated dependencies [73aa49f]
    • consentpro-dictionary@0.0.7
    • consentpro-utils@2.0.1

2.0.11

Patch Changes

  • 74e897d: Fix scan completion email reporting incorrect tracker count

2.0.10

Patch Changes

  • 2ad5e11: chore: update dependencies
  • d9f8276: fix: filter out locales first before deduplicating pages

2.0.9

Patch Changes

  • 9f6dfc2: chore: cleanup logs to remove unnecessary console messages during scan

2.0.8

Patch Changes

  • 7d6d5f7: chore: Enhance provider merging logic to preserve user-edited metadata

2.0.7

Patch Changes

  • ef22755: chore: preserve manually added trackers
  • 9cf51bd: chore: update server tests to ensure they are all passing
  • Updated dependencies [ef22755]
  • Updated dependencies [9cf51bd]
    • consentpro-utils@2.0.1
    • consentpro-dictionary@0.0.6

2.0.6

Patch Changes

  • 6b1e9c9: update scanner publish flow to filter out deleted trackers from published config

2.0.5

Patch Changes

  • 1a79dde: whitelist _cfuvid tracker and add language to ConsentProV2InstanceSettings
  • 9f95405: fix: make GPC flexible to anyone with GPC enabled, not just specific regions
  • Updated dependencies [1a79dde]
    • consentpro-dictionary@0.0.5
    • consentpro-types@1.1.1
    • consentpro-utils@2.0.0

2.0.4

Patch Changes

  • 1a79dde: whitelist _cfuvid tracker
  • Updated dependencies [1a79dde]
    • consentpro-dictionary@0.0.4
    • consentpro-utils@2.0.0

2.0.3

Patch Changes

  • e199683: Fix: publish finsweet.com config for reverse-proxied Finsweet sites

2.0.2

Patch Changes

  • 3436761: reduce scanner page concurrency from 5 to 3 and clear homepage HTML from page results after extraction to reduce memory pressure during large site
  • Updated dependencies [6509630]
    • consentpro-types@1.1.0
    • consentpro-dictionary@0.0.3
    • consentpro-utils@2.0.0

2.0.1

Patch Changes

  • 683eeb0: chore: Update dependencies to latest versions across all packages and fix pnpm audit issues

2.0.0

Major Changes

  • e9bd587: NEW: Consent Pro V2 with Geolocation, Improved GTM handling and Instances Support

Minor Changes

  • c008017: feat: send configuration_published events

Patch Changes

  • 2b400f7: feat: add SCAN_SCHEDULE_NOTIFICATION email template ID
  • 9ac2bf8: fix: skip webhooks when not v2
  • 8ded22e: chore: fire runtime loaded events for v1 as well
  • 6029a6c: Update display time for scan schedule to be based on user timezone
  • 5396021: Improved scan schedule feature plus posthog exeption tracking for schedule failures
  • 2b400f7: Update scan schedule UI experience, introduce an email recipient field
  • 5b5fdd7: fix: sanitize published configs correctly
  • c008017: chore: register PostHog events as Consent Pro for better segmentation
  • f083ccd: improvement: no longer store provider & tracker metadata in each consent log
  • c008017: chore: refactor PostHog events sending
  • 6029a6c: chore: add support for scheduling scans on a specific date
  • Updated dependencies [e9bd587]
  • Updated dependencies [6029a6c]
  • Updated dependencies [2b400f7]
  • Updated dependencies [5b5fdd7]
    • consentpro-types@1.0.0
    • consentpro-utils@2.0.0
    • consentpro-dictionary@0.0.2
    • @consentpro/permissions@0.0.1

1.0.13

Patch Changes

  • 05189c5: fix: update handling for domains list in a project

1.0.12

Patch Changes

  • e2c5edf: feat: enhance config publishing with updated custom metadata and improve latest config retrieval logic

1.0.11

Patch Changes

  • c89966b: chore: global banner updates and animation library

1.0.10

Patch Changes

  • 8a9a493: add feature to support externally hosted banners and global banners with CSS imports

1.0.9

Patch Changes

  • a37ec60: chore: update consent pro api to support legacy components api for cookie consent targets

1.0.8

Patch Changes

  • 28a6a2d: Cleanup an update release runtime branch name

1.0.7

Patch Changes

  • 4804467: feat: update consent pro for new migration

1.0.6

Patch Changes

  • 077f9a4: cleanup console message

1.0.5

Patch Changes

  • aa8257a: chore: update release sync branches ci with a release-runtime-v** naming strategy

1.0.4

Patch Changes

  • b5be59c: chore: update release

1.0.3

Patch Changes

  • 1b689fc: chore: update release pipeline for branch auto sync

1.0.2

Patch Changes

  • c20f5c9: chore: improve legacy config management and handling

1.0.1

Patch Changes

  • 3152bd4: chore: update webflow hooks, configurator handling and runtime scripts

1.0.0

Major Changes

  • 5b7551a: initial setup for consent pro and migration of cc into consent pro

Patch Changes

  • 65a0083: update consent pro and include whitelist feature

1.0.0

Major Changes

  • a7345fa: Initialize Consent Pro

Patch Changes

  • 7ac1289: add tests