{"id":"6a075b82b18efe2754c5cb40","title":"2026 05 15","path":"how-to/committee/release-notes/2026-05-15","contentMarkdown":"# 15-May-2026 — cookieless analytics with PECR-compliant beacon and dashboard [ref: #217](https://github.com/nbarrett/ngx-ramblers/issues/217)\n\n## [build 644](https://github.com/nbarrett/ngx-ramblers/actions/runs/25931730355) — [commit 0283fcd](https://github.com/nbarrett/ngx-ramblers/commit/0283fcd6ad04a2851c11f232ca8c3b470346e6a3)\n\n_____\n\n### Adds Cloudflare Web Analytics to NGX: a cookieless, PECR-compliant visitor beacon and an in-app dashboard\n- It sets no cookies, so no cookie-consent banner is needed. \n- A step-by-step how-to guide for group administrators, covering the split between the central Cloudflare setup and the per-group NGX configuration, is published [here](https://www.ngx-ramblers.org.uk/how-to/technical-articles/2026-05-15-cloudflare-web-analytics-setup). \n- Dashboard shows page view and visit totals, a timeseries chart, top paths,\ncountries, referrers, devices and browsers, and Core Web Vitals, queried via\nCloudflare's RUM GraphQL API; preset ranges plus a date range slider. Screenshot below sums up the look and feel on offer:\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/b562a98a-25a1-4bf7-9bfc-608cd6d89af0.jpeg)\n\n\n### What was done\n- Beacon injects beacon.min.js with the site's beacon token at app startup when\nWeb Analytics is enabled\n- System Settings holds two separate fields: Beacon Token (the data-cf-beacon\ntoken) and Site Tag (the RUM site tag used for analytics queries)\n- Web Vitals uses the rumWebVitalsEventsAdaptiveGroups sum aggregates\n- No in-app create-site button: Cloudflare's RUM site_info REST API rejects the\nscoped API token NGX uses, so sites are created in the Cloudflare dashboard and\nlinked by pasting the Beacon Token and Site Tag\n\n### Bundled with this work, a codebase-wide typing cleanup:\n\n- Convert all string-literal union types to string TypeScript enums; values are\nunchanged so wire, Mongo and query-string values are preserved\n- Add an ESLint rule banning string-literal union types\n- Relocate enums and stray exported interfaces/types into *.model.ts files","contentHtml":"<h1>15-May-2026 — cookieless analytics with PECR-compliant beacon and dashboard <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/217\">ref: #217</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/25931730355\">build 644</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/0283fcd6ad04a2851c11f232ca8c3b470346e6a3\">commit 0283fcd</a></h2>\n<hr>\n<h3>Adds Cloudflare Web Analytics to NGX: a cookieless, PECR-compliant visitor beacon and an in-app dashboard</h3>\n<ul>\n<li>It sets no cookies, so no cookie-consent banner is needed. </li>\n<li>A step-by-step how-to guide for group administrators, covering the split between the central Cloudflare setup and the per-group NGX configuration, is published <a href=\"https://www.ngx-ramblers.org.uk/how-to/technical-articles/2026-05-15-cloudflare-web-analytics-setup\">here</a>. </li>\n<li>Dashboard shows page view and visit totals, a timeseries chart, top paths,\ncountries, referrers, devices and browsers, and Core Web Vitals, queried via\nCloudflare&#39;s RUM GraphQL API; preset ranges plus a date range slider. Screenshot below sums up the look and feel on offer:</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/b562a98a-25a1-4bf7-9bfc-608cd6d89af0.jpeg\" alt=\"\"></p>\n<h3>What was done</h3>\n<ul>\n<li>Beacon injects beacon.min.js with the site&#39;s beacon token at app startup when\nWeb Analytics is enabled</li>\n<li>System Settings holds two separate fields: Beacon Token (the data-cf-beacon\ntoken) and Site Tag (the RUM site tag used for analytics queries)</li>\n<li>Web Vitals uses the rumWebVitalsEventsAdaptiveGroups sum aggregates</li>\n<li>No in-app create-site button: Cloudflare&#39;s RUM site_info REST API rejects the\nscoped API token NGX uses, so sites are created in the Cloudflare dashboard and\nlinked by pasting the Beacon Token and Site Tag</li>\n</ul>\n<h3>Bundled with this work, a codebase-wide typing cleanup:</h3>\n<ul>\n<li>Convert all string-literal union types to string TypeScript enums; values are\nunchanged so wire, Mongo and query-string values are preserved</li>\n<li>Add an ESLint rule banning string-literal union types</li>\n<li>Relocate enums and stray exported interfaces/types into *.model.ts files</li>\n</ul>\n"}