Provider documentation and published plan limits checked on 8 November 2026. Prices and allowances can change; the linked official pages are the reference before choosing a service.
Handoff constraint: preserve zero operating cost and the existing setup. The alternatives below are dated research, not authorization to add services or enable billing. See free operation and handoff checks and AI maintenance instructions before considering a change.
Start with Cloudflare Web Analytics for free traffic and performance reporting. It is enough to understand whether people are finding the website, which websites refer them, and how the page performs on mobile devices.
If we need to measure booking-button clicks or distinguish campaigns, consider Umami Cloud Hobby. Its free hosted allowance currently covers 100,000 events per month for one website. It avoids maintaining an analytics server.
This recommendation reflects our current small, static website. A click on a booking link measures interest; confirmed bookings must come from the booking provider’s reporting or an integration.
Sources: Cloudflare Web Analytics, Umami pricing.
public/, deployed to https://her-move-berlin.pages.dev.infra/main.tf configures the Pages project and a Web Analytics site for her-move-berlin.pages.dev, linking the analytics tag and token to the Pages project. Collection requires applying this configuration and redeploying the website.Cloudflare has several analytics layers with different purposes:
| Layer | What it tells us | Relevance to Her move |
|---|---|---|
| Web Analytics | Browser traffic and real-user page performance | The starting point for our Pages website; enable it for the project. |
| Domain / edge analytics | Requests received by Cloudflare, bandwidth, caching and security activity | Relevant if we add a custom domain proxied through a zone in our Cloudflare account. Request counts include assets and automated traffic. |
| Workers / Pages Functions metrics | Server-code requests, failures and execution status | The checked-in website has no Pages Functions. These operational metrics do not replace visitor or conversion reporting. |
Sources: Web Analytics and edge analytics, Pages Functions metrics.
We can expect:
Cloudflare defines a visit using whether the referring hostname differs from the site hostname. A visit is not a persistent identity or a reliable count of individual people returning over time.
The main website is a single landing page, with separate Impressum and privacy-policy templates. Scrolling to sections such as #buchung does not load another HTML document and should not be treated as a separate page view; navigating to a legal page does load a separate document.
Sources: Metric definitions, Available dimensions.
Cloudflare describes Web Analytics as cookie-free. That does not automatically settle the privacy requirements of a particular configuration.
Sources: Cloudflare FAQ, Cloudflare privacy approach.
The public website can stay on Cloudflare Pages with any of these tools. Their browser script sends measurements to a separate analytics service.
| Option | Free allowance or cost | Useful for | Tradeoffs |
|---|---|---|---|
| Cloudflare Web Analytics | Free hosted service; six months of accessible history | Traffic sources, devices and browser performance | No custom events or UTM reports. |
| Umami Cloud Hobby | Free: 100,000 events/month, one website, six-month retention | Focused website analytics and custom click events | Page views and custom events consume the allowance. Confirm access and plan limits before adoption. |
| Google Analytics 4 | Standard service is free; optional services can cost extra | Campaign reporting, events and Google marketing integrations | More configuration and consent work. Event-level retention differs from aggregate report retention. |
| PostHog | 1 million analytics events/month free; free plan includes one project and one-year retention | More detailed event analysis and conversion journeys | More tooling than we currently need. Products have separate allowances; usage plans charge beyond free allowances. |
| Umami self-hosted | Free software; infrastructure and maintenance extra | Operating analytics under our own control | Requires a Node.js server, PostgreSQL, updates and backups. |
| Matomo On-Premise | Free Community software; infrastructure extra | Broader reporting with control over deployment | Server and database operations; some advanced features require paid plugins. Matomo Cloud is a separate paid service. |
| Plausible | Paid managed Cloud; free self-hosted Community Edition software | A focused managed dashboard, or a separately operated service | Cloud’s trial is not a permanent free tier. Community Edition requires infrastructure and differs from Cloud. |
“Free software” does not mean free operation: account for hosting, database storage, backups, upgrades and the maintainer’s time. Self-hosted analytics backends cannot run merely by placing their files in our static Pages deployment.
For GA4, check Google’s retention documentation when configuring the property. For Plausible, see the Cloud / Community Edition distinction. For Umami event tracking, see Track events.
| Our question | Suggested setup |
|---|---|
| Are people finding the website, and is it fast? | Cloudflare Web Analytics. |
| Which buttons and campaigns generate booking interest? | Umami Cloud Hobby with a small set of custom events and consistent campaign tags. |
| How do Google marketing campaigns perform? | Evaluate GA4 if its integrations justify the additional setup. |
| Can we operate analytics ourselves? | Evaluate self-hosted Umami or Matomo and assign responsibility for maintenance. |
| Where do people drop out of a complex booking journey? | Evaluate PostHog and the booking provider’s integration capabilities. |
These are project recommendations, not statements that a provider can observe external bookings without integration.
The pinned Cloudflare provider v5.28.1 supports cloudflare_web_analytics_site and the Pages project’s build_config.web_analytics_tag and build_config.web_analytics_token fields. The current Terraform configuration uses these to register her-move-berlin.pages.dev and enable Pages-managed script injection. auto_install = false disables separate zone-level injection; Pages handles injection through its analytics configuration.
To manage analytics through Terraform, the infrastructure API token needs:
| Permission | Purpose |
|---|---|
| Account → Cloudflare Pages → Edit | Manage the Pages project and its analytics linkage. |
| Account → Account Settings → Edit | Read and manage the Web Analytics site. |
Scope these permissions to the Cloudflare account containing her-move-berlin. Update the TERRAFORM_CLOUDFLARE_API_TOKEN repository secret used by both Terraform workflows. Local Terraform runs use the infrastructure token as CLOUDFLARE_API_TOKEN in the ignored infra/.env file.
The separate CLOUDFLARE_API_TOKEN GitHub Actions secret used by Deploy website only needs Pages Edit; do not add Account Settings permission to that deployment token. R2 state credentials do not change. Zone/DNS permissions are only needed if Terraform also manages the optional custom domain.
Permissions alone do not enable analytics. Follow the apply and redeployment steps below.
Sources: Web Analytics resource permissions, Pages resource fields and permissions. See also credential setup.
If analytics already exists for her-move-berlin.pages.dev but is not in Terraform state, import its existing site into the shared Terraform state before planning. Use the same backend and infrastructure credentials described in initial setup, replacing the placeholders with the actual account ID and Web Analytics site ID:
terraform -chdir=infra init
terraform -chdir=infra import cloudflare_web_analytics_site.her_move '<account_id>/<site_id>'
The site ID is the Web Analytics identifier, not the Pages project name or analytics token. Skip import if no analytics site exists.
main, review the Terraform - Plan workflow output. Confirm that it targets the existing her-move-berlin project and the intended analytics site. Stop if it proposes replacing or deleting a Pages project or changing unrelated infrastructure. Reconcile any state mismatch before apply.This configuration targets the current Pages hostname. When adopting a custom domain, review the analytics hostname configuration as part of that change.
Terraform manages the analytics linkage once applied. The dashboard remains useful for viewing reports and verifying collection. For a manual setup instead of Terraform:
public/ to main. See setup and deployment.https://her-move-berlin.pages.dev in a browser without an analytics blocker for this check.beacon.min.js loads and a beacon POST succeeds. Leave the page or hide the tab to trigger performance reporting.If nothing appears, confirm deployment occurred after enabling analytics. Check hostname configuration, blockers, CSP errors and beacon requests. A Cache-Control: public, no-transform header can prevent automatic injection. An ordinary GET request to the beacon endpoint is not a valid collection test.
When adding a custom domain later, verify tracking for its hostname and decide whether to include or separate traffic from the Pages address.
Sources: Official Pages setup, Data collection, Troubleshooting.
Start with weekly trends. Small visitor numbers can make daily conversion percentages misleading, and the repository alone cannot predict visitor or booking volume.
| Business question | Metric | Source |
|---|---|---|
| Is awareness growing? | Visits and referring websites | Cloudflare Web Analytics |
| Does the site work well on phones? | Mobile page performance and Core Web Vitals | Cloudflare Web Analytics |
| Are visitors interested in training? | booking_click, contact_click |
An event-capable tool, after real booking/contact links exist |
| Which campaign generates interest? | Consistent UTM tags on Instagram, QR and newsletter links | A campaign-capable tool such as Umami or GA4 |
| Does interest turn into bookings? | Confirmed bookings, counted separately from outbound clicks | Booking-provider reports or a supported confirmation/webhook integration |
An external booking-link click does not prove a booking happened. Cross-domain and embedded booking flows need support from the chosen provider. Do not infer completed conversions from clicks alone.
Create the website in the owner’s Umami account, add its provided tracker once to public/index.html, configure the permitted hostnames, and instrument the selected links. Deploy through the existing workflow and verify each event.
For example, after the tracker is configured, a future booking link could use:
<a href="https://booking-provider.example/our-page"
data-umami-event="booking_click">Book training</a>
The address is illustrative. This records a click, not a confirmed booking. Start with one provider collecting page views unless there is a specific reason to maintain both.
Source: Umami custom event instructions.
For this Berlin business, document the tool, purpose, collected data, retention, processor terms and any required consent before enabling collection. A cookie-free claim is not a blanket legal clearance. GA4 and advertising integrations also need attention to Google’s EEA consent requirements.
Sources: Google consent settings, German regulator guidance on cookies and tracking.