Skip to content

Traffic Funnel

Overview

Not every website visitor becomes an engaged Rose user. Visitors are filtered at several stages between landing on the page and being counted as engaged. This page documents each stage so you can reason about the gap between your raw site analytics (e.g. GA4, server logs) and the visitor counts shown in the Rose dashboard.

Funnel Stages

The widget audience is shaped by these sequential filters:

  1. Total website traffic — every visitor that loads a page where Rose is installed.
  2. Tag delivery — if Rose is loaded via Google Tag Manager (GTM), browser ad blockers prevent the GTM container from loading and Rose never reaches those visitors. Loading Rose via a direct <script> tag avoids this leak.
  3. Cookie consent — when a Consent Management Platform (CMP) gates third-party scripts, only visitors that accept cookies will load Rose. Visitors that decline or ignore the banner are lost here.
  4. Widget load time — Rose needs a few hundred ms to bootstrap. Visitors that bounce before bootstrap completes ("early quitters") never register as Rose visitors.
  5. Traffic allocation — the configured server-side percentage allocation (see Traffic Control). Visitors outside the allocated bucket do not see the widget.
  6. Engaged visitors — sessions lasting 10 seconds or more. Sessions shorter than 10s are treated as bounces and excluded from dashboard metrics (see What's New — More accurate dashboard metrics).

Sankey Diagram

The diagram below uses illustrative numbers to show how a cohort of 10 000 visitors flows through each stage. The exact retention rate at each stage depends on your audience, CMP configuration, and traffic allocation.

--- config: themeVariables: fontSize: "22px" fontFamily: "Inter, system-ui, sans-serif" sankey: showValues: true linkColor: gradient nodeAlignment: justify width: 1400 height: 700 --- sankey-beta Website Traffic,Blocked by Ad Blocker,1500 Website Traffic,Script Loaded,8500 Script Loaded,Declined Consent,2500 Script Loaded,Consent Granted,6000 Consent Granted,Early Quitter,900 Consent Granted,Bootstrap Complete,5100 Bootstrap Complete,Outside Allocation,1530 Bootstrap Complete,Inside Allocation,3570 Inside Allocation,Bounce (under 10s),1500 Inside Allocation,Engaged Visitor,2070

In this scenario 10 000 visitors collapse to 2 070 engaged — a 20.7% end-to-end retention. The biggest single losses are consent decline (25%) and outside allocation (15.3% — set by the traffic allocation).

In this scenario 10 000 visitors collapse to 2 070 engaged — a 20.7% end-to-end retention. The biggest single losses are consent decline (25%) and outside allocation (15.3% — set by the traffic allocation).

Flowchart View

If you prefer a decision-tree style view of the same funnel:

flowchart TD A[Visitor loads page] --> B{Loaded via GTM?} B -->|Yes + ad blocker| L1[Lost: ad blocker] B -->|No, or no ad blocker| C{CMP gating scripts?} C -->|Visitor declined / ignored| L2[Lost: no consent] C -->|Accepted or no CMP| D[Rose bootstrap starts] D --> E{Visitor stays for bootstrap?} E -->|No| L3[Lost: early quitter] E -->|Yes| F{Inside traffic allocation?} F -->|No| L4[Not shown widget] F -->|Yes| G{Session >= 10s?} G -->|No| L5[Bounce, excluded from metrics] G -->|Yes| H[Engaged visitor]

Reducing Leakage

Stage Mitigation
Ad blocker Load the Rose script directly instead of via GTM.
Cookie consent Place Rose in the "necessary" / "functional" CMP category if compliance allows, or improve consent acceptance rates.
Early quitter Keep page weight low so Rose bootstraps quickly.
Allocation Increase the traffic allocation percentage as confidence grows.
<10s bounce Improve landing page relevance so visitors stay long enough to engage.

How the Sankey Was Drawn

The diagram uses Mermaid's sankey-beta renderer, which is already enabled in this docs site through pymdownx.superfences (see mkdocs.yml). To update the numbers, edit the Source,Target,Value lines in the code block above — no extra tooling is required.

Alternative tools considered:

  • D3.js sankey — interactive, but requires custom JS in the docs site.
  • Plotly / Python — good for data-driven generation, exports as static image.
  • SankeyMATIC — quick web tool that produces a PNG; useful for ad-hoc decks.

Mermaid was chosen because it keeps the diagram source readable and version-controlled inside the markdown file.