fabiodalez
Forum Replies Created
-
Forum: Reviews
In reply to: [FAZ Cookie Manager] Literally Perfect!Hi Niharika,
Thank you for your kind words.
“Finally someone understood the need of individual publishers” is exactly the audience I had in mind when I forked, debranded and rewrote this thing: bloggers, small ecommerce stores, niche publishers, the people who need real GDPR / CCPA / IAB TCF compliance without paying a SaaS just to make a cookie banner do its job.
Two practical notes that might unblock your “put on hold” situation:
There is already a built-in Global Vendor List browser inside the plugin. Look for “Vendor List (IAB)” in the FAZ Cookie Manager admin menu (left sidebar). The current IAB TCF v2.3 Global Vendor List ships bundled — around 700+ ad vendors — and the screen lets you filter them by purpose (storage, personalised ads, ad measurement, audience research, etc.), search by name, and bulk-select / deselect. So you don’t have to add them manually one by one. If you only need the most common vendors (Google, Meta, Microsoft, Amazon, Criteo, TikTok, the big SSPs and DSPs your specific monetization stack uses), you can typically get a working setup in two minutes from that screen.
If the IAB GVL still feels like a lot to browse, a quick sanity tip: turn on IAB TCF in Settings only if your ad network actually requires it (Google Ad Manager / AdSense in EEA/UK + many programmatic SSPs do — but a single Google Analytics + Google Ads setup, for instance, can run on plain Google Consent Mode v2 alone, which the plugin emits natively without needing to pick any IAB vendors at all).
Your “auto-scan for ad vendors” idea is genuinely good and I’ve logged it for a future release. The plugin already runs a cookie scanner that finds the domains your site sets cookies on; correlating those domains back to their IAB vendor IDs (e.g. doubleclick.net → Google, vendor 755; facebook.com → Meta, vendor 89; tiktok.com → TikTok, vendor 1397; etc.) is a tractable piece of work and would let the GVL screen pre-tick the vendors a site is actually loading. That’s the feature you’re asking for, and it’s the kind of UX polish individual publishers will benefit from the most.
I won’t promise a date, but it’s on the list with priority because your reason for hitting pause is the right one: a 700-row vendor table is intimidating if you don’t already know which ones apply to you. Closing that gap is on me.
In the meantime — if you do hit anything specific while configuring the plugin for your site (banner styling, blocking a particular tracker, anything), drop a thread under the support tab. I read all of them.
Thanks again. Reviews like this genuinely help the plugin reach more publishers who are in the same situation you were.
— Fabio
Forum: Plugins
In reply to: [FAZ Cookie Manager] Performance Impact???I re-fetched the headers from your home, /cookie-policy/ and /shop/ a few minutes ago and they now read:
cache-control: public, s-maxage=216000
x-stackcache-cacheable: yes
x-cdn-cache-status: MISSThanks for the grep on faz_use_country_language_fallback — that confirms what I expected. The filter ships with a default of false and only ever flips if a developer explicitly opts in from a theme or plugin, which neither of yours does.
One thing I’m taking away from this for 1.16.3: an admin warning that fires when Geo-routing is enabled while you have a single banner with no target_countries — i.e. the exact configuration that costs you the CDN cache for zero functional gain. One-click “disable Geo-routing” inline. Your report is what made that warning idea! Thank tou
Hi Alex, hi Tomas,
Alex — thanks for stepping into the thread. That’s the missing piece. Tomas — Alex’s diagnosis is correct.
A quick note on your conditional, Alex: “if you haven’t changed cookie names AND how the CMP state is saved and updated”. Those are two halves, and on FAZ only the first is violated. The state save/update mechanism is byte-for-byte the same machinery FAZ inherited from CookieYes 3.4.0: same cookie value shape (categories object plus action timestamps plus consent revision), same write path (single setcookie with first-party domain, samesite=Lax, 6-month expiry), same update protocol (the update event fires AFTER setcookie returns and AFTER the in-memory category map flips, so any listener that re-reads the cookie sees consistent state). The Google Consent Mode v2 emit is also identical to the CookieYes 3.4 path — same seven keys, same gtag(‘consent’, ‘update’, {…}) call, same dataLayer order. So Pixel Manager’s runtime expectations against a CookieYes-compatible CMP all hold once it can SEE that the CMP is there. The only thing that’s changed is the surface symbol names: the cookie is fazcookie-consent rather than cookieyes-consent, the JS event is fazcookie_consent_update rather than cookieyes_consent_update, the global accessor is window.getFazConsent rather than window.getCkyConsent.
What does Pixel Manager’s “supported CMP” enrollment process look like? Is it a PR against the Pixel Manager codebase, a docs page entry on sweetcode.com, a form, an email? If a PR is welcome, here is the minimum FAZ-side detection contract I can guarantee will stay stable for the foreseeable future — please tell me if you’d want different or additional probes:
- presence: typeof window.getFazConsent === ‘function’
- cookie name: fazcookie-consent
- cookie value shape: JSON, top-level keys “categories” (object: slug → boolean for necessary/functional/analytics/marketing/performance), “isUserActionCompleted” (boolean), “consentID” (string), “action” (ISO timestamp), “activeLaw” (“gdpr” | “ccpa”)
- update event: document dispatches a CustomEvent named fazcookie_consent_update on every accept / reject / preference change; the event’s detail is the same object getFazConsent() returns
- Google Consent Mode v2: gtag(‘consent’, ‘update’, {…}) is called with all seven standard keys (analytics_storage, ad_storage, ad_user_data, ad_personalization, functionality_storage, personalization_storage, security_storage) on every consent transition
I can guarantee semver-stable behaviour on those — any breaking change would be a major version bump with a deprecation cycle. If you let me know the right place to send the patch, I’ll open it within the day. Happy to align the symbol probes you’d use against whatever naming convention reads cleanest in your codebase.
Two related questions while we’re talking, Alex.
First, until either side ships the native detection, my read is that the safest “today” answer for Tomas is your WP Consent API bridge: install the free wp-consent-api plugin, FAZ already auto-loads a wca.js layer that translates fazcookie_consent_update into wp_set_consent() and wp_consent_type_defined calls, and Pixel Manager’s matrix already lists “WP Consent API ✔”. Is there anything I’m missing there that would make that path NOT work on Tomas’s stack? In particular: does Pixel Manager require the WP Consent API call BEFORE the page is fully loaded, or is a post-load update enough to release queued events (the WooCommerce purchase one specifically)?
Second, the Explicit Consent Mode point you raised. Tomas — Alex is right and it’s worth re-running the A/B with that in mind. Pixel Manager keeps tracking blocked until cookies are accepted, by design. If your A/B between Complianz and FAZ ran in fresh incognito windows where you opened the page but did NOT actually click Accept on the banner, Complianz may have appeared to “send tracking” simply because its default consent state was pre-granted, while FAZ correctly defaults to denied. A fair A/B is: open in incognito on both stacks, click Accept All on the banner, complete a test purchase, then check GA4 realtime. Only that path is apples-to-apples.
What Tomas can do right now (without waiting on either side).
- Install and activate the WP Consent API plugin from ww.wp.xz.cn (no settings page; it just exposes the standard).
- Leave FAZ Cookie Manager active — no toggle to flip on FAZ side, the bridge auto-loads when WP Consent API is present.
- Keep Pixel Manager’s Explicit Consent Mode on.
- Clear any page / object cache, open the site in an incognito window, click ACCEPT ALL on the FAZ banner, complete a test purchase, check GA4 realtime + the Google Tag Assistant.
If conversions still don’t arrive after that — and only then — it would help a lot if you could capture the browser DevTools console right after consent and tell me what you see for:
- window.wp_consent_type (should be “optin” or “optout”)
- wp_has_consent(‘marketing’) (should be true after Accept All)
- the dataLayer entry shape for “consent update” (the seven GCM keys should be present)
- any Pixel Manager-emitted console warnings about CMP detection
If Alex confirms the right channel for the supported-CMPs PR, native detection is the answer and there is nothing else to ship on the FAZ side. If the WP Consent API path turns out to need a small bridge tweak (timing, ordering of calls), I’ll fold that into FAZ 1.16.3 within the next few days. Either way I’ll come back here on this thread once there is something concrete to test.
Thanks both of you.
Forum: Plugins
In reply to: [FAZ Cookie Manager] Performance Impact???Hi James,
Saw your follow-up about the banner showing across all pages now once the cache cleared — glad that one turned out to be a CDN propagation lag and not a real bug. No need to apologise: the fact that it took over an hour for your Stackcache to roll over is actually a useful data point for the second issue too (more on that below).
In the meantime I didn’t want to leave you waiting, so while you do your own investigation I went and looked at the live site from the outside to make sure my mental model of what is happening matches what your server is doing in practice. Here is what I found, kept short and concrete.
First, the good news: the cookie policy literal-JSON bug is gone. The /cookie-policy/ page rendered through 1.16.1 no longer contains the {“en”:”…”} fragments you spotted on the previous release. The fix landed exactly where I expected. The cookie inventory layout is still the flat definition-list from 1.16.0/1.16.1 on your install, but that is improving in 1.16.2 (which is already on ww.wp.xz.cn and propagating): the inventory becomes a collapsible accordion with a real table per category instead of the long flat list, and the footer disclaimer becomes admin-configurable (toggle plus optional custom text) instead of being hardcoded. So when your install picks up 1.16.2, that policy page will tighten up considerably without any action on your side beyond an update.
Now the cache miss. I confirmed it is happening on every page I tested, not just the home: the home, /cookie-policy/ and /shop/ all return identical headers. The relevant ones are:
cache-control: no-store, no-cache, must-revalidate, max-age=0
x-litespeed-cache-control: no-cache
x-stackcache-cacheable: nope
x-cdn-cache-status: MISSSo Stackcache is correctly honouring what the origin is telling it; the origin is the one deciding the page is uncacheable. That decision comes from a single function inside the plugin (send_geo_cache_headers), which fires Cache-Control no-store the moment it decides the rendered output is country-dependent. There are four conditions that can flip that switch, in this order of likelihood:
- IAB TCF v2.3 is enabled in Settings. I can rule this one out — your home page does not contain the _fazTcfConfig object, which means TCF is off on your install.
- Geo-routing is on with the default behaviour set to “do not show banner outside target regions” (Settings, Geo-routing, fallback). When that is the setting, the cached HTML of an EU visitor would silently show no banner to an outside-EU visitor (or vice versa), so the plugin marks the output uncacheable.
- Multi-banner geo-routing is configured (more than one banner, with at least one carrying a target-countries list). Here the plugin needs to serve a different banner per country, so once again it cannot let the CDN freeze one version of the page.
- A custom filter, faz_use_country_language_fallback, is turned on by the theme or another plugin. Very unlikely on a standard install.
For your stack the no-cache header is being driven by one of (2) or (3). Both are legitimate uses of the geo logic, but in your case (a UK ecommerce site targeting mostly UK and EU buyers) you may have set them up only as a safety net rather than because you genuinely want a different banner per country. If that is the case there is a clean fix to push on my side and I’d like to ship it as 1.16.3 within a few days. Two practical paths:
Path A — the minimal one. If you are running a single banner (no per-country variants) and you simply turned on geo-routing to gate the banner for EU/UK only, I add a settings flag so the plugin emits Vary: X-Country-Code plus a permissive Cache-Control header instead of the blanket no-store. Stackcache (and LiteSpeed) can then cache one HTML per country code — typically two or three variants in your case — which keeps the page near-instant for the dominant traffic segment while preserving the regulatory accuracy. Net effect: HIT for the vast majority of visitors instead of MISS for everyone.
Path B — the heavier one. If you are running multiple banners with target_countries, same idea but the Vary header logic needs to enumerate the country codes that actually have distinct banners, otherwise the CDN ends up caching 250 micro-variants of the same page. This is the same fix but a touch more careful.
To pick the right path I need a few details from you when you’ve finished your own investigation — no rush, this is patch-release work, not emergency. Roughly:
- In Settings, Geo-routing: is “Geo-routing” itself enabled, and if yes what is “default behaviour” set to (show banner, hide banner, fallback to most-protective)?
- In Cookie Banner, do you have one banner or more than one? If more than one, do any of them have a target-countries list configured?
- Are you fine with the page being cached per-country (so EU visitors share one cached variant, UK another, US another) rather than not cached at all? In most ecommerce stacks the answer is yes — it preserves performance while keeping the per-jurisdiction banner accurate.
- And one extra now that I’ve seen Stackcache react to a purge with that hour-long propagation lag: do you know whether Stackcache currently keys its cache by country (via CF-IPCountry or an equivalent header), or strictly by URL? Their support people will know — it decides whether the Vary trick can work as-is or whether they need to add a small cache key rule on their end alongside the plugin change.
If the answer to question 2 is “one banner, no target_countries”, the change becomes a one-liner on my side: I can probably ship it in a follow-up patch within a couple of days. I won’t push it speculatively because making the page cacheable for sites that DO rely on per-country banners would silently break their compliance posture, which is the worse failure mode.
A side note while I am here: the home page contains a “countryCode”:”GB” string a few times — that is WooCommerce’s own checkout state (“default country is GB”), not the plugin. Unrelated. The plugin’s own geo state isn’t exposed in the public HTML, which is the correct security posture.
Hi Tomas,
Thanks for the report. I have a strong working hypothesis about what is happening, but I want to be upfront that I have not been able to reproduce your exact stack (FAZ + Pixel Manager + WooCommerce purchase event end-to-end) on my side, so what follows is informed by the code paths and by the public Pixel Manager documentation rather than by a confirmed reproduction.
What I have verified.
I have checked the FAZ Cookie Manager codebase and already emits a fully-formed Google Consent Mode v2 update on every banner interaction: gtag(‘consent’, ‘update’, {…}) with all seven keys — analytics_storage, ad_storage, ad_user_data, ad_personalization, functionality_storage, personalization_storage and security_storage. So the GCM side, in principle, should be giving Google’s tags the right state. You can sanity-check this in your browser after clicking Accept: a dataLayer entry “consent update” with the seven keys should appear.
What I think is happening (hypothesis, not confirmed).
Pixel Manager by SweetCode looks like it does not rely only on the gtag consent calls — based on their documentation it also tries to “detect” which CMP is on the page so it knows the moment consent is granted and can release queued events (the WooCommerce purchase event is the typical case: it fires once at checkout and the CMP-detection bridge has to flip very quickly). Their compatibility matrix on https://sweetcode.com/docs/pmw/consent-management/platforms lists explicit support for a handful of CMPs (Complianz, CookieYes, Cookiebot, Iubenda, Borlabs, etc.) plus a generic “WP Consent API ✔” bridge. FAZ Cookie Manager is not (yet?) in that named list, which I suspect is why your purchase events stopped flowing.
What I would try first.
FAZ Cookie Manager already includes a bridge to the WP Consent API standard. If you install the small free plugin “WP Consent API” (https://ww.wp.xz.cn/plugins/wp-consent-api/, maintained by Rogier Lankhorst — the author of Complianz, ironically), FAZ should detect it on load and start translating its own consent events into the standard wp_set_consent(‘marketing’, ‘allow’) / ‘deny’ calls plus the wp_consent_type_defined event. Because Pixel Manager declares explicit support for the WP Consent API bridge in their matrix, the chain in theory becomes:
- Visitor accepts cookies on the FAZ banner
- FAZ emits its internal fazcookie_consent_update event
- The FAZ bridge translates it into wp_set_consent() calls and the wp_consent_type_defined event
- Pixel Manager picks up those standard signals and releases the queued WooCommerce purchase event
The reason I think this should work is that all four pieces are present and individually documented.
The reason I am hedging is that I have not driven the full WooCommerce → purchase → Pixel Manager → GA4 path with this combination myself yet, and “should work according to the docs” and “does work on your site” are not the same thing.
Steps to try.
- Install and activate the WP Consent API plugin from ww.wp.xz.cn (no configuration page, it just exposes the standard).
- Leave FAZ Cookie Manager active — no setting to flip on FAZ side, the bridge should auto-load when WP Consent API is present.
- In Pixel Manager, keep Explicit Consent Mode enabled.
- Clear any page / object cache, open the site in an incognito window, accept cookies, complete a test purchase, then check GA4 realtime and the Google Tag Assistant.
If conversions still do not arrive after that, it would help a lot if you could send the browser DevTools console output captured right after consent — specifically:
- any console error or warning coming from Pixel Manager about CMP detection
- what window.wp_consent_type returns (should be “optin” or “optout”)
- what wp_has_consent(‘marketing’) returns after Accept (should be true)
- the dataLayer entries that fire on Accept and on the purchase confirmation page
With that information I can tell with much more confidence whether the bridge is doing its job, whether Pixel Manager is seeing it, or whether there is a third moving part involved.
A note on the future. Even if the WP Consent API path turns out to work, having to install a second plugin to make the most popular WooCommerce tracking stack happy is not a great default. I have logged this internally as a tracking item: either reaching out to SweetCode to get FAZ added to Pixel Manager’s auto-detection list, or shipping a small compatibility shim on the FAZ side so the detection happens transparently. That would land in a future release.
Thanks again.
Fabio
Forum: Plugins
In reply to: [FAZ Cookie Manager] Performance Impact???Hi James,
Thanks for the very detailed bug report — both points are real and I have already shipped a fix for the first one. Quick recap.
Bug 1, the JSON leak in the Cookie Policy.
You are right that the rendered policy is showing the raw JSON for category names, category descriptions, cookie descriptions and durations. The root cause was inside the new Cookie Policy generator: the function that builds the cookie inventory was reading the four i18n columns straight from the database with a JOIN’d SELECT and printing them through esc_html() without first decoding the {“en”:”…”} JSON envelope that those columns use on multilingual installs. Everywhere else in the plugin the i18n decode happens automatically because the code goes through the model getters, but that one path took a shortcut.
The fix landed in 1.16.1, which I just pushed. The renderer now calls a small helper that picks the active language, falls back to en, then to the first non-empty entry, mirroring exactly the behaviour of the standalone [faz_cookie_table] shortcode you may already be familiar with. Description and category-description fields now also go through wp_kses_post() so the inline paragraph tags they may contain survive instead of being escaped to text. I also audited every other place in the plugin that touches those tables (controllers, REST API, WP-CLI export, settings import/export, all shortcodes) to make sure no similar leak was hiding elsewhere — none found.
Once 1.16.1 propagates through wp.org, just update and the policy page should render cleanly in your active language. If you happen to have the policy page cached on the front-end, a hard reload or a cache purge will pick up the new HTML.
Bug 2, the home page being marked as MISS.
I take that one seriously too but I want to make sure I understand what is happening on your specific setup before pushing changes that could hurt anyone else. The plugin sends a no-cache response when geo-routing is active for the current request, because the banner choice depends on the visitor’s country and a cached page would freeze that decision for everyone. That trade-off has been in place since 1.14.0 and is intentional in geo-aware scenarios.
What I’d like to check with you, if you don’t mind:
- Are you using the geo-routing feature (Settings → Geo-routing), or do you have a single banner serving every visitor?
- Which CDN or caching layer is in front of the site? (Cloudflare, BunnyCDN, hosting-level cache, a page cache plugin…)
- Are you seeing MISS only on the home page or on every page?
If you have a single banner and no per-country routing, there is room to skip the no-cache header entirely — and that’s exactly what I’d like to do for sites in your configuration. Knowing the answers above will let me ship that as a follow-up patch without risking the compliance posture of sites that do rely on geo-routing.
Thanks again for taking the time to test and report.
Fabio
Forum: Reviews
In reply to: [FAZ Cookie Manager] Everything you need in a cookie pluginJames, thank you for taking the time to write this in so much detail. The story you describe is exactly the experience that pushed me to build FAZ in the first place, and I made a deliberate choice early on: if it ships, it ships complete. No scan limits, no gated features, no manual cookie data entry.
Glad the cookie policy shortcode clicked for you. A heads-up that the next major release will include a much more complete Cookie Policy Generator, with full company and jurisdiction details, multi-language support, and a richer policy template. The code is already in the repo and will land soon.
Thank you again
Forum: Reviews
In reply to: [FAZ Cookie Manager] Just AWESOME!Thank you so much! The no-paywall philosophy is the whole reason FAZ exists in the first place — there are too many features that should simply be available to everyone, not gated behind a pro tier upgrade. Cookie consent is a legal requirement, not a luxury, and the tooling around it should match.
Hearing that the plugin handles whatever you throw at it without breaking a sweat is the bar I aim for. Performance and clean architecture were the two non-negotiables when I started this project, so it is genuinely encouraging to know that comes through in real use.
And thank you for being part of the conversation. The roadmap is shaped by people who actually run the plugin in production and report back, so reviews and threads like this one are what keep the project moving in the right direction. Genuinely grateful.
Thank you so much!
I’m glad the new workflow solves your problem.
If you have a minute and you feel the plugin deserves it, I’d also really appreciate a review on ww.wp.xz.cn — it helps a lot for visibility and keeps the project alive and maintained.
Thanks again for the support
Forum: Reviews
In reply to: [FAZ Cookie Manager] We are witnessing history unfolding liveOh thank you so much! 🙂
Quick follow-up: version 1.13.17 is out now on ww.wp.xz.cn and the Necessary category is in the Custom Blocking Rules dropdown.
So your GTM workflow is now this: open Settings, Script Blocker, Custom Rules, add a rule that matches googletagmanager.com (or any other always-on script you need to keep alive), and pick Necessary in the dropdown. From that point on the script loads unconditionally, regardless of consent, and the auto-scanner will not move it back into Analytics on the next run because rules you set explicitly always win over what the scanner detects.
I decided not to ship googletagmanager.com or dataLayer as Necessary out of the box. On many sites the GDPR-cautious choice is to load GTM only after the visitor accepts, and shipping it as Necessary by default would silently override that boundary for installs that did not opt in. With the dropdown change you can pick the trade-off explicitly for your site, which felt like the right line to draw.
Forum: Plugins
In reply to: [FAZ Cookie Manager] Bug report: dataLayer is not definedQuick follow-up: version 1.13.17 is out now on ww.wp.xz.cn. It carries both items we discussed.
For the dataLayer error, the plugin now creates an empty dataLayer queue very early on the page, before any other script can try to push into it. So when a GTM tag fires before consent is granted, it lands in the empty queue quietly instead of crashing the page with a ReferenceError. Once the visitor accepts and the real GTM bootstrap finally loads, it picks up the queued events normally. No configuration change needed on your side.
For the placement of the Enable Cookie Banner toggle, there is now a Banner Status card at the top of the Cookie Banner page, in the General tab, with the same switch you had under Settings. Flipping either of the two switches updates the same value, so there is no risk of them getting out of sync. The Settings entry is still there for the moment, just in case anyone has it bookmarked, but if you would rather see it removed entirely now that the more obvious placement exists, let me know and I will drop it in a follow-up release.
Forum: Plugins
In reply to: [FAZ Cookie Manager] Bug report: cookie categories not populatedQuick follow-up: version 1.13.17 is out now on ww.wp.xz.cn and it carries the fix for the category counters.
After updating, every time the scanner discovers a new cookie, or you create, edit, or delete one by hand, the counters on the left side will refresh right away. Same goes for renaming or deleting a category. I also added a regression test that simulates exactly what you reported, so this specific bug now has a permanent guard against coming back in future versions.
After update I would recommend purging LiteSpeed Cache once so the new behaviour reaches your site immediately. The object cache flush is not strictly required, but does not hurt.
Once the update is in, a fresh scan plus auto-categorisation should show the correct numbers on the left straight away.
No paid plan, never! Quick follow-up to let you know that version 1.13.17 is out now on ww.wp.xz.cn and it carries the two fixes I told you about.
On a fresh install of 1.13.17 those flags now stay at their safe defaults, so the banner shows up the way it is supposed to and there is no need for the workaround you put together.
On top of that, the frontend script now has a safety net: if for any reason the configuration object cannot be reached (this can happen with aggressive JavaScript-defer or page-cache setups that wrap inline scripts), it logs a console warning and exits cleanly instead of crashing the page. So even if some other plugin in the future tries to mess with the bootstrap order, the worst case is no banner with a warning in the console rather than a hard TypeError.
To update, just go to Plugins, find FAZ Cookie Manager, and click Update. If you still have the workaround in place you can safely remove it after the update. The defaults in 1.13.17 are already correct.
Thanks again for the very thorough report. Have a good one,
FabioThanks for the framing — this was a real UX gap and you are right that the workaround of deleting GTM rows by hand is lossy because the scanner re-adds them on the next run.
Quick context on what was actually happening, because the backend was further along than the UI suggested. The settings sanitiser already accepted Necessary as a valid category for custom script-blocking rules — the eight built-in blocker templates that ship with the plugin (Cloudflare Turnstile, Gravatar, reCAPTCHA, hCaptcha, Wordfence, WPForms, Ninja Forms reCAPTCHA, WooCommerce Attribution) are stored as Necessary rules and they survive a save without issue. The hole was strictly in the admin JS that builds the dropdown for the Custom Blocking Rules table: that array hardcoded analytics, marketing, functional, performance, and Necessary was silently absent from the picker even though the backend would have persisted it.
In version 1.13.17 (out now) Necessary is in the dropdown. You can mark googletagmanager.com or any other always-on script as Necessary and it loads unconditionally regardless of consent state. The auto-scanner already respects the rule (it categorises only into the categories you have not pre-claimed via custom rules), so a rule that points googletagmanager.com at Necessary will keep being honoured across re-scans rather than being moved back into Analytics. The same applies to gtm.start and the inline GTM bootstrap once you point them at Necessary by URL pattern or handle.
I considered pre-populating googletagmanager.com, gtm.start and dataLayer as Necessary out of the box and decided against it for now — those identifiers genuinely belong in Analytics on many sites (the GDPR-cautious posture is “load GTM only after consent”), and shipping them as Necessary by default would silently override that consent boundary for installs that did not opt into it. The right move is to expose Necessary in the dropdown — which 1.13.17 does — and let each admin pick the trade-off explicitly for their site.
Best,
Fabio