+* **Security: reject ad-platform macros in attribution capture** (`includes/Core/class-attribution-provider.php`, `assets/js/clicutcl-attribution.js`): Facebook (and other ad platforms') dynamic parameter macros — `{{campaign.name}}`, `{{adset.name}}`, `{{ad.name}}`, `{{placement}}`, etc. — appear literally in landing-page URLs when ads aren't actually served through the ad platform (manual preview, test traffic, misconfigured campaigns). Previously these unsubstituted placeholders flowed into the `wp_clicktrail_*` attribution tables and downstream destinations (GA4, Meta CAPI, Google Ads conversions) as if they were real campaign / adset / ad names, polluting reports. Now rejected via `^\{\{.+\}\}$` regex in both the server-side sanitize loop in `Attribution_Provider::sanitize_meta()` and the client-side `sanitizeValue()` helper. The two implementations are intentionally symmetric so both capture paths (REST batch + server-side enrichment) drop these strings.
0 commit comments