{"id":247985,"date":"2025-09-09T16:52:55","date_gmt":"2025-09-09T16:52:55","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/website-analytics-by-yeb\/"},"modified":"2026-02-07T19:47:14","modified_gmt":"2026-02-07T19:47:14","slug":"website-analytics-by-yeb","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/website-analytics-by-yeb\/","author":23350340,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.1","stable_tag":"1.0.1","tested":"6.9.4","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Website Analytics by YEB","header_author":"Yeb.To (YEB)","header_description":"Privacy-aware visit tracking with SPA beacon, sessions, GeoIP, Bot-Detect, Device Analyze, GA-like tabs, KPI cards, rich filters (saved), CSV export, and per-call API credits ledger + forecasts. IPv6 ready.","assets_banners_color":"65015b","last_updated":"2026-02-07 19:47:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":298,"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":"yebto","date":"2025-09-09 20:21:28"},"1.0.1":{"tag":"1.0.1","author":"yebto","date":"2026-02-07 19:47:14"}},"upgrade_notice":{"1.0.0":"<p>A simple, fast WordPress analytics dashboard with clear KPIs, session interactions up front, verified bot breakdowns, flexible filters, and CSV export \u2014 works great with SPAs and IPv6.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3358866,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3358866,"resolution":"256x256","location":"assets","locale":""},"icon.svg":{"filename":"icon.svg","revision":3358872,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3358857,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3358857,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3358857,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3358857,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3358857,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3358857,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3358857,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3358857,"resolution":"6","location":"assets","locale":""}},"screenshots":{"1":"Overview with KPIs and top lists","2":"Interactions (sessions with expandable visit history)","3":"Content &amp; Acquisition (pages, titles, UTM, referrers)","4":"Audience &amp; Tech (countries, regions, devices, OS, browsers)","5":"Bots &amp; Networks (verified bots, ASN\/CIDR)","6":"Export CSV"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[232,7175,521,32253],"plugin_category":[36],"plugin_contributors":[247613],"plugin_business_model":[],"class_list":["post-247985","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-pageviews","plugin_tags-statistics","plugin_tags-website-analytics","plugin_category-analytics","plugin_contributors-yebto","plugin_committers-yebto"],"banners":{"banner":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/banner-772x250.png?rev=3358857","banner_2x":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/banner-1544x500.png?rev=3358857","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/icon.svg?rev=3358872","icon":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/icon.svg?rev=3358872","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/screenshot-1.png?rev=3358857","caption":"Overview with KPIs and top lists"},{"src":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/screenshot-2.png?rev=3358857","caption":"Interactions (sessions with expandable visit history)"},{"src":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/screenshot-3.png?rev=3358857","caption":"Content &amp; Acquisition (pages, titles, UTM, referrers)"},{"src":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/screenshot-4.png?rev=3358857","caption":"Audience &amp; Tech (countries, regions, devices, OS, browsers)"},{"src":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/screenshot-5.png?rev=3358857","caption":"Bots &amp; Networks (verified bots, ASN\/CIDR)"},{"src":"https:\/\/ps.w.org\/website-analytics-by-yeb\/assets\/screenshot-6.png?rev=3358857","caption":"Export CSV"}],"raw_content":"<!--section=description-->\n<p>Google Analytics alternative for WordPress: clean stats, interactions, verified bots, UTM, GeoIP, CSV export. Privacy-first.<\/p>\n\n<h3>What you get<\/h3>\n\n<ul>\n<li><strong>At-a-glance KPIs<\/strong>: pageviews, sessions, unique visitors, pages per session.<\/li>\n<li><strong>Interactions (sessions)<\/strong>: session explorer with landing, referrer, per-session timeline (page history), avg. load, distinct pages, pageviews, expand\/collapse.<\/li>\n<li><strong>Content insights<\/strong>: top URLs, titles, post IDs.<\/li>\n<li><strong>Acquisition<\/strong>: referrers (root domains) and UTM (source\/medium\/campaign).<\/li>\n<li><strong>Audience<\/strong>: countries, regions, cities, languages, common screen sizes.<\/li>\n<li><strong>Tech<\/strong>: device type, OS, browser.<\/li>\n<li><strong>Bots (with verification)<\/strong>: separate verified search engine hits (Google, Bing, etc.).<\/li>\n<li><strong>Networks<\/strong>: major networks\/ISPs and their CIDR ranges.<\/li>\n<li><strong>CSV export<\/strong>: exports exactly what your current filters show.<\/li>\n<li><strong>SPA-friendly &amp; IPv6-ready<\/strong>.<\/li>\n<\/ul>\n\n<h3>Why people choose it<\/h3>\n\n<ul>\n<li><strong>Clear and calm<\/strong>: focused reports, no maze of menus.<\/li>\n<li><strong>Actionable filters<\/strong>: time window, path, title, country\/city, referrer, device, OS, browser, language, UTM, bot type.<\/li>\n<li><strong>You stay in control<\/strong>: richer info (city, device brand\/model, verified bot checks) is optional \u2014 enable only what you want.<\/li>\n<\/ul>\n\n<h3>Setup (optional extras)<\/h3>\n\n<p>Want richer details like city\/region, device brand\/model, or verified bot checks?<\/p>\n\n<ol>\n<li>Sign in at <strong>https:\/\/yeb.to<\/strong> and create an API key (free test credits).<\/li>\n<li>In WordPress, open <strong>Analytics (YEB) \u2192 Settings<\/strong>, paste your key.<\/li>\n<li>Toggle the extras you want (Geo, Network\/ASN, Device details, Bot verification).<\/li>\n<\/ol>\n\n<p>Nothing is sent to YEB until you add a key <strong>and<\/strong> turn on a feature \u2014 you choose.<\/p>\n\n<h3>Usage<\/h3>\n\n<ul>\n<li>Go to <strong>Analytics (YEB) \u2192 Dashboard<\/strong> for your reports.<\/li>\n<li>Use the tabs to dive into <strong>Overview, Interactions, Content, Acquisition, Audience, Tech, Bots, Networks<\/strong>.<\/li>\n<li>Click <strong>Export CSV<\/strong> to download exactly what you\u2019re viewing.<\/li>\n<\/ul>\n\n<h3>Shortcode (public mini-stats)<\/h3>\n\n<p>Show small, public counters anywhere (pages, posts, widgets, site editor).<\/p>\n\n<p><strong>Basic:<\/strong>\n    `<\/p>\n\n<p>[waby_visits_stats]                         ; whole site, last 7 days\n[waby_visits_stats period=\"30d\"]            ; whole site, last 30 days\n[waby_visits_stats period=\"1d\" bots=\"only\"] ; bots only, yesterday\n[waby_visits_stats page=\"\/pricing\"]         ; just \/pricing page, last 7 days<\/p>\n\n<pre><code>`\n<\/code><\/pre>\n\n<p><strong>Auto-detect current page:<\/strong>\n    `<\/p>\n\n<p>[waby_visits_stats current_page]<\/p>\n\n<pre><code>`\n<\/code><\/pre>\n\n<p>If <code>page=\"\"<\/code> isn\u2019t provided, <code>current_page<\/code> uses the current request path.<\/p>\n\n<p><strong>Show exactly what you want:<\/strong>\n    `<\/p>\n\n<p>[waby_visits_stats show=\"visits\"]  ; only total visits (pageviews)\n[waby_visits_stats show=\"uniques\"] ; only unique visitors\n[waby_visits_stats show=\"both\"]    ; both (default)<\/p>\n\n<pre><code>`\n<\/code><\/pre>\n\n<p><strong>Bot filter:<\/strong>\n- <code>bots=\"exclude\"<\/code> (default) \u2014 show human traffic and unverified bot-like traffic treated as human\n- <code>bots=\"only\"<\/code> \u2014 bot traffic only\n- <code>bots=\"include\"<\/code> \u2014 include everything<\/p>\n\n<p><strong>Labels, layout &amp; CSS hooks (for custom styling):<\/strong>\n    `<\/p>\n\n<p>[waby_visits_stats\ncurrent_page\nshow=\"both\"\nlabel_visits=\"Views\"\nlabel_uniques=\"Visitors\"\nlayout=\"inline\"      ; inline | stack\nsep=\" \u2022 \"\nwrap_tag=\"div\"       ; div | span | p\nitem_tag=\"span\"      ; span | div\nwrapper_class=\"stats stats--mini\"\nitem_class=\"stats__item\"\nlabel_class=\"stats__label\"\nvalue_class=\"stats__value\"\n]<\/p>\n\n<pre><code>``\n<\/code><\/pre>\n\n<p><strong>All attributes:<\/strong>\n- <code>period<\/code>: <code>1d<\/code>, <code>7d<\/code> (default), <code>30d<\/code>\n- <code>page<\/code>: limit to a path (e.g. <code>\/pricing<\/code>)\n- <code>current_page<\/code>: presence-only flag to use the current URL path\n- <code>bots<\/code>: <code>exclude<\/code> (default), <code>only<\/code>, <code>include<\/code>\n- <code>show<\/code>: <code>visits<\/code>, <code>uniques<\/code>, <code>both<\/code> (default)\n- <code>label_visits<\/code> (default <code>Visits<\/code>), <code>label_uniques<\/code> (default <code>Unique<\/code>)\n- <code>layout<\/code>: <code>inline<\/code> (default) or <code>stack<\/code>\n- <code>sep<\/code>: separator when <code>layout=\"inline\"<\/code> (default <code>|<\/code>)\n- <code>wrap_tag<\/code>: <code>div<\/code> (default), <code>span<\/code>, <code>p<\/code>\n- <code>item_tag<\/code>: <code>span<\/code> (default), <code>div<\/code>\n- <code>wrapper_class<\/code>, <code>item_class<\/code>, <code>label_class<\/code>, <code>value_class<\/code>: extra CSS classes<\/p>\n\n<h3>Styling the shortcode<\/h3>\n\n<p>Paste this CSS into <strong>Appearance \u2192 Customize \u2192 Additional CSS<\/strong> (or your theme stylesheet):\n    `css\n\/* YEB Visits \u2013 public stats *\/\n.yeb-visits-stats {\n  display: inline-flex;\n  gap: .75rem;\n  align-items: baseline;\n  font: 500 14px\/1.3 system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;\n}\n.yeb-visits-stats.yeb--layout-stack {\n  display: inline-grid;\n  gap: .35rem;\n}\n.yeb-visits-stats .yeb-metric {\n  display: inline-flex;\n  gap: .35rem;\n  align-items: baseline;\n  white-space: nowrap;\n}\n.yeb-visits-stats .yeb-metric__label { opacity: .7; }\n.yeb-visits-stats .yeb-metric__value { font-weight: 700; }\n.yeb-visits-stats .yeb-sep { opacity: .35; }\n    ``<\/p>\n\n<h3>Privacy, Cookies &amp; Data Flow<\/h3>\n\n<p>You choose which extras to enable (location, device details, bot verification). IPs are stored in a way that groups them by network (not exact address). You can limit how often extras are called and how much data is kept.<\/p>\n\n<h3>External Service &amp; Data Flow (Guideline 6)<\/h3>\n\n<p>This plugin can optionally call the YEB API to enrich your local analytics. Nothing is sent to YEB until you add an API key in <strong>Analytics (YEB) \u2192 Settings<\/strong> and enable the related toggle.<\/p>\n\n<p><strong>Endpoints (HTTPS):<\/strong><\/p>\n\n<ul>\n<li>GeoIP: <code>{base}\/country<\/code>, <code>{base}\/city<\/code>, <code>{base}\/asn<\/code> (default base: <code>https:\/\/api.yeb.to\/v1\/geoip<\/code>)<\/li>\n<li>Device analyze: <code>{endpoint}<\/code> (default: <code>https:\/\/api.yeb.to\/v1\/device-analyze<\/code>)<\/li>\n<li>Bot verification: <code>{base}<\/code> or <code>{base}\/{vendor}<\/code> (default base: <code>https:\/\/api.yeb.to\/v1\/bot\/detect\/detect<\/code>)<\/li>\n<\/ul>\n\n<p><strong>What is sent and when:<\/strong><\/p>\n\n<ul>\n<li>GeoIP Country \u2014 IP address; only if API key set and \u201cCountry\u201d enabled (purpose: country lookup)<\/li>\n<li>GeoIP City\/Region \u2014 IP address; only if API key set and \u201cRegion &amp; City\u201d enabled (purpose: city\/region)<\/li>\n<li>ASN\/Network \u2014 IP address; only if API key set and \u201cASN &amp; Network\u201d enabled (purpose: ASN\/CIDR)<\/li>\n<li>Device analyze \u2014 User-Agent; only if API key set and \u201cParse user-agent strings\u201d enabled (purpose: browser\/OS\/device parsing, bot type)<\/li>\n<li>Bot verification \u2014 IP + User-Agent; only if API key set and \u201cBot-Detect\u201d enabled and UA looks like a bot (purpose: verify known crawlers)<\/li>\n<\/ul>\n\n<p>All requests use HTTPS. The plugin stores analytics locally; enrichment results are cached locally.<\/p>\n\n<p><strong>YEB policies:<\/strong><\/p>\n\n<ul>\n<li>Privacy Policy: <a href=\"https:\/\/yeb.to\/privacy\">https:\/\/yeb.to\/privacy<\/a><\/li>\n<li>Terms of Service: <a href=\"https:\/\/yeb.to\/terms\">https:\/\/yeb.to\/terms<\/a><\/li>\n<\/ul>\n\n<h3>Cookies<\/h3>\n\n<p>Two first-party cookies (pseudonymous GUIDs):<\/p>\n\n<ul>\n<li><code>yeb_sid<\/code> \u2014 session id, 30 minutes; groups pageviews into sessions.<\/li>\n<li><code>yeb_vid<\/code> \u2014 visitor id, 1 year; counts returning unique visitors.<\/li>\n<\/ul>\n\n<h3>Consent &amp; Opt-Out (Guidelines 7 &amp; 9)<\/h3>\n\n<p>By default, the beacon loads for visitors (logged-in admins excluded unless you enable <strong>Track logged-in admins<\/strong>). If your jurisdiction or policy requires consent before placing analytics cookies, gate the beacon with your consent tool.<\/p>\n\n<p><strong>Example (dequeue until consent):<\/strong><\/p>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>\/**\n * Stop the YEB beacon until a custom consent flag is set.\n * Replace the condition with your CMP\u2019s check.\n *\/\nadd_action('wp_enqueue_scripts', function () {\n    $consent_given = isset($_COOKIE['my_consent_flag']) &amp;&amp; $_COOKIE['my_consent_flag'] === 'yes';\n    if ( ! $consent_given ) {\n        wp_dequeue_script('waby-visits-beacon');\n        wp_deregister_script('waby-visits-beacon');\n    }\n}, 100);\n    `<\/p>\n\n<h3>Public REST Endpoint<\/h3>\n\n<p>The plugin exposes an intentionally public ingest endpoint used by the front-end beacon:<\/p>\n\n<pre><code>`\n<\/code><\/pre>\n\n<p>POST \/wp-json\/waby\/v1\/visit\nAlias: POST \/wp-json\/yeb\/v1\/visit\n    `<\/p>\n\n<p>It accepts sanitized visit metadata (URL, path, referrer, UTM, screen, language, etc.) and stores it in your site\u2019s database. It does not expose private data or modify content.<\/p>\n\n<h3>Data Retention &amp; IP Handling<\/h3>\n\n<ul>\n<li>A salted hash of the visitor IP is stored to group traffic by network.<\/li>\n<li>The raw IP is not stored by default. If you enable <strong>Store raw IP (packed)<\/strong>, it is retained only for the number of days you set (default <strong>7 days<\/strong>) and is visible to admins only.<\/li>\n<li>During enrichment, the raw IP may be encrypted temporarily and then cleared automatically once enrichment is done or after a short fallback window.<\/li>\n<li>You can limit daily external calls and sampling in <strong>Analytics (YEB) \u2192 Settings<\/strong>.<\/li>\n<\/ul>\n\n<h3>Uninstall<\/h3>\n\n<ul>\n<li>If you enable <strong>Delete all data on uninstall<\/strong> in settings, uninstalling the plugin will remove its custom tables and options.<\/li>\n<li>Leave it off if you want to keep your analytics data.<\/li>\n<\/ul>\n\n<h3>Filters &amp; Extensibility<\/h3>\n\n<ul>\n<li><code>waby_visits_stats_output<\/code> \u2014 filter the final HTML of the public stats shortcode.<\/li>\n<li><code>waby_visits_cache_ttl<\/code> \u2014 filter select-query cache TTL (seconds) used by the dashboard and shortcode.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>website-analytics-by-yeb<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it via <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Activate <strong>Website Analytics by YEB<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20track%20logged-in%20admins%3F\"><h3>Does it track logged-in admins?<\/h3><\/dt>\n<dd><p>Not unless you turn it on in settings.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20alongside%20google%20analytics%3F\"><h3>Can I use it alongside Google Analytics?<\/h3><\/dt>\n<dd><p>Yes. Many sites keep GA for marketing funnels and use YEB for a clean on-site dashboard, verified bot accounting, and exports.<\/p><\/dd>\n<dt id=\"will%20this%20help%20explain%20sudden%20traffic%20spikes%3F\"><h3>Will this help explain sudden traffic spikes?<\/h3><\/dt>\n<dd><p>Yes \u2014 the Bots tab separates verified search engine hits (e.g., Googlebot) from everything else, so you can quickly see what\u2019s real.<\/p><\/dd>\n<dt id=\"does%20it%20support%20ipv6%3F\"><h3>Does it support IPv6?<\/h3><\/dt>\n<dd><p>Yes, end-to-end.<\/p><\/dd>\n<dt id=\"can%20i%20export%20data%3F\"><h3>Can I export data?<\/h3><\/dt>\n<dd><p>Yes. Export CSV downloads exactly what your current filters show.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: visitor\/session IDs now managed client-side (cookies) to work with page cache plugins.<\/li>\n<li>Fix: Cost Estimator shows estimated credits when API does not return credits_spent.<\/li>\n<li>New: Refresh Costs button fetches live per-call pricing from YEB API.<\/li>\n<li>New: Quick date presets (Today, Last 7, Last 30, This Month, etc.).<\/li>\n<li>New: Period comparison with delta indicators across all tabs.<\/li>\n<li>New: Percentage columns in all data tables.<\/li>\n<li>New: Acquisition tab splits referrers into Search \/ Social \/ Other with search landing pages.<\/li>\n<li>New: Context-relevant KPI cards per tab.<\/li>\n<li>Improvement: Tabs and filter sections auto-hide when corresponding APIs are disabled.<\/li>\n<li>Improvement: Filter panel layout with grouped rows and labels.<\/li>\n<li>Improvement: Modern SaaS-style CSS redesign (indigo accent).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>Initial release.<\/p>","raw_excerpt":"WordPress analytics: pageviews &amp; sessions with interactions, verified bots, GeoIP, CSV export. Privacy-first.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/247985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=247985"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/yebto"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=247985"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=247985"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=247985"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=247985"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=247985"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=247985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}