{"id":398248,"date":"2026-11-05T17:18:02","date_gmt":"2026-11-05T17:18:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/harvify-cookie-consent\/"},"modified":"2026-11-05T17:17:40","modified_gmt":"2026-11-05T17:17:40","slug":"harvify-cookie-consent","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/harvify-cookie-consent\/","author":23508132,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.27","stable_tag":"1.0.27","tested":"7.1.4","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"Harvify Cookie Consent","header_author":"harv","header_description":"Lightweight, self-hosted GDPR cookie consent banner. Visitors' consent records stay in your own database.","assets_banners_color":"758097","last_updated":"2026-11-05 17:17:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":53,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.27":{"tag":"1.0.27","author":"jethalal","date":"2026-11-05 17:17:40","revision":3786457}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3786457,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3786457,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3786457,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3786457,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3786457,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.27"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3786457,"resolution":"1","location":"assets","locale":"","width":1078,"height":1058},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3786457,"resolution":"2","location":"assets","locale":"","width":1078,"height":1014},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3786457,"resolution":"3","location":"assets","locale":"","width":1078,"height":1277},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3786457,"resolution":"4","location":"assets","locale":"","width":1280,"height":800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3786457,"resolution":"5","location":"assets","locale":"","width":1078,"height":1335}},"screenshots":{"1":"The consent dashboard: banner state, categories and the record of every\nanswer, on your own database.","2":"The cookie scanner finds what your site actually sets and categorises it\nagainst a known-cookie database.","3":"Free and Pro side by side, generated from the features that are actually\nimplemented.","4":"The consent banner as your visitors see it, with Accept, Reject and Settings\ngiven equal weight.","5":"The cookie declaration table, generated from the cookies your site actually\nsets."}},"plugin_section":[],"plugin_tags":[166295,20272,16626,131785,396],"plugin_category":[54],"plugin_contributors":[280380],"plugin_business_model":[],"class_list":["post-398248","plugin","type-plugin","status-publish","hentry","plugin_tags-ccpa","plugin_tags-cookie-banner","plugin_tags-cookie-consent","plugin_tags-gdpr","plugin_tags-privacy","plugin_category-security-and-spam-protection","plugin_contributors-jethalal","plugin_committers-jethalal"],"banners":{"banner":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/banner-772x250.png?rev=3786457","banner_2x":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/banner-1544x500.png?rev=3786457","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/icon.svg?rev=3786457","icon":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/icon.svg?rev=3786457","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/screenshot-1.png?rev=3786457","caption":"The consent dashboard: banner state, categories and the record of every\nanswer, on your own database."},{"src":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/screenshot-2.png?rev=3786457","caption":"The cookie scanner finds what your site actually sets and categorises it\nagainst a known-cookie database."},{"src":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/screenshot-3.png?rev=3786457","caption":"Free and Pro side by side, generated from the features that are actually\nimplemented."},{"src":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/screenshot-4.png?rev=3786457","caption":"The consent banner as your visitors see it, with Accept, Reject and Settings\ngiven equal weight."},{"src":"https:\/\/ps.w.org\/harvify-cookie-consent\/assets\/screenshot-5.png?rev=3786457","caption":"The cookie declaration table, generated from the cookies your site actually\nsets."}],"raw_content":"<!--section=description-->\n<p>Harvify Cookie Consent adds a cookie consent banner to your WordPress site: it\nasks visitors which cookies they allow, holds back known tracking scripts until\nthey answer, and keeps a record of each answer. Unlike SaaS alternatives, your\nvisitors' consent records are kept in your own WordPress database and are not sent\nto any outside service, and there is no monthly fee. The plugin's only outbound\nconnection is to Freemius, and only if you opt in or activate a Pro licence -- see\nExternal services below.<\/p>\n\n<p><strong>Free features:<\/strong><\/p>\n\n<ul>\n<li>8 professional banner templates, all 4 positions (bottom, top, center, corner)<\/li>\n<li>Full banner customization (colors, logo, text)<\/li>\n<li>Three-button flow: Accept All \/ Reject All \/ Settings<\/li>\n<li>Cookie categories: Necessary, Analytics, Marketing, Preferences<\/li>\n<li>Consent logging to your database (GDPR audit trail, SHA-256 IP hashing)<\/li>\n<li>Geo-targeting (EU, UK, EEA, California, Canada, Brazil): ask for consent only\nin the regions you choose. (California asks every visitor from the US: a state\ncannot be told from the country.) It needs your host or CDN to pass the visitor's\ncountry (Cloudflare does this), or a MaxMind GeoLite2 database; when the\ncountry cannot be told, the visitor is asked.<\/li>\n<li>Google Consent Mode v2 (GTM \/ GA4 \/ Ads signals)<\/li>\n<li>Script\/tag blocking by category: GA4, Google Ads, the Meta (Facebook) Pixel,\nHotjar, LinkedIn Insight, TikTok, HubSpot and Microsoft Clarity are held until\nthe visitor allows their category -- including the inline tags most of them\ninstall with<\/li>\n<li><strong>Cookie scanner<\/strong> \u2014 detect cookies and auto-categorise them against a\nknown-cookie database<\/li>\n<li><strong>Deep scan across your pages<\/strong> \u2014 the scanner crawls the front page, your menu\nand the WooCommerce pages rather than checking one page, and reports which\npage each cookie was seen on.<\/li>\n<li><strong>Consent statistics<\/strong> \u2014 accept\/partial\/reject rates and per-category opt-in\nrates<\/li>\n<li>Cookie declaration table shortcode: [harvify_cookie_declaration]<\/li>\n<li><strong>Cookie-policy page generator<\/strong> \u2014 one click creates a draft cookie-policy\npage from your declared cookies, with the declaration table embedded live. It\nis a starting template to review and adapt, not legal advice.<\/li>\n<li>Policy version + force re-consent, import\/export, preferences modal<\/li>\n<li>Multi-language via WPML \/ Polylang<\/li>\n<li><strong>Vanilla JavaScript<\/strong> \u2014 no jQuery dependency, works with any theme<\/li>\n<\/ul>\n\n<p><strong>Pro features (included in Harvify Pro Bundle):<\/strong><\/p>\n\n<ul>\n<li><strong>Scheduled automatic cookie re-scans<\/strong> \u2014 get emailed when new, undeclared\ncookies appear<\/li>\n<li><strong>Advanced consent analytics<\/strong> \u2014 historical opt-in\/opt-out trends, segmented\nby category and region, with CSV export<\/li>\n<li><strong>Consent-record audit export<\/strong> \u2014 filterable CSV of individual consent records\n(UUID, hashed IP, categories, policy version, timestamps) for compliance \/\nDSAR proof<\/li>\n<li><strong>White-label<\/strong> \u2014 remove the Harvify credit from the admin footer of the\nplugin\u2019s own screens<\/li>\n<li><strong>Policy auto-update + versioning<\/strong> \u2014 a material data change bumps the policy\nversion, which re-prompts consent, and rebuilds an unedited page.<\/li>\n<li>Optional weekly consent-summary email<\/li>\n<li><strong>Multi-language policy generation<\/strong> \u2014 generate the cookie-policy page in any\nlanguage your site has translations installed for<\/li>\n<li>Custom CSS for the banner<\/li>\n<\/ul>\n\n<p><strong>Harvify Pro Bundle:<\/strong>\nOne subscription unlocks Pro features across all Harvify plugins. The\ncurrent price and what it covers are shown on the plugin's own Plan screen.\nInstall only the tools your site needs.<\/p>\n\n<h4>Setting up the banner<\/h4>\n\n<ol>\n<li>Go to <strong>Harvify \u2192 Cookie Consent<\/strong>. The <strong>Banner<\/strong> tab opens.<\/li>\n<li>Choose a template and a position, and adjust the wording if you want to.<\/li>\n<li>On the <strong>Compliance<\/strong> tab, check that <strong>Script blocking<\/strong> and <strong>Google Consent\nMode v2<\/strong> are on (they are for a new install), and pick <strong>Geo-targeting<\/strong>\nregions if you only want to ask visitors from certain places.<\/li>\n<li>On the <strong>Cookies<\/strong> tab, click <strong>Scan my site (up to 8 pages)<\/strong>, then <strong>Add all\nobserved to declaration<\/strong>, so the declaration table lists your cookies.<\/li>\n<li>Click <strong>Save changes<\/strong> on each tab you change.<\/li>\n<\/ol>\n\n<p>Visit your site in a private window to see the banner. Accept, reject or choose\nsettings, and the answer appears on the <strong>Insights<\/strong> tab.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to Freemius, the licensing and update service Harvify uses to\nsell and deliver the Pro tier of its plugins.<\/p>\n\n<p>Nothing is sent to Freemius unless you choose to send it. On activation you are shown\nFreemius's standard opt-in screen. Until you answer it a fresh install makes no\noutbound request at all, and if you choose Skip the free tier stays fully usable\nand still sends nothing. Data is transmitted only when you take one of these\nactions:<\/p>\n\n<ul>\n<li><strong>You click \"Allow &amp; Continue\" on the Freemius opt-in screen.<\/strong> This sends your\nsite address, your administrator email address, and your WordPress, PHP and active\nplugin\/theme details, so Harvify can provide support and know which environments to\ntest against. Skipping that screen sends nothing and leaves the plugin working\nnormally.<\/li>\n<li><strong>You enter a Pro Bundle licence key.<\/strong> This sends the key together with your site\naddress so the licence can be activated for that site. While a licence is active the\nsite also re-checks periodically that it is still valid and whether a Pro update is\navailable.<\/li>\n<\/ul>\n\n<p>Service provided by Freemius, Inc. - https:\/\/freemius.com\/\nTerms of service: https:\/\/freemius.com\/terms\/\nPrivacy policy: https:\/\/freemius.com\/privacy\/<\/p>\n\n<h4>Cookie scanner<\/h4>\n\n<p>The deep scan requests pages on your own site over a loopback connection and reads the\ncookies those responses set. It is restricted to your own host and contacts no third\nparty. The third-party names it reports - analytics, pixels, embeds and similar - are\nrecognised from markup already present on your pages, not looked up anywhere: the scanner\nlooks in your pages' HTML for the addresses those services load from (for example\ngoogle-analytics.com, googletagmanager.com, connect.facebook.net, js.stripe.com or\nmaps.googleapis.com). Those addresses are text it searches for. The plugin never requests\nthem, and sends nothing to those services.<\/p>\n\n<h4>Script blocking<\/h4>\n\n<p>When a visitor has not consented to a category, the plugin holds back the scripts your\nsite already loads from services in that category (the same addresses as above), and\nreleases them in the visitor's browser only after they consent. The plugin itself loads\nno script from any of these services.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code> or install via WordPress.org.<\/li>\n<li>Activate the plugin.<\/li>\n<li>The cookie consent banner will appear automatically on your site.<\/li>\n<li>Configure settings under Harvify \u2192 Cookie Consent.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20make%20my%20site%20gdpr%20compliant%3F\"><h3>Does this plugin make my site GDPR compliant?<\/h3><\/dt>\n<dd><p>It provides the technical mechanism for cookie consent, which is one part of\nGDPR compliance. You must also have a privacy policy and cookie policy page.\nConsent logging for audit trails is included free.<\/p><\/dd>\n<dt id=\"where%20is%20consent%20data%20stored%3F\"><h3>Where is consent data stored?<\/h3><\/dt>\n<dd><p>Consent preferences are stored in the visitor's browser cookie and logged to\nyour own WordPress database for an audit trail. Consent records are never sent to\nany outside service. (The plugin's only outbound connection, to Freemius, happens\nonly if you opt in or enter a licence key, and carries no consent records -- see\nExternal services.)<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20plugins%3F\"><h3>Does it work with caching plugins?<\/h3><\/dt>\n<dd><p>The consent banner is rendered client-side via JavaScript, so it works with\npage caching. The consent cookie is set via JavaScript, not PHP. With\ngeo-targeting on, the banner asks your server whether each visitor needs to be\nasked, so a cached page never hands one visitor's answer to another.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. WooCommerce's default cookies (cart, session) are classified as Necessary.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.27<\/h4>\n\n<ul>\n<li><strong>Changed: requires WordPress 6.9 or later.<\/strong> The bundled Action Scheduler library is\nupdated to its latest release, 4.2.0, which requires WordPress 6.9.<\/li>\n<li><strong>Changed: script blocking now works through WordPress's own page output buffer<\/strong>\n(added in WordPress 6.9) instead of opening a buffer of its own.<\/li>\n<li><strong>Fixed: activation could not update the consent log table.<\/strong> The table definition\nnow uses the format WordPress's table installer reads, so a missing index or column is\nadded back on activation.<\/li>\n<li><strong>Corrected: the description said no data leaves your site.<\/strong> Your visitors' consent\nrecords stay in your own database; the only outbound connection is to Freemius, and only\nif you opt in or activate a Pro licence (see External services). The readme now also\nexplains that the third-party addresses the scanner and script blocking recognise are\nnever contacted by the plugin.<\/li>\n<\/ul>\n\n<h4>1.0.26<\/h4>\n\n<ul>\n<li><strong>Fixed: in the corner, the third button ran past the edge of the banner.<\/strong> With\nlonger button labels \"Settings\" was drawn outside the box, where it could not be\nread. The buttons now wrap inside the banner.<\/li>\n<li><strong>Fixed: the Fullscreen template showed its title at the top of the screen and\nits buttons half a screen below.<\/strong> The message and its buttons now sit together\nin the middle.<\/li>\n<li><strong>Fixed: on phones every banner had a large empty space between its words and its\nbuttons<\/strong>, and took up most of the screen. The corner and centered banners now fit\nthe width of the phone.<\/li>\n<li><strong>Fixed: on themes that pad every button (Storefront among them) the preferences'\nclose button was stretched wide<\/strong>, with the \u00d7 in one corner of it.<\/li>\n<\/ul>\n\n<h4>1.0.25<\/h4>\n\n<ul>\n<li><strong>Fixed: script blocking held only tags loaded with a <code>src<\/code>.<\/strong> The Meta Pixel,\nHotjar, LinkedIn, TikTok and Microsoft Clarity install as inline scripts that add\nthe vendor's file themselves, and all five loaded before the visitor chose\nanything. Every script is now judged by what it loads, inline or not.<\/li>\n<li><strong>Fixed: Google Ads was treated as analytics<\/strong>, so it loaded for a visitor who\nallowed analytics only. A gtag.js tag with an <code>AW-<\/code> id is advertising.<\/li>\n<li><strong>Fixed: the banner's text colour.<\/strong> The title and description ignored it, so a\nlight banner showed white text on white. The Settings link now uses it too.<\/li>\n<li><strong>Fixed: saving the Banner tab turned a transparent Reject button black.<\/strong><\/li>\n<li><strong>Fixed: the preferences.<\/strong> Save Preferences now closes them; they can be closed\nwithout saving (Escape or the close button); keyboard focus moves into them and\nstays there while they are open.<\/li>\n<li><strong>Fixed: the button to change a choice<\/strong> now appears as soon as the choice is\nmade, not on the next page.<\/li>\n<li><strong>Fixed: the Minimal template hid the Reject button.<\/strong> Every template now shows\nAccept, Reject and Settings. The Top Bar template now sits at the top, and the\nFullscreen template's description no longer promises categories it does not show.<\/li>\n<li><strong>Fixed: the banner linked to the cookie-policy page while it was still a\ndraft<\/strong>, so visitors got a \"not found\" page. It links the page once you publish it.<\/li>\n<li><strong>Fixed: removing a cookie from the declaration and adding another could lose a\nthird.<\/strong><\/li>\n<li><strong>Fixed: a save or an import the server refused was reported as done.<\/strong> The\nscreen now says it failed, and why.<\/li>\n<\/ul>\n\n<h4>1.0.24<\/h4>\n\n<ul>\n<li><strong>Consent is now recorded.<\/strong> The banner was never told where to send a\nvisitor's choice, so the consent log -- and the consent statistics built on it\n-- stayed empty for real visitors. A visitor who changes their mind now updates\ntheir record instead of adding a new one.<\/li>\n<li><strong>Geo-targeting works.<\/strong> The regions could be chosen but were never applied.\nVisitors outside the chosen regions now see no banner and nothing is blocked\nfor them; a visitor whose country cannot be told is always asked. The settings\nscreen shows whether your server can tell visitors' countries.<\/li>\n<li><strong>The Script blocking and Google Consent Mode switches now do what they say.<\/strong>\nBoth features used to run whatever the switches said. A new install has both\non; an existing site keeps the setting it saved.<\/li>\n<li><strong>Fixed: the server never recognised a visitor's consent.<\/strong> PHP changes the\n\".\" in the consent cookie's name, so the plugin looked for a cookie that never\narrives, and script blocking kept holding back a visitor's scripts on every\npage even after they accepted.<\/li>\n<li><strong>Fixed: scripts held back by script blocking now run once the visitor\nconsents.<\/strong> A released script kept the \"do not run\" type it was held back\nwith, so it never ran.<\/li>\n<li><strong>Fixed: Google Consent Mode's \"denied\" defaults now reach the page.<\/strong> They\nwere added too late in the page head and were never printed. Visitors outside\nyour geo-targeting regions are not sent them.<\/li>\n<li><strong>Fixed: banner text could not be translated with WPML or Polylang<\/strong> -- the\ntranslation file pointed at a setting that did not exist.<\/li>\n<li><strong>Pro: scheduled re-scans and the weekly summary now run.<\/strong> They were being\nrescheduled on every page view, so they never came due.<\/li>\n<li><strong>Settings import is checked field by field<\/strong>, like a normal save.<\/li>\n<li><strong>Internal names now start with <code>harvify_cookie_<\/code><\/strong> instead of <code>hcc_<\/code>, as\nWordPress.org requires. Your settings, policy page and scheduled jobs are\ncarried across automatically, and <code>[hcc_cookie_declaration]<\/code> becomes\n  [harvify_cookie_declaration] (the same table) in your pages and widgets, and\n-- in the background, a little at a time -- in page-builder data such as\nElementor's. Nothing to change by hand.<\/li>\n<li><strong>Custom CSS is now part of Pro<\/strong>, as is generating the policy in another\nlanguage. CSS you already saved is kept: with a Pro licence it keeps working,\nand without one it is stored but not added to the banner.<\/li>\n<li><strong>Freemius now asks before connecting.<\/strong> On activation you see Freemius's\nstandard opt-in screen with a Skip button; skipping sends nothing and the\nplugin works as before.<\/li>\n<li>Readme: setup steps, and wording that describes what the plugin does rather\nthan promising compliance.<\/li>\n<\/ul>\n\n<h4>1.0.21<\/h4>\n\n<ul>\n<li>Added: a single <strong>Support<\/strong> entry in the Harvify menu, so you can reach us from\ninside WordPress. Until now no plugin offered a contact route at all. One entry for\nthe whole suite rather than one per plugin.<\/li>\n<li>No behaviour changes.<\/li>\n<\/ul>\n\n<h4>1.0.20<\/h4>\n\n<ul>\n<li>Added: an <strong>External services<\/strong> section to this readme, naming every third-party\nservice the plugin can contact, exactly what is sent, when, and each provider's terms\nand privacy policy. Required for WordPress.org submission.<\/li>\n<li>Changed: the <code>Contributors<\/code> field now names the correct WordPress.org account.<\/li>\n<li>No behaviour changes.<\/li>\n<\/ul>\n\n<h4>1.0.19<\/h4>\n\n<ul>\n<li>Fixed: deactivating the plugin now cancels the scheduled cookie re-scan and the\nweekly summary. They were left queued, so they went on firing against a plugin\nthat was switched off -- doing nothing, but filling the Scheduled Actions log\nwith failures.<\/li>\n<\/ul>\n\n<h4>1.0.18<\/h4>\n\n<ul>\n<li>Changed: the readme no longer quotes a fixed subscription price. What the bundle\ncosts and what it covers are shown on the plugin's own Plan screen, which is the\none place that stays correct when pricing changes.<\/li>\n<\/ul>\n\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>Added: a single <strong>Manage licence<\/strong> link on the Plan screen, so an active customer can\ndeactivate this site, change their licence key or re-check their licence without\nneeding a URL from support. No per-plugin Account tab is added.<\/li>\n<\/ul>\n\n<h4>1.0.16<\/h4>\n\n<ul>\n<li>Fixed: opting in to \"delete all data on uninstall\" now removes hcc_db_version.\nIt was written at runtime but never included in the cleanup, so a user who\nasked for their data to be deleted kept it.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li><strong>Fixed: updating the plugin did not update its database.<\/strong> WordPress only runs a plugin's\nsetup routine when you <em>activate<\/em> it, never when it updates - so a change to the plugin's own\ntables never reached sites that had simply updated. On those sites some features failed with a\ndatabase error. The update now applies itself on the next page load.<\/li>\n<li><strong>One upgrade link instead of one per plugin.<\/strong> With several Harvify plugins active the\nmenu showed a row called \"Upgrade\" for each of them, all identically labelled, and it kept\nsaying Upgrade to people who had already bought. They are replaced by a single <strong>Plan<\/strong>\nscreen that says what the bundle costs, what it covers, and whether your licence is active.<\/li>\n<li><strong>The dashboard is quiet again.<\/strong> Each plugin used to add its own \"opt in to make this\nbetter\" notice to the main WordPress dashboard, so five plugins meant five notices. Harvify\nplugins now share one queue: promotional notices appear only on Harvify's own screens, and\nonly one at a time. Licence and account messages are never held back.<\/li>\n<li><strong>Fixed: the \"Data &amp; uninstall\" box covered the page.<\/strong> It was being drawn into the admin\nfooter, which WordPress pins to the bottom of the screen, so it floated on top of whatever was\nunderneath it. It now sits in the page like any other card. Saving it also tells you what it\nsaved, instead of just reloading.<\/li>\n<li><strong>Fixed: the upgrade screen advertised the wrong number of sites.<\/strong> Several plugins listed\nthe Freelancer and Agency plans as covering 5 and 25 sites. They cover 3 and 10.<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>The plugin ZIP no longer carries the shared packages' own unit tests. A stale <code>tests\/<\/code>\ndirectory had been committed inside <code>vendor\/harvify\/<\/code>, and the packager copied it straight\ninto the download. Nothing executable changed; the artifact is smaller and cleaner.<\/li>\n<li><strong>Deleting the plugin left its database tables behind, on every site, since 1.0.0.<\/strong> The main\nplugin file used a variable named <code>$file<\/code> while loading its includes. WordPress runs\n  include_once on that file from INSIDE its own <code>uninstall_plugin()<\/code> function, so the\nassignment overwrote WordPress's <code>$file<\/code>; core then fired its uninstall action under a nonsense\nname, the cleanup callback was never reached, and the plugin's tables, options and scheduled\nevents survived deletion forever. The loader variable is now prefixed.<\/li>\n<li><strong>The public \"Powered by Harvify\" credit is gone from the cookie banner.<\/strong> WordPress.org\nrequires a front-end credit to be off by default and opt-in, and a credit that is off by\ndefault cannot be sold as a Pro removal -- so the line is removed from the product rather than\ndefaulted off, along with the <code>hcc_banner_credit<\/code> filter. <strong>White-label (Pro) is unchanged in\nvalue and now targets the ADMIN FOOTER credit<\/strong> on the plugin's own screens: admin-only agency\nde-branding for client handover, with no public surface.<\/li>\n<li><strong>The published free ZIP would have failed Plugin Check even though the source passes.<\/strong>\nFreemius's code preprocessor rewrites the main plugin file and drops block comments that sit\ninside an expression, which deletes a <code>translators:<\/code> comment and produces a\nMissingTranslatorsComment ERROR in the artifact. The comment now sits above a statement.<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>Fixed (Pro): <strong>the policy version did not bump on a site's very first save.<\/strong> Auto-update\nlistened only for changes to an existing settings record, and WordPress signals the first save\ndifferently \u2014 so the one save where the bump matters most was missed. Because the consent\ncookie name embeds the policy version, that meant returning visitors were not re-prompted\nafter the policy changed.<\/li>\n<li>A drill now proves it in the failure direction: it deletes the settings record so the next\nwrite really is a first save, and reproduces the old behaviour by unhooking the fix.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Removed the \"IAB TCF v2.2 (coming soon)\" line from the Pro feature list. The feature is\ndeferred for a genuine external cost and has no delivery date, so listing it read as a\npromise we were not keeping. Nothing else changed; no feature was removed.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li><strong>Harvify \u2192 Tools<\/strong> now opens with a <strong>Your licences<\/strong> table: every installed Harvify plugin,\nthe plan it is on, whether Pro features are actually running, and a link to its Account screen.\nFreemius gives each product its own separate Account page, so this is the one place that\nanswers \"what am I on\" across the whole bundle.<\/li>\n<li>The repeated <em>\"Opt in to make \u2026 better!\"<\/em> admin notice no longer appears. Licence, plan and\nupdate notices are unaffected \u2014 only the opt-in prompt is suppressed.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Change: License activation now uses per-plugin key entry \u2014 enter your bundle license key on each Pro plugin to unlock Pro. Improves activation reliability.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>New: deep scan (free) \u2014 crawls your site's key pages (front page, main-menu pages, WooCommerce shop\/cart\/product; up to 8) entirely server-side and reports what sets cookies. Nothing leaves your server. Findings are honestly labeled: cookies seen in real Set-Cookie responses are \"observed\"; cookies implied by a detected third-party script (Google Analytics\/Tag Manager, Facebook Pixel, YouTube, Hotjar, reCAPTCHA, Stripe, PayPal, TikTok, LinkedIn, X, Google Maps) are \"likely \u2014 verify\" and are never bulk-added: \"Add all\" adds observed cookies only, likely ones need per-row confirmation. Each finding shows which pages it was seen on; one click adds it to the declaration.<\/li>\n<li>Improved (Pro): the scheduled auto-scan now uses the same multi-page crawl engine for its new-undeclared-cookie email alerts (environment inference remains as fallback).<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>New: cookie-policy page generator (free). One click creates a draft cookie-policy page built from your declared cookies, categories, regions and (optional) business details \u2014 with the declaration table embedded as the live [hcc_cookie_declaration] shortcode so it never goes stale, and a \"Manage cookie preferences\" button that reopens the consent banner. The page is a clearly-labeled customizable starting template (not legal advice \u2014 review it for your jurisdiction); regenerating warns before replacing a page you have edited.<\/li>\n<li>New (Pro): generate the policy in any language your site has translations installed for, and optional auto-update \u2014 a material change to your cookie data bumps the policy version (visitors are re-asked for consent) and rebuilds the page unless you have hand-edited it.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>New admin design system (Harvify Admin Kit): branded header, first-run onboarding, section navigation (Banner, Compliance, Cookies, Insights, Settings), skeleton loaders, coaching empty states, a consent Insights panel (consents logged, opt-in rate, per-category opt-ins), and a contextual, dismissible upgrade card. UI layer only \u2014 the banner, consent logging, compliance features and free\/Pro gating are unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fix: Pro features now unlock only on the premium build with a valid license (per-plugin gate). Previously a shared bundle flag could make the free build report Pro when another Harvify plugin was licensed.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Internal: uninstall cleanup now runs on Freemius's after_uninstall hook (removed uninstall.php) for Freemius Deployment compatibility. What gets removed on uninstall is unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>New Pro tier (Harvify Pro Bundle): scheduled automatic cookie re-scans with email alerts on newly detected cookies; advanced consent analytics (historical trends + per-region segmentation + CSV); consent-record audit export (CSV) for compliance\/DSAR; white-label to remove the banner\/admin credit; optional weekly consent-summary email.<\/li>\n<li>Consent records now capture a best-effort country (for the Pro region analytics) and are covered by the WordPress privacy exporter\/eraser.<\/li>\n<li>The free tier is unchanged \u2014 all existing free features remain free.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Added a cookie scanner: detect cookies on your site and auto-categorise them against a known-cookie database, then add them to the declaration in one click.<\/li>\n<li>Added consent statistics: accept \/ partial \/ reject rates and per-category opt-in rates, aggregated from your local consent log.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Admin menu now registers on init (fixes a \"translation loaded too early\" notice under WordPress 6.7+).<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Free tier now includes consent logging, geo-targeting, Google Consent Mode v2, script blocking, 8 templates, and full customization (previously listed as Pro). IAB TCF v2.2 is the only Pro feature (coming soon).<\/li>\n<li>Removed the unused pro\/templates.php stub.<\/li>\n<li>Pricing now sourced from the shared bundle-license package; upgrade prompts link to the pricing page.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Consent banner with Accept All \/ Reject All \/ Settings flow.<\/li>\n<li>Cookie categories: Necessary, Analytics, Marketing, Preferences.<\/li>\n<li>Browser cookie storage.<\/li>\n<li>Admin settings page.<\/li>\n<li>Harvify Tools integration.<\/li>\n<\/ul>","raw_excerpt":"Lightweight, self-hosted GDPR cookie consent banner. Visitors' consent records stay in your own database.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/398248","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=398248"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jethalal"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=398248"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=398248"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=398248"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=398248"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=398248"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=398248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}