{"id":389015,"date":"2026-10-30T12:57:01","date_gmt":"2026-10-30T12:57:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/crumbsignal\/"},"modified":"2026-10-30T12:56:34","modified_gmt":"2026-10-30T12:56:34","slug":"crumbsignal","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/crumbsignal\/","author":23585465,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"CrumbSignal","header_author":"IDE Solutions LLC","header_description":"Privacy-first cookie consent, script controls, Google Consent Mode v2, and data layer signals for WordPress.","assets_banners_color":"4f4a6a","last_updated":"2026-10-30 12:56:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/idesolutions.io\/products\/crumbsignal\/","header_author_uri":"https:\/\/idesolutions.io\/","rating":0,"author_block_rating":0,"active_installs":10,"downloads":54,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"idesolutions","date":"2026-10-30 12:56:34","revision":3775287}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3775287,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3775287,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3775287,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3775287,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3775287,"resolution":"1","location":"assets","locale":"","width":1920,"height":1200},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3775287,"resolution":"2","location":"assets","locale":"","width":1920,"height":1200},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3775287,"resolution":"3","location":"assets","locale":"","width":1698,"height":1955},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3775287,"resolution":"4","location":"assets","locale":"","width":1698,"height":1604},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3775287,"resolution":"5","location":"assets","locale":"","width":1698,"height":1987},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3775287,"resolution":"6","location":"assets","locale":"","width":1698,"height":1263}},"screenshots":{"1":"The visitor-facing consent banner with Accept, Reject, and Customize actions.","2":"The granular cookie preferences panel, opened from Customize or the revisit button.","3":"The CrumbSignal settings screen: General tab (consent duration, banner position, GPC\/DNT).","4":"The Google &amp; GTM tab: GTM\/GA4\/Ads IDs and Basic vs. Advanced Consent Mode.","5":"The Script Gating tab: the markup that holds a script until consent, and the cookies to clear on withdrawal.","6":"The Design tab: accent, background, text and button colors with a contrast check."}},"plugin_section":[],"plugin_tags":[232,223629,16626,23294,396],"plugin_category":[36,54],"plugin_contributors":[289757],"plugin_business_model":[],"class_list":["post-389015","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-consent-mode","plugin_tags-cookie-consent","plugin_tags-google-tag-manager","plugin_tags-privacy","plugin_category-analytics","plugin_category-security-and-spam-protection","plugin_contributors-idesolutions","plugin_committers-idesolutions"],"banners":{"banner":"https:\/\/ps.w.org\/crumbsignal\/assets\/banner-772x250.png?rev=3775287","banner_2x":"https:\/\/ps.w.org\/crumbsignal\/assets\/banner-1544x500.png?rev=3775287","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/crumbsignal\/assets\/icon-128x128.png?rev=3775287","icon_2x":"https:\/\/ps.w.org\/crumbsignal\/assets\/icon-256x256.png?rev=3775287","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/crumbsignal\/assets\/screenshot-1.png?rev=3775287","caption":"The visitor-facing consent banner with Accept, Reject, and Customize actions."},{"src":"https:\/\/ps.w.org\/crumbsignal\/assets\/screenshot-2.png?rev=3775287","caption":"The granular cookie preferences panel, opened from Customize or the revisit button."},{"src":"https:\/\/ps.w.org\/crumbsignal\/assets\/screenshot-3.png?rev=3775287","caption":"The CrumbSignal settings screen: General tab (consent duration, banner position, GPC\/DNT)."},{"src":"https:\/\/ps.w.org\/crumbsignal\/assets\/screenshot-4.png?rev=3775287","caption":"The Google &amp; GTM tab: GTM\/GA4\/Ads IDs and Basic vs. Advanced Consent Mode."},{"src":"https:\/\/ps.w.org\/crumbsignal\/assets\/screenshot-5.png?rev=3775287","caption":"The Script Gating tab: the markup that holds a script until consent, and the cookies to clear on withdrawal."},{"src":"https:\/\/ps.w.org\/crumbsignal\/assets\/screenshot-6.png?rev=3775287","caption":"The Design tab: accent, background, text and button colors with a contrast check."}],"raw_content":"<!--section=description-->\n<p>CrumbSignal is a self-hosted WordPress consent manager. It stores consent in a first-party cookie, keeps configured scripts inactive until the matching category is accepted, and communicates visitor choices to Google tags.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Accept all, reject optional, and granular preferences<\/li>\n<li>Necessary, preferences, analytics, and marketing categories<\/li>\n<li>Google Consent Mode v2 defaults and updates<\/li>\n<li>Google Tag Manager, GA4, and Google Ads IDs<\/li>\n<li>Basic and advanced Google consent configurations<\/li>\n<li>dataLayer events for custom GTM triggers<\/li>\n<li>Category-based script gating with a simple markup attribute (no code is entered or stored in the plugin)<\/li>\n<li>First-party cookie cleanup rules when consent is withdrawn<\/li>\n<li>Global Privacy Control support<\/li>\n<li>Optional \"banner off\" mode: show no banner but keep your scripts running (for sites where consent isn't required)<\/li>\n<li>Accessible modal, focus management, and reduced-motion support<\/li>\n<li>Custom colors, copy, and position<\/li>\n<li>No account, external dashboard, or pageview limits<\/li>\n<\/ul>\n\n<p>CrumbSignal is a technical consent tool. Correct configuration and accurate privacy disclosures remain the website owner's responsibility. This plugin does not provide legal advice or guarantee compliance with any law.<\/p>\n\n<h4>External services<\/h4>\n\n<p>CrumbSignal itself sends no data anywhere and has no account, dashboard or remote API. The only third-party resources it can load are Google's, and only if the site owner enters a Google Tag Manager, GA4 or Google Ads ID in Settings &gt; CrumbSignal &gt; Google &amp; GTM.<\/p>\n\n<p><strong>Google Tag Manager and the Google tag (gtag.js)<\/strong><\/p>\n\n<ul>\n<li>What it is: Google's tag-loading scripts, <code>https:\/\/www.googletagmanager.com\/gtm.js<\/code> (Tag Manager) and <code>https:\/\/www.googletagmanager.com\/gtag\/js<\/code> (GA4 and Google Ads), plus the <code>https:\/\/www.googletagmanager.com\/ns.html<\/code> noscript fallback when Advanced Consent Mode is on.<\/li>\n<li>When it loads: in Basic Consent Mode, only after the visitor accepts Analytics or Marketing. In Advanced Consent Mode, on page load, with all consent signals set to denied until the visitor chooses.<\/li>\n<li>What is sent: the visitor's browser requests the script from Google, so Google receives the visitor's IP address and browser details. CrumbSignal also tells the Google tag the visitor's consent choices (Google Consent Mode). Whatever the tags in your own Tag Manager container or GA4 \/ Ads property then collect is governed by your configuration and Google's terms.<\/li>\n<li>Google Terms of Service: https:\/\/policies.google.com\/terms<\/li>\n<li>Google Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p>Any other third-party script you mark for gating yourself loads from the address you give it, and only after the visitor accepts its category. You are responsible for disclosing those services to your visitors.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>crumbsignal<\/code> folder to <code>\/wp-content\/plugins\/<\/code> or install the ZIP from Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate CrumbSignal.<\/li>\n<li>Open Settings &gt; CrumbSignal.<\/li>\n<li>Configure banner copy and Google tags, and mark any other scripts that require consent with a category attribute.<\/li>\n<li>Test Accept, Reject, and Customize in a private browser window before publishing.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20crumbsignal%20scan%20my%20website%20for%20cookies%3F\"><h3>Does CrumbSignal scan my website for cookies?<\/h3><\/dt>\n<dd><p>No. Version 1 focuses on transparent, deterministic control of configured scripts. Automated scanners can miss scripts or classify them incorrectly.<\/p><\/dd>\n<dt id=\"does%20google%20tag%20manager%20load%20before%20consent%3F\"><h3>Does Google Tag Manager load before consent?<\/h3><\/dt>\n<dd><p>In Advanced Consent Mode, the container may load with denied consent defaults. In Basic Consent Mode, CrumbSignal only loads the configured GTM container after analytics or marketing consent. Consent defaults are established before either mode loads Google tags.<\/p><\/dd>\n<dt id=\"what%20datalayer%20events%20are%20available%3F\"><h3>What dataLayer events are available?<\/h3><\/dt>\n<dd><p>crumbsignal_ready fires after the default or stored consent state is established. <code>crumbsignal_consent_update<\/code> fires when the visitor saves a choice. Both include consent booleans for analytics, marketing, and preferences.<\/p><\/dd>\n<dt id=\"can%20i%20control%20scripts%20added%20outside%20crumbsignal%3F\"><h3>Can I control scripts added outside CrumbSignal?<\/h3><\/dt>\n<dd><p>Yes. CrumbSignal does not store or print scripts for you; it gates the ones you add yourself. Change the script type to <code>text\/plain<\/code>, add <code>data-crumbsignal-category=\"analytics\"<\/code> (or preferences\/marketing), and move an external URL from <code>src<\/code> to <code>data-src<\/code>. The Script Gating tab also lets you list the cookie names those scripts set, so they are cleared when a visitor withdraws consent.<\/p><\/dd>\n<dt id=\"can%20i%20use%20a%20footer%20link%20instead%20of%20the%20floating%20button%3F\"><h3>Can I use a footer link instead of the floating button?<\/h3><\/dt>\n<dd><p>Yes. Turn off \"Show the floating privacy choices button\" in Settings &gt; CrumbSignal &gt; General, then add the <code>[crumbsignal_preferences]<\/code> shortcode (optionally <code>label=\"Your Privacy Choices\"<\/code>) to a footer widget or page. You can also point any menu item at a URL ending in <code>#crumbsignal-preferences<\/code> (for example <code>#crumbsignal-preferences<\/code> or <code>https:\/\/example.com\/#crumbsignal-preferences<\/code>), or give any link or button the class <code>crumbsignal-open-preferences<\/code>. Clicking it reopens the preferences popup.<\/p><\/dd>\n<dt id=\"will%20page%20caching%20affect%20the%20cookie%20banner%20or%20consent%20signals%3F\"><h3>Will page caching affect the cookie banner or consent signals?<\/h3><\/dt>\n<dd><p>CrumbSignal reads and writes consent entirely in the visitor's browser: a first-party cookie plus a small bootstrap script that runs before any other script, both served as part of the normal (cacheable) page HTML. A correctly configured cache does not need to exclude pages using CrumbSignal. The one thing to check is whether your host or a JS-optimization plugin rewrites, defers, combines, or strips inline <code>&lt;script&gt;<\/code> tags \u2014 if so, exclude the <code>crumbsignal-consent-bootstrap<\/code> script (and the consent-gated <code>data-crumbsignal-category<\/code> scripts) from that optimization, since they must run unmodified and in order.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial security-reviewed release.<\/li>\n<li>\"Turn the banner off but keep my scripts running\" (Settings &gt; General). CrumbSignal shows no banner and runs your analytics, marketing and preferences scripts for every visitor without asking. It still respects a choice a visitor already made, and Global Privacy Control or Do Not Track when those options are on. For sites where consent isn't required (you remain responsible for compliance). Saved settings that lack the option keep the banner on.<\/li>\n<\/ul>","raw_excerpt":"Clear consent. Clean signals. A customizable cookie banner that holds optional scripts until consent and connects to Google Consent Mode v2.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/389015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=389015"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/idesolutions"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=389015"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=389015"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=389015"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=389015"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=389015"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=389015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}