{"id":315682,"date":"2026-06-21T11:14:56","date_gmt":"2026-06-21T11:14:56","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/seoforge\/"},"modified":"2026-06-30T15:50:01","modified_gmt":"2026-06-30T15:50:01","slug":"brainwerk-seo-suite","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/brainwerk-seo-suite\/","author":23503111,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Brainwerk SEO Suite","header_author":"Stefan Kogelgruber","header_description":"Privacy-first WordPress SEO suite with built-in visitor analytics, source tracking, on-page analyzer, sitemap, redirects, 404-logger and Schema.org. Multisite-ready and GDPR-compliant.","assets_banners_color":"192245","last_updated":"2026-06-30 15:50:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/seoforge.brainwerk.at","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":95,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.7.5":{"tag":"0.7.5","author":"brainwerk","date":"2026-06-29 17:01:53"},"0.9.0":{"tag":"0.9.0","author":"brainwerk","date":"2026-06-29 17:26:26"},"1.0.0":{"tag":"1.0.0","author":"brainwerk","date":"2026-06-30 15:50:01"}},"upgrade_notice":{"1.0.0":"<p>Version 1.0! Reports are now dependency-free printable HTML (with a visitor-countries block), onboarding gains a GEO\/AEO step, accessibility is improved and schema migrations are hardened. Existing installs upgrade automatically.<\/p>","0.9.0":"<p>Generative Engine Optimization arrives: control AI crawlers, publish llms.txt, add FAQ schema and track AI-answer-engine traffic \u2014 plus free visitor-country analytics. Existing installs upgrade automatically.<\/p>","0.7.6":"<p>Multisite stats are now per-site: a new site selector switches between this site, the whole network, or any single subsite. Single-site installs are unaffected.<\/p>","0.6.0":"<p>Freemius integration is live. Existing Free installs keep working unchanged; Pro features require a license.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3580576,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3580576,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3580576,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3580576,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.7.5","0.9.0","1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3590080,"resolution":"1","location":"assets","locale":"","width":2071,"height":1113},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3590080,"resolution":"10","location":"assets","locale":"","width":1999,"height":871},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3590080,"resolution":"11","location":"assets","locale":"","width":1996,"height":808},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3590080,"resolution":"12","location":"assets","locale":"","width":2053,"height":610},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3590080,"resolution":"13","location":"assets","locale":"","width":1984,"height":544},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3590080,"resolution":"14","location":"assets","locale":"","width":2052,"height":1285},"screenshot-15.png":{"filename":"screenshot-15.png","revision":3590080,"resolution":"15","location":"assets","locale":"","width":2062,"height":1221},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3590080,"resolution":"2","location":"assets","locale":"","width":2005,"height":1240},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3590080,"resolution":"3","location":"assets","locale":"","width":2059,"height":1081},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3590080,"resolution":"4","location":"assets","locale":"","width":2074,"height":868},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3590080,"resolution":"5","location":"assets","locale":"","width":2074,"height":711},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3590080,"resolution":"6","location":"assets","locale":"","width":2079,"height":1276},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3590080,"resolution":"7","location":"assets","locale":"","width":2074,"height":406},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3590080,"resolution":"8","location":"assets","locale":"","width":2062,"height":1270},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3590080,"resolution":"9","location":"assets","locale":"","width":1992,"height":1021}},"screenshots":{"1":"Dashboard \u2014 pageviews, unique visitors, bounce rate and a visits-over-time chart.","2":"Top pages \u2014 hits and unique visitors per URL.","3":"Live recent-visits log \u2014 page, source, device and browser, cookie-free.","4":"Top pages and top traffic sources side by side.","5":"Traffic by source type \u2014 direct, search, social, referral and more.","6":"Hourly visits plus browser and operating-system breakdowns.","7":"Device split \u2014 mobile, desktop and tablet.","8":"On-page SEO analyzer with per-post focus-keyword scoring.","9":"AI-powered SEO suggestions \u2014 bring your own EU-based Mistral key.","10":"Meta tags, Open Graph, Twitter Cards and Schema.org JSON-LD.","11":"Redirect manager \u2014 301\/302\/307\/308 with exact or wildcard matching.","12":"404 log \u2014 turn any missing URL into a redirect in one click.","13":"Health check \u2014 tables, cron jobs and sitemap status at a glance.","14":"Pre-launch sanity check across every module.","15":"Tools \u2014 test e-mails, CSV import\/export and data cleanup."}},"plugin_section":[262246],"plugin_tags":[232,131785,727,186,1557],"plugin_category":[36,55],"plugin_contributors":[268198,78154],"plugin_business_model":[],"class_list":["post-315682","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-analytics","plugin_tags-gdpr","plugin_tags-redirect","plugin_tags-seo","plugin_tags-sitemap","plugin_category-analytics","plugin_category-seo-and-marketing","plugin_contributors-brainwerk","plugin_contributors-freemius","plugin_committers-brainwerk"],"banners":{"banner":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/banner-772x250.png?rev=3580576","banner_2x":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/banner-1544x500.png?rev=3580576","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/icon-128x128.png?rev=3580576","icon_2x":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/icon-256x256.png?rev=3580576","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-1.png?rev=3590080","caption":"Dashboard \u2014 pageviews, unique visitors, bounce rate and a visits-over-time chart."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-2.png?rev=3590080","caption":"Top pages \u2014 hits and unique visitors per URL."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-3.png?rev=3590080","caption":"Live recent-visits log \u2014 page, source, device and browser, cookie-free."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-4.png?rev=3590080","caption":"Top pages and top traffic sources side by side."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-5.png?rev=3590080","caption":"Traffic by source type \u2014 direct, search, social, referral and more."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-6.png?rev=3590080","caption":"Hourly visits plus browser and operating-system breakdowns."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-7.png?rev=3590080","caption":"Device split \u2014 mobile, desktop and tablet."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-8.png?rev=3590080","caption":"On-page SEO analyzer with per-post focus-keyword scoring."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-9.png?rev=3590080","caption":"AI-powered SEO suggestions \u2014 bring your own EU-based Mistral key."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-10.png?rev=3590080","caption":"Meta tags, Open Graph, Twitter Cards and Schema.org JSON-LD."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-11.png?rev=3590080","caption":"Redirect manager \u2014 301\/302\/307\/308 with exact or wildcard matching."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-12.png?rev=3590080","caption":"404 log \u2014 turn any missing URL into a redirect in one click."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-13.png?rev=3590080","caption":"Health check \u2014 tables, cron jobs and sitemap status at a glance."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-14.png?rev=3590080","caption":"Pre-launch sanity check across every module."},{"src":"https:\/\/ps.w.org\/brainwerk-seo-suite\/assets\/screenshot-15.png?rev=3590080","caption":"Tools \u2014 test e-mails, CSV import\/export and data cleanup."}],"raw_content":"<!--section=description-->\n<p><strong>SEO and visitor analytics that never sell you \u2014 or your visitors \u2014 out.<\/strong><\/p>\n\n<p>Brainwerk SEO Suite is the all-in-one SEO and analytics toolkit for WordPress that keeps <strong>100 % of your data on your own server<\/strong>. No cookies. No Google Analytics. No Facebook Pixel. No \"anonymous\" data brokering. Just clear, honest insight into how people find and use your site \u2014 plus everything you need to rank in search <em>and<\/em> in AI answer engines.<\/p>\n\n<h4>\ud83c\uddea\ud83c\uddfa Made in Europe. Made for Europe.<\/h4>\n\n<p>Engineered in the EU, to EU standards, with <strong>privacy-by-design built into every query<\/strong> \u2014 never bolted on afterwards. Your analytics never leave your infrastructure, so you stay in control of your data and your visitors' trust.<\/p>\n\n<ul>\n<li><strong>GDPR-ready out of the box<\/strong> \u2014 IP anonymisation, daily-rotating visitor hashes, DNT-aware, configurable retention and one-click erasure. In most setups, <strong>no cookie banner needed<\/strong>.<\/li>\n<li><strong>Built for NIS2-era governance<\/strong> \u2014 everything self-hosted, auditable and under your control, to support your GDPR and NIS2 data-governance obligations.<\/li>\n<li><strong>EU-based AI, optional<\/strong> \u2014 AI suggestions run on <strong>Mistral AI \ud83c\uddea\ud83c\uddfa<\/strong> with your own key, so even your AI workflow stays in Europe.<\/li>\n<li><strong>High-tech under the hood<\/strong> \u2014 pre-aggregated daily tables for sub-millisecond dashboards even past 100k+ visits\/month, hardened <code>%i<\/code> SQL, cached sitemap &amp; meta output, a REST API and full WP-CLI control.<\/li>\n<\/ul>\n\n<h4>Get found by search engines *and* AI<\/h4>\n\n<p>Search is changing. Brainwerk SEO Suite covers classic SEO <strong>and<\/strong> the new world of AI answer engines:<\/p>\n\n<ul>\n<li><strong>Generative Engine Optimization (GEO\/AEO)<\/strong> \u2014 control which AI crawlers may use your content (GPTBot, Google-Extended, ClaudeBot, PerplexityBot and more) straight from robots.txt, publish an <code>llms.txt<\/code> content manifest, add per-post FAQ schema (FAQPage + speakable), and see traffic arriving from ChatGPT, Gemini, Copilot, Perplexity &amp; Claude as its own source.<\/li>\n<li><strong>Meta engine<\/strong> \u2014 title, meta description, Open Graph, Twitter Cards, canonical, per-post overrides.<\/li>\n<li><strong>Schema.org JSON-LD<\/strong> \u2014 Article, Organization, BreadcrumbList, WebSite, FAQPage.<\/li>\n<li><strong>XML sitemap<\/strong> \u2014 chunked URL sets + custom robots.txt.<\/li>\n<li><strong>On-page SEO analyzer<\/strong> \u2014 score 0\u2013100 across 9 checks (focus keyword, alt text, internal links, readability).<\/li>\n<\/ul>\n\n<h4>Privacy-first analytics, built in<\/h4>\n\n<ul>\n<li><strong>Local visitor analytics<\/strong> \u2014 server-side pageviews, no cookies, no Google Analytics, no Facebook Pixel.<\/li>\n<li><strong>Source attribution<\/strong> \u2014 search, social, referrers, UTM, direct, and AI answer engines.<\/li>\n<li><strong>Visitor countries<\/strong> \u2014 offline IP\u2192country lookup from a bundled database, no external calls (works on locked-down servers).<\/li>\n<li><strong>Top pages, entry\/exit pages, device + browser + OS breakdown.<\/strong><\/li>\n<li><strong>Redirect manager<\/strong> \u2014 301 \/ 302 \/ 307 \/ 308 with exact &amp; prefix matching, plus a <strong>404 log<\/strong> with one-click \"create redirect\".<\/li>\n<li><strong>AI suggestions<\/strong> \u2014 bring your own Mistral key for titles, meta descriptions and focus keywords.<\/li>\n<li><strong>Migration wizard<\/strong> \u2014 import metadata + redirects from Yoast, RankMath, AIOSEO.<\/li>\n<li><strong>Multisite-aware<\/strong> \u2014 network activation, network-wide settings, per-site overrides.<\/li>\n<\/ul>\n\n<h4>Plays nicely with Yoast, RankMath &amp; co.<\/h4>\n\n<p>Already running another SEO plugin? Brainwerk SEO Suite auto-detects it and stands down its meta, schema and sitemap modules \u2014 so you keep <strong>analytics, the 404 log, redirects and the analyzer<\/strong> as a clean add-on, with no duplicate output. One toggle forces full takeover whenever you're ready to switch.<\/p>\n\n<h4>Go Pro<\/h4>\n\n<p>The Pro tier (via Freemius license) adds:<\/p>\n\n<ul>\n<li>Google Search Console &amp; Bing Webmaster sync<\/li>\n<li>Region &amp; city geolocation drill-down (Free already covers countries)<\/li>\n<li>Slack \/ Discord \/ MS-Teams webhook alerts<\/li>\n<li>Traffic anomaly detection (Z-score baseline, 3\u03c3 alerts)<\/li>\n<li>Multisite-aggregate dashboard, white-label branding, priority support<\/li>\n<\/ul>\n\n<h4>\ud83c\uddea\ud83c\uddfa Auf Deutsch \u2014 kurz &amp; knapp<\/h4>\n\n<p>Brainwerk SEO Suite ist das All-in-one-SEO- und Analytics-Tool f\u00fcr WordPress, das <strong>100 % deiner Daten auf deinem eigenen Server<\/strong> beh\u00e4lt. Keine Cookies, kein Google Analytics, kein Facebook Pixel, kein Datenhandel \u2014 nur ehrliche Insights und alles, was du brauchst, um in Suchmaschinen <strong>und<\/strong> in KI-Antwortmaschinen gefunden zu werden.<\/p>\n\n<ul>\n<li><strong>Made in Europe, made for Europe<\/strong> \u2014 in der EU nach EU-Standards entwickelt, Privacy-by-Design in jeder Abfrage<\/li>\n<li><strong>DSGVO-ready ab Werk<\/strong> \u2014 IP-Anonymisierung, t\u00e4glich rotierende Besucher-Hashes, DNT-treu, meist <strong>ohne Cookie-Banner<\/strong><\/li>\n<li><strong>F\u00fcr die NIS2-\u00c4ra gebaut<\/strong> \u2014 alles selbst gehostet, auditierbar und unter deiner Kontrolle<\/li>\n<li><strong>EU-KI<\/strong> \u2014 AI-Vorschl\u00e4ge laufen optional \u00fcber <strong>Mistral AI \ud83c\uddea\ud83c\uddfa<\/strong> mit deinem eigenen Key<\/li>\n<li><strong>GEO\/AEO<\/strong> \u2014 KI-Crawler steuern (GPTBot, Google-Extended, ClaudeBot \u2026), <code>llms.txt<\/code>, FAQ-Schema, KI-Traffic-Tracking (ChatGPT, Gemini, Perplexity, Claude)<\/li>\n<li><strong>High-Tech im Maschinenraum<\/strong> \u2014 Sub-Millisekunden-Dashboards, geh\u00e4rtetes SQL, REST-API &amp; WP-CLI<\/li>\n<li><strong>Alles aus einer Hand<\/strong> \u2014 Analytics, Meta, Schema.org, Sitemap, Redirects, 404-Log, Analyzer<\/li>\n<\/ul>\n\n<p>Bereits Yoast oder RankMath im Einsatz? Brainwerk erkennt das automatisch und schaltet seine Meta-\/Schema-\/Sitemap-Module ab \u2014 du beh\u00e4ltst <strong>Analytics, 404-Log, Redirects und Analyzer<\/strong> als sauberes Add-on, ohne Doppelausgabe.<\/p>\n\n<h3>External services<\/h3>\n\n<p>The optional AI features connect to <strong>one external AI provider, Mistral AI (EU-based)<\/strong>. They are <strong>opt-in<\/strong> and only used when you explicitly enter your own API key.<\/p>\n\n<p><strong>Mistral AI API \u2014 <code>https:\/\/api.mistral.ai<\/code><\/strong> (EU-based)<\/p>\n\n<ul>\n<li><strong>What it is used for:<\/strong> Generating AI suggestions for SEO titles, meta descriptions, focus keywords and internal-link recommendations when you click the \"\u2728 Suggest with AI\" buttons in the on-page meta box or the AI tab.<\/li>\n<li><strong>When data is sent:<\/strong> Only when an editor clicks one of the AI-suggestion buttons in the WordPress admin. No data is sent on the front-end, during normal page views, or in cron jobs.<\/li>\n<li><strong>What data is sent:<\/strong> Your own Mistral API key (you supply it; the plugin does not bundle one), the post title and the post body content of the post you are editing, plus a short instruction prompt. Nothing else \u2014 no user identifiers, no site-wide content, no analytics.<\/li>\n<li><strong>How to disable:<\/strong> Leave the API key field empty in <em>Brainwerk SEO Suite \u2192 AI<\/em> settings, or toggle the AI feature off. With no key, the plugin never contacts any AI provider.<\/li>\n<li><strong>Provider:<\/strong> Mistral AI (France\/EU) \u2014 <a href=\"https:\/\/mistral.ai\/terms\/\">Terms of Service<\/a> \u2014 <a href=\"https:\/\/mistral.ai\/terms\/#privacy-policy\">Privacy Policy<\/a><\/li>\n<li><strong>API documentation:<\/strong> <a href=\"https:\/\/docs.mistral.ai\/\">https:\/\/docs.mistral.ai\/<\/a><\/li>\n<\/ul>\n\n<p>Licensing for the optional Pro tier is handled by Freemius (Merchant of Record). License-validation traffic \u2014 only performed when you activate a Pro license on the <em>License<\/em> tab \u2014 goes to <code>https:\/\/api.freemius.com<\/code>. See the <a href=\"https:\/\/freemius.com\/terms\/\">Freemius Terms of Service<\/a> and <a href=\"https:\/\/freemius.com\/privacy\/\">Privacy Policy<\/a>. With no Pro license entered, the plugin never contacts Freemius.<\/p>\n\n<p><strong>Visitor-country lookup is offline.<\/strong> The Free country-level geolocation uses a compact IP\u2192country database <strong>bundled inside the plugin<\/strong> and resolved locally \u2014 it makes <strong>no external requests<\/strong>. The bundled data is derived from the <strong>DB-IP IP-to-Country Lite<\/strong> database by DB-IP, licensed under <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">Creative Commons Attribution 4.0 International (CC BY 4.0)<\/a>. IP Geolocation by <a href=\"https:\/\/db-ip.com\">DB-IP<\/a>. The Pro region\/city drill-down uses MaxMind's GeoLite2 City database (downloaded once to your server when you enable it); this product includes GeoLite2 data created by MaxMind, available from <a href=\"https:\/\/www.maxmind.com\">https:\/\/www.maxmind.com<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>seoforge<\/code> folder to <code>\/wp-content\/plugins\/<\/code> (or install via the WordPress Plugin Directory).<\/li>\n<li><strong>Activate<\/strong> the plugin on the Plugins page, or <strong>Network Activate<\/strong> on Multisite.<\/li>\n<li>Open <em>Brainwerk SEO Suite<\/em> in the admin menu and complete the 3-step setup wizard.<\/li>\n<li>(Optional) On the <em>License<\/em> tab, activate a Pro license to unlock Pro modules.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20brainwerk%20seo%20suite%20work%20with%20yoast%20%2F%20rankmath%20%2F%20aioseo%20already%20installed%3F\"><h3>Does Brainwerk SEO Suite work with Yoast \/ RankMath \/ AIOSEO already installed?<\/h3><\/dt>\n<dd><p>Yes. Brainwerk SEO Suite auto-detects the active SEO plugin and stands down its meta, schema, sitemap and robots modules so there's no duplicate output. Analytics, the 404 log, redirects and the on-page analyzer keep working side by side. A single toggle on the <em>Privacy \/ GDPR<\/em> tab forces takeover whenever you want.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20add%20a%20cookie%20banner%3F\"><h3>Do I need to add a cookie banner?<\/h3><\/dt>\n<dd><p>Not because of Brainwerk SEO Suite. The plugin doesn't drop any cookies, doesn't use a cross-site identifier, anonymizes IPs and respects DNT by default. The bundled privacy snippet documents exactly what is stored so you can paste it into your own privacy policy.<\/p><\/dd>\n<dt id=\"is%20the%20analytics%20data%20accurate%20without%20javascript%3F\"><h3>Is the analytics data accurate without JavaScript?<\/h3><\/dt>\n<dd><p>The server-side mode catches all real requests, including users who block JavaScript or use strict tracking-protection. It does count fewer \"bot-like\" visits than JS-based analytics because we filter known crawler user agents. A JS beacon mode for time-on-page and scroll depth is included if you want the extra signal.<\/p><\/dd>\n<dt id=\"will%20brainwerk%20seo%20suite%20slow%20down%20my%20site%3F\"><h3>Will Brainwerk SEO Suite slow down my site?<\/h3><\/dt>\n<dd><p>The tracker only inserts one row per pageview (no joins, no remote calls). All dashboards read from a pre-aggregated daily table, so the admin pages are sub-millisecond even at 100k+ visits per month. The sitemap and meta output are cached.<\/p><\/dd>\n<dt id=\"is%20there%20a%20wp-cli%20command%3F\"><h3>Is there a wp-cli command?<\/h3><\/dt>\n<dd><p>Yes \u2014 <code>wp seoforge stats<\/code>, <code>wp seoforge purge<\/code>, <code>wp seoforge cleanup<\/code>, <code>wp seoforge aggregate<\/code>, <code>wp seoforge export<\/code>, <code>wp seoforge import-redirects<\/code>, <code>wp seoforge seed-demo<\/code> and <code>wp seoforge license<\/code>.<\/p><\/dd>\n<dt id=\"where%20is%20data%20stored%3F\"><h3>Where is data stored?<\/h3><\/dt>\n<dd><p>Six tables under the network prefix (<code>wp_seoforge_visits<\/code>, <code>_sessions<\/code>, <code>_redirects<\/code>, <code>_404<\/code>, <code>_meta<\/code>, <code>_daily<\/code>) and a settings option. Nothing leaves the server (Pro modules use opt-in external APIs).<\/p><\/dd>\n<dt id=\"where%20is%20the%20license%20server%3F\"><h3>Where is the license server?<\/h3><\/dt>\n<dd><p>Licensing is handled by Freemius (Merchant of Record). All license traffic goes to <code>api.freemius.com<\/code>. There is no Brainwerk SEO Suite-operated license server.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0 \u2014 2026-06-30<\/h4>\n\n<ul>\n<li><strong>Printable reports, no PDF software required<\/strong>: the report generator now produces a self-contained, branded HTML report that any browser saves as PDF. This removes an external PDF library dependency, so reports work on every install \u2014 including locked-down servers.<\/li>\n<li><strong>Reports now include visitor countries<\/strong>: the report gained a \"Top countries\" block (flags + share bars) alongside the KPI grid, trend, sources and devices.<\/li>\n<li><strong>Onboarding<\/strong>: a new \"AI search readiness (GEO\/AEO)\" step lets you switch on the llms.txt manifest and FAQ schema right from the setup wizard.<\/li>\n<li><strong>Accessibility<\/strong>: clearer screen-reader labels on the redirect, 404 and visitor-country controls; decorative icons are now correctly hidden from assistive tech.<\/li>\n<li><strong>Hardening<\/strong>: database schema migrations now run only in the admin context (never triggered by a public front-end request), with a lock against concurrent runs.<\/li>\n<li><strong>Pro<\/strong>: opt-in \"SEO network\" sensor pushes one aggregate snapshot per day to power an agency fleet overview and anonymous peer benchmarks (counts and percentages only \u2014 never per-visitor data). Search Console performance (clicks, impressions, position, top queries) now has its own card.<\/li>\n<\/ul>\n\n<h4>0.9.0 \u2014 2026-06-29<\/h4>\n\n<ul>\n<li><strong>Generative Engine Optimization (GEO\/AEO)<\/strong> \u2014 a new toolkit to get your content surfaced and cited by AI answer engines:\n\n<ul>\n<li><strong>AI-crawler controls<\/strong>: one-click allow\/block for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, Google-Extended, Applebot-Extended, Bytespider, CCBot and more \u2014 written straight into robots.txt.<\/li>\n<li><strong>llms.txt manifest<\/strong>: optionally publish <code>\/llms.txt<\/code> (+ <code>\/llms-full.txt<\/code>), a Markdown map of your key pages and posts for AI crawlers \u2014 generated automatically and cached.<\/li>\n<li><strong>FAQ schema<\/strong>: add question\/answer pairs per post\/page in the editor; output as FAQPage JSON-LD (plus <code>speakable<\/code> on articles) for rich results and AI answers.<\/li>\n<li><strong>AI-engine traffic<\/strong>: visits arriving from ChatGPT, Gemini, Copilot, Perplexity, Claude and other assistants are now classified as their own \"AI answer engines\" source, with a dedicated breakdown on the Sources tab.<\/li>\n<\/ul><\/li>\n<li><strong>Fix<\/strong>: saving settings on the Meta\/Schema tab silently did nothing after a slug rename (the form data was read under the wrong key). Settings now save correctly again.<\/li>\n<\/ul>\n\n<h4>0.8.0 \u2014 2026-06-29<\/h4>\n\n<ul>\n<li><strong>Visitor geolocation, now in Free<\/strong>: the Visitors tab gets a \"Visitor countries\" breakdown with flags and share-of-traffic bars, and recent visits show a country column. Country resolution runs entirely <strong>offline<\/strong> from a compact IP\u2192country database bundled inside the plugin (built from DB-IP Lite, CC BY 4.0) \u2014 no external requests, so it works on locked-down\/firewalled servers too. Covers both IPv4 and IPv6.<\/li>\n<li><strong>Pro \u2014 region &amp; city drill-down<\/strong>: with a Pro license, click any country to expand its top regions and cities, powered by MaxMind's GeoLite2 City database (read with a bundled, dependency-free reader). Country-level data stays available on Free.<\/li>\n<li><strong>Schema<\/strong>: visits and sessions gain <code>region<\/code> + <code>city<\/code> columns (DB upgrade to v4, applied automatically).<\/li>\n<li><strong>Demo data<\/strong>: the demo seeder now emits internally-consistent country\/region\/city so the new geolocation views look populated out of the box.<\/li>\n<\/ul>\n\n<h4>0.7.7 \u2014 2026-06-24<\/h4>\n\n<ul>\n<li><strong>Every e-mail now shares the same polished design<\/strong>: the traffic-spike alert, the scheduled report cover e-mails (auto weekly\/monthly and re-sends) and the \"send test\" e-mail were plain text or a bare one-liner \u2014 they now use the same branded HTML shell as the digests (navy gradient header with logo, status-coloured hero band, clean facts table, call-to-action button and the made-in-EU footer). Consistent look across every notification the plugin sends.<\/li>\n<li><strong>Richer traffic-spike alert<\/strong>: the anomaly alert now leads with a colour-coded hero (amber for a spike, red for an extreme spike) and a tidy breakdown \u2014 hour, human pageviews, z-score, rolling baseline and your alert threshold \u2014 plus a one-click button into the live dashboard. Slack\/Discord\/Teams webhook payloads are unchanged.<\/li>\n<li><strong>Fix \u2014 <code>\/favicon.ico<\/code> no longer counted as a page<\/strong>: favicon requests (and any other static asset that gets routed through WordPress) were recorded as visits and could top the \"Top pages\" report. They are now excluded from tracking (via <code>is_favicon()<\/code> plus a static-file-extension guard), so the report only shows real pages.<\/li>\n<li><strong>Fix \u2014 broken in-app links (\"Sorry, you are not allowed to access this page\")<\/strong>: links that pointed to the old <code>admin.php?page=seoforge<\/code> slug \u2014 the onboarding \"Start setup\" button, Site Health fixes, the dashboard widget, report\/e-mail buttons and others \u2014 led to a permission error because the admin page slug is <code>brainwerk-seo-suite<\/code>. All ~40 links now use the correct slug.<\/li>\n<\/ul>\n\n<h4>0.7.6 \u2014 2026-06-21<\/h4>\n\n<ul>\n<li><strong>E-mail reports \u2014 graphical daily &amp; weekly digests<\/strong>: the report e-mails are now beautifully designed HTML (brand header, KPI tiles with period-over-period trend arrows, traffic-source bars, top pages, Core Web Vitals ratings, human-vs-bot split) \u2014 everything at a glance. New <strong>daily<\/strong> digest in addition to the weekly one; configure recipient + cadence and send a test from <em>Tools \u2192 E-mail reports<\/em>.<\/li>\n<li><strong>Fix \u2014 Core Web Vitals, engagement &amp; new-visitor tracking now actually work<\/strong>: these metrics queried database columns that were never created or populated (they silently returned 0 and logged \"unknown column\" errors). The schema now includes <code>lcp_ms<\/code>\/<code>cls_x1000<\/code>\/<code>inp_ms<\/code>\/<code>is_engaged<\/code>\/<code>is_new_visitor<\/code> (DB upgrade to v3, applied automatically), new-visitor detection runs server-side, engagement + Core Web Vitals (LCP\/INP\/CLS, real field data) are captured via the front-end beacon (beacon\/hybrid tracking mode). Verified on a staging install.<\/li>\n<li><strong>Hardening &amp; cleanup<\/strong> (from an internal audit): Multisite isolation fix so a subsite admin can no longer delete\/toggle another site's redirect by id; removed a dead \"link check\" cron that fired into the void; report crons are now cleared on deactivation; minor robustness fixes.<\/li>\n<li><strong>AI \u2014 Mistral AI support (EU-based) + provider choice<\/strong>: AI suggestions can now run on Mistral AI \u2014 an EU-based provider, so your content stays in the EU \u2014 in addition to Anthropic (Claude). Choose your provider and model in the AI tab; Mistral is the new default for fresh installs. Still bring-your-own-key, encrypted at rest, fully opt-in.<\/li>\n<li><strong>Pro \u2014 Executive report (CEO \/ CTO)<\/strong>: a one-click, print-ready branded report for leadership. Pick an Executive (CEO), Technical (CTO) or Full\/Board preset, choose a period, and present it or save it as PDF from the browser. Includes period-over-period deltas, human-vs-bot split, traffic mix, geographic reach, top\/entry\/exit pages, Core Web Vitals ratings (overall and by device), new-vs-returning audience and a privacy\/compliance summary \u2014 rendered entirely from your own first-party data, no external service. The Free build shows a preview\/upsell.<\/li>\n<li><strong>Multisite<\/strong>: the analytics tabs (Dashboard, Visitors, Sources, Pages) and the at-a-glance dashboard widget now scope visitor stats per site. A new site selector lets you switch between <strong>this site<\/strong>, the <strong>entire network<\/strong> (aggregated), or any <strong>single subsite<\/strong>; the choice is remembered per user. Previously every subsite admin saw network-wide totals.<\/li>\n<li><strong>Multisite<\/strong>: the network Dashboard adds a per-site breakdown table (pageviews \/ unique visitors \/ sessions per subsite) with a one-click drill-down into each site.<\/li>\n<li><strong>Fix<\/strong>: <code>SEOFORGE_VERSION<\/code> was still reporting <code>0.7.4<\/code>; it is now back in sync with the plugin header.<\/li>\n<\/ul>\n\n<h4>0.7.5 \u2014 2026-06-19<\/h4>\n\n<ul>\n<li><strong>Security\/SQL<\/strong>: every plugin-owned table name that was previously interpolated into a query string is now passed through the <code>$wpdb-&gt;prepare()<\/code> <code>%i<\/code> identifier placeholder (WordPress 6.2+) instead of string interpolation. Conditional <code>WHERE<\/code> builders and the breakdown\/percentile switches were restructured so each <code>$wpdb-&gt;prepare()<\/code> call receives a string literal with placeholders only \u2014 no SQL string is built in a variable. The only remaining interpolation is the dynamic <code>post_type IN (...)<\/code> list, which uses generated <code>%s<\/code> placeholders bound through <code>prepare()<\/code> (an <code>IN()<\/code> list cannot use <code>%i<\/code>). Requires at least WordPress 6.2.<\/li>\n<\/ul>\n\n<h4>0.7.4 \u2014 2026-06-14<\/h4>\n\n<ul>\n<li><strong>Security<\/strong>: removed the last two cases of a column identifier being interpolated into SQL. The breakdown query (<code>Seoforge_Stats::group_count()<\/code>) and the Core Web Vitals percentile query (<code>Seoforge_Reports::percentile()<\/code>) now select a separate, fully literal query string per allowed column \u2014 the SQL identifier is never taken from a variable. All values continue to be bound through <code>$wpdb-&gt;prepare()<\/code>.<\/li>\n<\/ul>\n\n<h4>0.7.3 \u2014 2026-06-13<\/h4>\n\n<ul>\n<li><strong>Enqueue<\/strong>: the Reports tab no longer outputs an inline <code>&lt;script&gt;<\/code>; its quick-range helper moved into the enqueued <code>assets\/js\/admin.js<\/code>.<\/li>\n<li><strong>i18n<\/strong>: the last <code>seoforge<\/code> text-domain string now uses <code>brainwerk-seo-suite<\/code>, matching the plugin slug.<\/li>\n<li><strong>Security<\/strong>: report admin-post handlers sanitize the nonce with <code>sanitize_text_field( wp_unslash() )<\/code> and unslash\/sanitize all request values; the post meta box sanitizes its submitted array at input.<\/li>\n<\/ul>\n\n<h4>0.7.2 \u2014 2026-06-10<\/h4>\n\n<ul>\n<li><strong>Security<\/strong>: table names passed to the internal table-resolver are now validated against the fixed whitelist of plugin tables before being used in SQL.<\/li>\n<li><strong>Security<\/strong>: the migration coordinator builds its post-type <code>IN (...)<\/code> list from dynamically generated <code>%s<\/code> placeholders via <code>$wpdb-&gt;prepare()<\/code> instead of escaping + interpolation.<\/li>\n<li><strong>Security<\/strong>: internal report\/stats helpers validate metric and group-by column names against fixed whitelists before using them as SQL identifiers.<\/li>\n<\/ul>\n\n<h4>0.7.1 \u2014 2026-06-03<\/h4>\n\n<ul>\n<li><strong>Security<\/strong>: Schema.org JSON-LD is now emitted with slash-escaping (no <code>JSON_UNESCAPED_SLASHES<\/code>), so a value containing <code>&lt;\/script&gt;<\/code> can no longer break out of the inline <code>application\/ld+json<\/code> block. <code>\\\/<\/code> and <code>\\uXXXX<\/code> remain valid JSON-LD.<\/li>\n<\/ul>\n\n<h4>0.7.0 \u2014 2026-05-21<\/h4>\n\n<ul>\n<li><strong>Rebranded<\/strong> to Brainwerk SEO Suite (was: SEOForge). Display name + text-domain + plugin filename updated.<\/li>\n<li><strong>Security<\/strong>: nonce verification in the post meta box now goes through <code>sanitize_text_field( wp_unslash() )<\/code> (pluggable-function hardening).<\/li>\n<li><strong>Security<\/strong>: <code>$_COOKIE<\/code> reads in the tracker now go through <code>sanitize_text_field( wp_unslash() )<\/code> in addition to the existing hex-filter.<\/li>\n<li><strong>Security<\/strong>: SVG sparkline attributes in the dashboard widget now use <code>esc_attr()<\/code> for chart coordinates.<\/li>\n<li><strong>Security<\/strong>: WP-CLI <code>export --out=&lt;path&gt;<\/code> is now restricted to a <code>wp-content\/uploads\/seoforge\/<\/code> subdirectory (and writes only the basename) so it cannot clobber arbitrary paths.<\/li>\n<li><strong>wp.org compliance<\/strong>: removed the Pro-only bearer-key path from the REST <code>permission_callback<\/code>. The Free REST API is admin-cookie\/nonce only. Pro external dashboards stay in the separate Premium build.<\/li>\n<li><strong>wp.org compliance<\/strong>: removed <code>load_plugin_textdomain()<\/code> \u2014 WordPress 4.6+ auto-loads translations for plugins hosted on wp.org by slug.<\/li>\n<li><strong>wp.org compliance<\/strong>: weekly digest now uses <code>admin_url()<\/code> instead of a hard-coded <code>\/wp-admin\/<\/code> path.<\/li>\n<li><strong>Docs<\/strong>: readme now documents the optional Anthropic (Claude) API integration as an <code>== External services ==<\/code> section, with what is sent, when, how to disable, and links to Anthropic's Terms \/ Privacy.<\/li>\n<\/ul>\n\n<h4>0.6.0 \u2014 2026-05-19<\/h4>\n\n<ul>\n<li>Freemius integration live-wired end-to-end (real product IDs, SDK in <code>freemius\/<\/code>, <code>is_live=true<\/code>).<\/li>\n<li>Paid plans Starter (\u20ac59\/yr, 1 site) and Agency (\u20ac199\/yr, 25 sites) with auto-generated pricing table.<\/li>\n<li>New sanity row in the Tools tab reports SDK \/ opt-in \/ license state.<\/li>\n<li>Premium build script (<code>bin\/build-premium.sh<\/code>) for Freemius Deploy.<\/li>\n<li>Fix: <code>Seoforge_License::is_pro()<\/code> now uses <code>is_paying()<\/code> so Pro modules load in both Free and Premium builds with a valid license.<\/li>\n<li><code>uninstall.php<\/code> logic migrated to Freemius <code>after_uninstall<\/code> hook (per Freemius Deploy guideline).<\/li>\n<\/ul>\n\n<h4>0.5.0 \u2014 2026-05-10<\/h4>\n\n<ul>\n<li>CI alignment with the ShieldForge UX (Hero banner, tab groups, action items, iOS toggles, tooltips, dark mode, mobile, sanity card).<\/li>\n<li><code>bin\/bump-version.{sh,ps1}<\/code> + <code>bin\/build-free.{sh,ps1}<\/code> + <code>.distignore<\/code>.<\/li>\n<li>Pre-launch sanity check (17 checks across versioning, cron, DB, privacy, tracking, sitemap, coexistence, file hygiene, readme, translations).<\/li>\n<li>i18n: POT + de_DE PO\/MO shipped.<\/li>\n<li>PHPUnit tests for <code>Seoforge_Crypto<\/code> + <code>Seoforge_Analyzer<\/code>.<\/li>\n<\/ul>\n\n<h4>0.4.0 \u2014 2026-05-07<\/h4>\n\n<ul>\n<li>Migration wizard for Yoast \/ RankMath \/ AIOSEO (metadata + redirects).<\/li>\n<li>JS-beacon tracking mode with scroll depth + outbound clicks.<\/li>\n<li><code>Seoforge_Health<\/code> setup-health score on the Dashboard.<\/li>\n<li>UX polish for non-technical site owners.<\/li>\n<\/ul>\n\n<h4>0.3.0 \u2014 2026-05-07<\/h4>\n\n<ul>\n<li>Pre-aggregated daily table for O(1) dashboard queries.<\/li>\n<li>Transient caches with auto-flush on mutations.<\/li>\n<li>License-key encryption at rest (AES-256-CBC).<\/li>\n<li>Streamed CSV exports (visits, sessions, 404, redirects).<\/li>\n<li>Bulk redirect import from CSV.<\/li>\n<li>WP-CLI commands (<code>wp seoforge ...<\/code>).<\/li>\n<li>Demo seeder + live-visitors widget.<\/li>\n<li>REST API (<code>\/wp-json\/seoforge\/v1\/...<\/code>).<\/li>\n<\/ul>\n\n<h4>0.2.0 \u2014 2026-05-07<\/h4>\n\n<ul>\n<li>Coexistence layer detects Yoast \/ RankMath \/ AIOSEO \/ The SEO Framework \/ SEOPress and stands down passively.<\/li>\n<li>License + Pro module foundation.<\/li>\n<li>Pro stubs: Geo-Lookup, webhooks, anomaly detection, Search Console.<\/li>\n<li>Marketing landing page (<code>landing\/index.html<\/code>).<\/li>\n<\/ul>\n\n<h4>0.1.0 \u2014 2026-05-07<\/h4>\n\n<ul>\n<li>Initial release: tracker, sessions, stats, meta, schema, sitemap, robots, redirects, 404 log, on-page analyzer, weekly digest, onboarding wizard, tools tab.<\/li>\n<\/ul>","raw_excerpt":"All-in-one SEO &amp; cookie-free analytics, plus AI-search (GEO\/AEO) tools. Made in Europe, made for Europe \u2014 GDPR &amp; NIS2-ready.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=315682"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brainwerk"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315682"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315682"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315682"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315682"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315682"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}