{"id":375046,"date":"2026-09-26T22:00:18","date_gmt":"2026-09-26T22:00:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tidy-analytics\/"},"modified":"2026-09-26T23:11:16","modified_gmt":"2026-09-26T23:11:16","slug":"pinecount","status":"publish","type":"plugin","link":"https:\/\/fr-ca.wordpress.org\/plugins\/pinecount\/","author":23573152,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.1.2","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"PineCount","header_author":"Ritesh Lab","header_description":"Lightweight, self-hosted analytics. Records pageviews and traffic sources in this site's own database.","assets_banners_color":"c6cad0","last_updated":"2026-09-26 23:11:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/pinecount\/","header_author_uri":"https:\/\/riteshlab.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"riteshx100","date":"2026-09-26 23:11:16","revision":3714827}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3714812,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3714812,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3714812,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3714823,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3714823,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3714813,"resolution":"1","location":"assets","locale":"","width":2400,"height":1166},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3714793,"resolution":"2","location":"assets","locale":"","width":1938,"height":1626},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3714793,"resolution":"3","location":"assets","locale":"","width":1920,"height":1664},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3714793,"resolution":"4","location":"assets","locale":"","width":2064,"height":1314},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3714793,"resolution":"5","location":"assets","locale":"","width":1030,"height":730}},"screenshots":{"1":"Pageviews and visitors by hour, with AdSense earnings, RPM, CTR and clicks.","2":"Top pages, referrers, traffic sources, devices, on-site searches and entry pages.","3":"The full Top pages table, with entries, bounce rate and live users for each page.","4":"Settings, one section at a time.","5":"The last seven days on the WordPress dashboard."}},"plugin_section":[262246],"plugin_tags":[148,232,7175,396,521],"plugin_category":[35,36,54],"plugin_contributors":[282867],"plugin_business_model":[],"class_list":["post-375046","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-adsense","plugin_tags-analytics","plugin_tags-pageviews","plugin_tags-privacy","plugin_tags-statistics","plugin_category-advertising","plugin_category-analytics","plugin_category-security-and-spam-protection","plugin_contributors-riteshx100","plugin_committers-riteshx100"],"banners":{"banner":"https:\/\/ps.w.org\/pinecount\/assets\/banner-772x250.png?rev=3714823","banner_2x":"https:\/\/ps.w.org\/pinecount\/assets\/banner-1544x500.png?rev=3714823","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/pinecount\/assets\/icon.svg?rev=3714812","icon":"https:\/\/ps.w.org\/pinecount\/assets\/icon.svg?rev=3714812","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/pinecount\/assets\/screenshot-1.png?rev=3714813","caption":"Pageviews and visitors by hour, with AdSense earnings, RPM, CTR and clicks."},{"src":"https:\/\/ps.w.org\/pinecount\/assets\/screenshot-2.png?rev=3714793","caption":"Top pages, referrers, traffic sources, devices, on-site searches and entry pages."},{"src":"https:\/\/ps.w.org\/pinecount\/assets\/screenshot-3.png?rev=3714793","caption":"The full Top pages table, with entries, bounce rate and live users for each page."},{"src":"https:\/\/ps.w.org\/pinecount\/assets\/screenshot-4.png?rev=3714793","caption":"Settings, one section at a time."},{"src":"https:\/\/ps.w.org\/pinecount\/assets\/screenshot-5.png?rev=3714793","caption":"The last seven days on the WordPress dashboard."}],"raw_content":"<!--section=description-->\n<p>PineCount records pageviews in your site's own database and shows them in a clean dashboard inside wp-admin. Nothing is sent to a third-party analytics service.<\/p>\n\n<p>It works with full-page caching: a small script reports each pageview from the browser, so cached pages are counted too.<\/p>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li>Pageviews, visitors, sessions and views per visit, by hour, day, week or month.<\/li>\n<li>Top pages, entry pages, referrers, traffic sources, devices and on-site searches.<\/li>\n<li>Comparison with the previous period.<\/li>\n<li>A dashboard widget and an admin bar counter for today's numbers.<\/li>\n<li>Optional live visitors, using the Redis server your object cache already uses.<\/li>\n<li>Optional Google AdSense earnings, page views, RPM and CTR next to your traffic.<\/li>\n<li>A read-only REST API, protected by a key you generate, for pulling reports into other tools.<\/li>\n<li>Data retention from 30 days to 5 years, and excluded paths with wildcards.<\/li>\n<\/ul>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<ul>\n<li>No cookies and no persistent visitor ID. A visitor is identified only by a hash of their IP address and browser, mixed with a secret salt that changes every day, so nobody can be followed from one day to the next. The IP address itself is never stored.<\/li>\n<li>Sessions use the browser's per-tab session storage, which is cleared when the tab closes.<\/li>\n<li>Logged-in users are not tracked unless you turn that on.<\/li>\n<li>You can honour the browser's Do Not Track signal from the settings.<\/li>\n<li>All data stays in your WordPress database.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to Google only if you choose to connect Google AdSense in its settings. Until you do, it makes no external requests.<\/p>\n\n<p><strong>Google OAuth<\/strong> (accounts.google.com, oauth2.googleapis.com) is used to authorise read-only access to your AdSense account.<\/p>\n\n<ul>\n<li>When you click \"Connect with Google\", your browser goes to Google's sign-in page with your OAuth client ID.<\/li>\n<li>After you approve, the plugin sends your OAuth client ID, client secret and the authorisation code to Google to get a refresh token. The token is stored encrypted in your database.<\/li>\n<li>Before each report request, the plugin sends the client ID, client secret and refresh token to get a short-lived access token.<\/li>\n<li>When you click \"Disconnect\", the refresh token is sent to Google to be revoked.<\/li>\n<\/ul>\n\n<p><strong>Google AdSense Management API<\/strong> (adsense.googleapis.com) is used to read your earnings.<\/p>\n\n<ul>\n<li>While connected, the plugin requests today's estimated earnings, page views and clicks for your site every 10 minutes, and the last 7 days once a day, so Google's later corrections are picked up.<\/li>\n<li>It also lists your AdSense accounts and sites once when you connect, to find the site that matches this website.<\/li>\n<li>Only your access token and the account and site IDs are sent. No visitor data is ever sent to Google.<\/li>\n<\/ul>\n\n<p>Google's terms and privacy policy:<\/p>\n\n<ul>\n<li>Google Terms of Service: https:\/\/policies.google.com\/terms<\/li>\n<li>Google APIs Terms of Service: https:\/\/developers.google.com\/terms<\/li>\n<li>Google Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from the Plugins screen, or upload the <code>pinecount<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it. Tracking starts straight away.<\/li>\n<li>Open <strong>Analytics<\/strong> in the admin menu to see your dashboard, and <strong>Analytics \u2192 Settings<\/strong> to adjust tracking, retention and the optional features.<\/li>\n<\/ol>\n\n<p><strong>Live visitors (optional)<\/strong><\/p>\n\n<p>Live visitors need a Redis server. The plugin reads the same <code>WP_REDIS_*<\/code> constants in <code>wp-config.php<\/code> that the Redis Object Cache plugin uses, so if your object cache already runs on Redis there is nothing else to set up.<\/p>\n\n<p><strong>Google AdSense (optional)<\/strong><\/p>\n\n<ol>\n<li>In Google Cloud, create an OAuth client of type \"Web application\" and enable the AdSense Management API.<\/li>\n<li>Add the redirect URI shown in <strong>Analytics \u2192 Settings \u2192 AdSense<\/strong> to that client.<\/li>\n<li>Paste the client ID and secret into the settings, save, and click <strong>Connect with Google<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20page%20caching%3F\"><h3>Does it work with page caching?<\/h3><\/dt>\n<dd><p>Yes. Pageviews are reported from the browser, so pages served from a cache are still counted.<\/p><\/dd>\n<dt id=\"does%20it%20use%20cookies%3F\"><h3>Does it use cookies?<\/h3><\/dt>\n<dd><p>No. See the Privacy section above.<\/p><\/dd>\n<dt id=\"where%20is%20the%20data%20stored%3F\"><h3>Where is the data stored?<\/h3><\/dt>\n<dd><p>In five tables in your WordPress database, prefixed <code>pinecount_<\/code>. You choose how long raw pageviews are kept.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>By default, deleting the plugin removes its tables and settings. Turn off \"Delete all data on uninstall\" in the settings if you want to keep them.<\/p><\/dd>\n<dt id=\"is%20there%20an%20api%3F\"><h3>Is there an API?<\/h3><\/dt>\n<dd><p>Yes. Generate a key in the settings, then send it in the <code>X-PineCount-Key<\/code> header. The full reference is under <strong>Analytics \u2192 Settings \u2192 API<\/strong>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Renamed to PineCount.<\/li>\n<li>New: Settings link on the Plugins screen.<\/li>\n<li>New: Check connection button in the Live visitors settings, to test the Redis server.<\/li>\n<li>Tweak: The live visitors requirements notice is hidden once live visitors are switched on.<\/li>\n<li>Tweak: The API key header is now X-PineCount-Key.<\/li>\n<li>Tweak: The Analytics menu now sits below the core WordPress menus.<\/li>\n<li>Tweak: Stricter escaping of icons and the API documentation page, and stricter sanitizing of settings.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Saving the settings page now works.<\/li>\n<li>Tweak: All admin and widget styles, IDs and data attributes now use the unique pinecount prefix, to avoid clashes with other plugins.<\/li>\n<li>Tweak: Removed leftover code for moving data from an earlier development version.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"Lightweight, self-hosted analytics. Pageviews, visitors and traffic sources, stored in your own database with no cookies.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/375046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=375046"}],"author":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/riteshx100"}],"wp:attachment":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=375046"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=375046"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=375046"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=375046"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=375046"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=375046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}