{"id":380631,"date":"2026-10-05T09:01:19","date_gmt":"2026-10-05T09:01:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/webdig-dev-analytics\/"},"modified":"2026-10-25T18:16:31","modified_gmt":"2026-10-25T18:16:31","slug":"webdig-dev-analytics","status":"publish","type":"plugin","link":"https:\/\/ms.wordpress.org\/plugins\/webdig-dev-analytics\/","author":16875715,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"7.1.3","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"WebDig.DEV Analytics","header_author":"Jo\u00e3o Costa - WebDig.DEV","header_description":"Self-hosted Umami analytics, visitor insights, Core Web Vitals and WooCommerce events in your WordPress dashboard.","assets_banners_color":"e9ebed","last_updated":"2026-10-25 18:16:31","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/webdig.dev","rating":0,"author_block_rating":0,"active_installs":10,"downloads":388,"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":"webdigpt","date":"2026-10-05 09:00:52","revision":3728460},"1.2.0":{"tag":"1.2.0","author":"webdigpt","date":"2026-10-25 18:16:31","revision":3765056}},"upgrade_notice":{"1.2.0":"<p>Settings and encrypted keys are preserved. The tracked-domain list is filled with this site&#039;s domain the first time an administrator opens the admin after the update; non-production environments stop sending data. UTM parameters are now kept in URLs. For WooCommerce, consider switching purchase tracking to server mode. Clear page\/CDN caches after updating.<\/p>","1.1.1":"<p>WordPress 7.1 compatibility metadata update. Existing settings and API keys are preserved.<\/p>","1.1.0":"<p>Settings and encrypted keys are preserved. Review report access and consent options, then clear page\/CDN caches. The new consent gate is off by default to preserve current behavior. Public Umami share links are hidden from report viewers until explicitly enabled.<\/p>","1.0.1":"<p>Fixes first-save API key storage. Existing settings and encrypted keys are preserved.<\/p>","1.0.0":"<p>Existing settings and API keys are preserved. Clear caches after upgrading. Select Portuguese in the user&#039;s WordPress language settings to use the pt_PT interface.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3728460,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3728460,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[232,187460,434,214233,286],"plugin_category":[36,45],"plugin_contributors":[197709],"plugin_business_model":[],"class_list":["post-380631","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-analytics","plugin_tags-core-web-vitals","plugin_tags-dashboard","plugin_tags-umami","plugin_tags-woocommerce","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-webdigpt","plugin_committers-webdigpt"],"banners":{"banner":"https:\/\/ps.w.org\/webdig-dev-analytics\/assets\/banner-772x250.png?rev=3728460","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/webdig-dev-analytics\/assets\/icon-256x256.png?rev=3728460","icon_2x":"https:\/\/ps.w.org\/webdig-dev-analytics\/assets\/icon-256x256.png?rev=3728460","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Connect WordPress to your own HTTPS Umami server. A dedicated reports page and dashboard widget display visits, visitor estimates, page views, average visit duration and bounce rate. Choose 24 hours, 7 days, 30 days or a custom range of up to 366 dates. Visitor, visit and page-view totals include comparisons with the preceding interval of equal duration.<\/p>\n\n<p>Browse pages, traffic sources, custom events, Core Web Vitals, WooCommerce revenue, browsers, languages, operating systems, devices and visitor countries. A configurable share URL opens the full Umami report in a new tab.<\/p>\n\n<p>Features:\n* Automatic page views and configurable link\/button\/contact\/download events, with the button or link label.\n* Optional scroll milestones and form submission attempts; successful Contact Form 7 submissions.\n* Official Umami real-user performance collection (LCP, INP, CLS, FCP and TTFB), shown in WordPress with good \/ needs improvement \/ poor ratings and the slowest pages.\n* WooCommerce product, cart, checkout and purchase events; HPOS compatibility.\n* Server-side purchase tracking: paid orders are sent when WooCommerce marks them as paid, including delayed Multibanco and bank-transfer payments, and are not affected by ad blockers.\n* Revenue, orders and average order value in the dashboard.\n* Campaign attribution: utm_* parameters and ad click IDs are kept; every other parameter, including order keys, is removed.\n* Staging protection: only the configured domains and production environments send data.\n* Automatic consent detection for the WP Consent API, Complianz, CookieYes and Cookiebot, plus a JavaScript API for other consent managers. Optional Do Not Track \/ Global Privacy Control support.\n* Custom tracker script name for servers that set TRACKER_SCRIPT_NAME, and an internal API URL for Umami on the same server or a private network.\n* Server-side report requests, encrypted API keys, capability and nonce checks.\n* Shared WebDig.DEV menu and installed-plugin hub, with independent operation.\n* Read-only report access by WordPress role or individual site user; settings stay administrator-only.\n* Saved-connection diagnostics, tracking exclusions and optional consent-gated tracker loading.\n* English source strings with bundled pt_PT, es_ES, fr_FR, de_DE and it_IT PHP and JavaScript translations.\n* No analytics data or credentials are sent to WebDig. Data goes to the Umami server you configure.<\/p>\n\n<p>Requirements: a self-hosted Umami server version 3.2 or later (the Performance and Revenue tabs were verified with Umami 3.4); HTTPS connectivity from visitor browsers to the public server URL. Dashboard access needs an API key or a valid Bearer token. Use a separate Umami account that can only access the relevant website.<\/p>\n\n<h4>External service and privacy<\/h4>\n\n<p>The plugin loads the official tracker from your configured server (by default \/script.js). The tracker sends page views, event data, browser\/device information and, when enabled, performance measurements to that server. It uses the visitor IP for Umami processing and geographic estimates. With server-side purchase tracking, WordPress sends paid-order events to the same server with the customer IP address and browser user agent stored by WooCommerce, so the purchase joins the visitor's Umami session. Refer to your Umami server's privacy policy and configuration. Umami documentation: https:\/\/docs.umami.is\/docs\/ . No central WebDig analytics service is required.<\/p>\n\n<p>Automatic tracking excludes form values, customer names, customer emails and addresses. Email and phone link events do not include the link text. Tracked URLs keep only the query parameters listed in the settings (campaign parameters by default); fragments and order keys are always removed. External referrers are reduced to their origin. User-supplied custom event data remains the site owner's responsibility. Add data-webdig-ignore to any element whose clicks should not be recorded.<\/p>\n\n<p>Purchase deduplication stores an order marker in the visitor's localStorage. By default the plugin does not wait for consent. Enable \"Wait for consent before loading the tracker\" to prevent tracker loading and analytics requests until consent is granted. The plugin does not include a consent banner. Its analytics settings do not determine your website's legal obligations.<\/p>\n\n<h4>Purchase tracking scope<\/h4>\n\n<p>Browser mode (default): purchases are tracked when the order is paid and the customer returns to a valid order confirmation URL. The order key is verified and is not sent to Umami. Reloads are deduplicated in the same browser, but cross-device or cleared-storage duplicates remain possible.<\/p>\n\n<p>Server mode (recommended): at checkout the plugin records whether the order may be tracked, applying the consent, privacy-signal and role-exclusion settings. When WooCommerce marks the order as paid, the purchase is sent once from the server through Action Scheduler, with up to three attempts; a final failure is noted on the order. Orders created in the admin or through the REST API are not sent. When consent is required, the tracker mirrors consent in a first-party wda_consent cookie, or the WP Consent API is used, so the server can respect it.<\/p>\n\n<p>In both modes, refunds do not amend the original Umami event. Analytics revenue is not an accounting record.<\/p>\n\n<p>Legacy AJAX cart events and WooCommerce Blocks events are supported. Non-AJAX product form submissions are recorded as add_to_cart_attempt, not confirmed cart additions. Custom cart extensions can require their own integration.<\/p>\n\n<p>Portuguese (Portugal) documentation is included in readme-pt_PT.txt. \/ A documenta\u00e7\u00e3o em portugu\u00eas de Portugal est\u00e1 inclu\u00edda em readme-pt_PT.txt.<\/p>\n\n<h3>Frequently requested configuration<\/h3>\n\n<h4>Consent manager integration<\/h4>\n\n<p>Enable \"Wait for consent before loading the tracker\". In automatic mode the plugin follows the \"statistics\" category of the WP Consent API, Complianz and Cookiebot, and the \"analytics\" category of CookieYes. Any other consent manager can call window.WebDigAnalytics.setConsent(true) after analytics consent and window.WebDigAnalytics.setConsent(false) when it is withdrawn, after the plugin script has initialized. Before approval no Umami script is inserted, no events are queued and purchase localStorage markers are not accessed. Withdrawal stops subsequent sends; it cannot recall requests already sent. Granting consent again does not create an extra page view. Test your consent manager on the real site.<\/p>\n\n<h4>Tracking exclusions<\/h4>\n\n<p>Select roles to exclude or enter one path per line. \/private\/* excludes paths with that prefix; \/account\/ excludes that exact path. Rules use the request path, including any WordPress subdirectory. Clear page\/CDN caches after changing tracking, exclusions or consent settings. Existing cached HTML can otherwise retain previous settings; role exclusions require a cache that separates logged-in traffic correctly.<\/p>\n\n<h4>Umami share URLs<\/h4>\n\n<p>Share links are hidden from non-administrators unless you explicitly enable them. A public share URL may permit access outside WordPress; removing report permissions does not revoke a URL someone already knows. Revoke or rotate it in Umami when needed.<\/p>\n\n<h4>Diagnostics and custom periods<\/h4>\n\n<p>Save settings before using \"Test saved connection\". Authentication, missing endpoints, network failures and invalid JSON are reported separately, and the test warns when this environment does not send data. Custom dates use the WordPress timezone and include the final date, capped at the current time. Daily buckets are used for longer\/custom periods; boundary buckets can be partial. A failed comparison does not prevent current-period data from displaying. Reports are cached for two minutes; no reports are stored permanently in WordPress.<\/p>\n\n<h3>Development<\/h3>\n\n<p>Source tooling (not included in the distributed ZIP): composer install, then composer lint (WordPress Coding Standards) and composer test (PHPUnit). npm test runs the tracker tests in Chromium with Playwright; npm run format applies Prettier. python3 bin\/i18n.py regenerates the POT, PO, MO and JSON catalogs. bash bin\/build.sh creates the distribution ZIP.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the ZIP in Plugins &gt; Add New &gt; Upload Plugin and activate it.<\/li>\n<li>Create a website in your Umami instance and copy its Website ID.<\/li>\n<li>Open WebDig.DEV &gt; Analytics &gt; Settings in the WordPress admin menu.<\/li>\n<li>Enter your server base URL, Website ID and report API key. Enable tracking.<\/li>\n<li>Check the tracked domains (pre-filled with this site's domain) and select the tracking features you need. For WooCommerce, choose server-side purchase tracking.<\/li>\n<li>Optionally enter the Umami share URL.<\/li>\n<li>Remove other Umami snippets\/plugins and clear site\/CDN caches.<\/li>\n<li>Open WebDig.DEV &gt; Analytics for reports, or Dashboard &gt; Home for the statistics widget. If hidden, enable it in Screen Options.<\/li>\n<li>Test tracking in a private browser window. Administrators are excluded from tracking by default.<\/li>\n<\/ol>\n\n<p>Plugin activation, tracking and widget visibility are separate. Activate the plugin on the Plugins page, then enable tracking in its settings to start collecting visits. Showing or hiding the dashboard widget does not start or stop tracking. Statistics are displayed in the WordPress administration area and Umami, not on public site pages. The API key is required for dashboard reports, but not for collecting visits.<\/p>\n\n<p>Settings remain when deactivating or updating the plugin. Uninstalling deletes this site's plugin settings, scheduled purchase sends and local report caches. It does not delete data on your Umami server. Multisite installs must be configured separately per site; network-wide provisioning is not included.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"visitors%20versus%20visits%3F\"><h3>Visitors versus visits?<\/h3><\/dt>\n<dd><p>Visitors are anonymous unique visitor estimates. Visits count browsing sessions. One visitor can generate multiple visits. Neither is an exact count of people.<\/p><\/dd>\n<dt id=\"where%20are%20core%20web%20vitals%20displayed%3F\"><h3>Where are Core Web Vitals displayed?<\/h3><\/dt>\n<dd><p>Enable the performance option, then open the Performance tab in WebDig.DEV &gt; Analytics. It shows the 75th percentile of each metric with Google's good \/ needs improvement \/ poor thresholds and the slowest pages by LCP. New data is collected from real visitor browsers; no historical measurements are generated.<\/p><\/dd>\n<dt id=\"why%20do%20staging%20copies%20not%20send%20data%3F\"><h3>Why do staging copies not send data?<\/h3><\/dt>\n<dd><p>Only hostnames in \"Tracked domains\" send data, and by default only production environments (WP_ENVIRONMENT_TYPE). A cloned database keeps the production domain list, so the clone stays silent. Add extra domains if the same site is served on several hostnames.<\/p><\/dd>\n<dt id=\"umami%20runs%20on%20the%20same%20server%20or%20in%20docker\"><h3>Umami runs on the same server or in Docker<\/h3><\/dt>\n<dd><p>The plugin refuses private and loopback addresses for the public server URL. Set \"Internal API URL\" (for example http:\/\/127.0.0.1:3000 or http:\/\/umami:3000) for requests from WordPress; visitors keep using the public HTTPS URL. \"Test saved connection\" shows the technical error when a request fails.<\/p><\/dd>\n<dt id=\"ad%20blockers%20block%20the%20tracker\"><h3>Ad blockers block the tracker<\/h3><\/dt>\n<dd><p>Configure TRACKER_SCRIPT_NAME (and optionally COLLECT_API_ENDPOINT) on your Umami server, then enter the same script name in the settings. Server-side purchase tracking is never affected by ad blockers.<\/p><\/dd>\n<dt id=\"can%20i%20change%20a%20saved%20api%20key%3F\"><h3>Can I change a saved API key?<\/h3><\/dt>\n<dd><p>Delete the key first, then save a new one. Keys defined as WEBDIG_ANALYTICS_API_TOKEN in wp-config.php must be changed there. Changing WordPress salts invalidates keys stored encrypted in the database.<\/p><\/dd>\n<dt id=\"how%20do%20languages%20work%3F\"><h3>How do languages work?<\/h3><\/dt>\n<dd><p>The admin interface follows the user's WordPress language. English is the source language. Portuguese (Portugal), Spanish (Spain), French, German and Italian are included. Regional locales do not automatically fall back to a different regional translation. The languages directory contains a POT template, PO\/MO translations and WordPress JavaScript JSON catalogs. Third-party data, custom event names and browser names are not translated by gettext.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20the%20dashboard%20panel%3F\"><h3>Can I hide the dashboard panel?<\/h3><\/dt>\n<dd><p>Yes. Use Screen Options on the WordPress dashboard. Administrators always have access. Select report roles or additional site users in Analytics settings. These users can read reports but cannot change settings or test the saved connection. Customers and subscribers are not listed individually; grant access by role. Access is checked for pages and AJAX requests. Users can have the selected role on this site or be selected individually; removing a user from the site revokes access.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20separate%20pixel%3F\"><h3>Do I need a separate pixel?<\/h3><\/dt>\n<dd><p>No. The plugin loads the configured Umami tracker. The reporting API key stays on the WordPress server.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added server-side WooCommerce purchase tracking through Action Scheduler, covering delayed payments and ad-blocked browsers, with consent captured at checkout.<\/li>\n<li>Added Performance (Core Web Vitals), Revenue, Events and Sources tabs to the reports.<\/li>\n<li>Added staging protection: tracked-domain list (pre-filled on upgrade) and a production-only option.<\/li>\n<li>Campaign parameters (utm_*) and ad click IDs are now kept in tracked URLs through a configurable allow-list. Order keys are always removed.<\/li>\n<li>Added automatic consent detection for the WP Consent API, Complianz, CookieYes and Cookiebot, and optional Do Not Track \/ Global Privacy Control support. The plugin registers with the WP Consent API.<\/li>\n<li>Added a tracker script name setting (TRACKER_SCRIPT_NAME), an internal API URL for private networks, a preconnect hint and technical details in the connection test.<\/li>\n<li>Click events include up to 50 characters of the element label (not for email and phone links). Internal link clicks are now optional; existing sites keep their previous behavior.<\/li>\n<li>Chart tooltips on hover and keyboard focus; dates and times are formatted in the user's locale.<\/li>\n<li>Fixed: the additional-users list no longer loads every customer on large shops.<\/li>\n<li>Fixed: report viewers no longer gain access to another WebDig.DEV plugin's hub page; they get their own Analytics menu entry when needed.<\/li>\n<li>Fixed: granting consent again after a withdrawal no longer records a second page view.<\/li>\n<li>Fixed: a malformed link no longer breaks click tracking.<\/li>\n<li>Fixed: timezones written as UTC offsets are now encoded correctly in report requests.<\/li>\n<li>Fixed: breakdown tables now label Umami's visitor counts as visitors.<\/li>\n<li>Reports use the comparison that Umami 3 returns with its statistics, saving one API request per refresh.<\/li>\n<li>Code split into classes following the WordPress Coding Standards, with PHPUnit and browser tests. Duplicate hash-named JSON translation files removed.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Validated on WordPress 7.1 and updated the Tested up to header.<\/li>\n<li>Moved settings into a tab inside Analytics and removed the separate sidebar settings entry. Existing direct settings links remain supported.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added the shared WebDig.DEV hub and menu, consistent headings and settings action link.<\/li>\n<li>Added read-only report access by role and individual site user while retaining legacy shop-manager access.<\/li>\n<li>Added a reports page, 7\/30-day and custom periods, and previous-period comparisons for visitors, visits and page views.<\/li>\n<li>Added saved-connection diagnostics with clearer authentication and endpoint errors.<\/li>\n<li>Added optional consent-gated tracking and role\/path exclusions; existing tracking behavior is retained by default.<\/li>\n<li>Restricted public share links to administrators unless explicitly enabled for report viewers.<\/li>\n<li>Added complete PHP\/JavaScript catalogs for pt_PT, es_ES, fr_FR, de_DE and it_IT.<\/li>\n<li>Preserved settings, encrypted keys and the first-save API key fix from 1.0.1.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed API key storage on the first settings save by preserving the sanitized result during WordPress option creation.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Updated plugin name to WebDig.DEV Analytics, author to WebDig and author website to https:\/\/webdig.dev.<\/li>\n<li>Updated bundled translations and added Portuguese documentation.<\/li>\n<li>Stable release with English source strings and complete Portuguese (Portugal) UI translations.<\/li>\n<li>Visitor countries replace screen resolutions; country codes are displayed as localized names.<\/li>\n<li>Clear visitor\/visit definitions and generic server setup instructions.<\/li>\n<li>Dashboard assets load at the WordPress admin enqueue stage.<\/li>\n<li>Input validation hardening and documented privacy\/purchase tracking scope.<\/li>\n<\/ul>","raw_excerpt":"Self-hosted Umami analytics, visitor insights, Core Web Vitals and WooCommerce events in your WordPress dashboard.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/380631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=380631"}],"author":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webdigpt"}],"wp:attachment":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=380631"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=380631"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=380631"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=380631"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=380631"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=380631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}