Features
High-value, still cookieless.
14 jobs people actually buy analytics for. They ship today. No replay, no extra identity, no second kilobyte in the default script.
Features
14 jobs people actually buy analytics for. They ship today. No replay, no extra identity, no second kilobyte in the default script.
01 · Now
A signup is a signup. It is not another pageview on the invoice.
Call cfa('signup') when someone finishes the thing you actually wanted. The dashboard shows how many same-day visitors did it, and what share that is. Named events are not billed. No extra identity, no second script.
02 · Now
Opt-in. The 1 KB file stays 1 KB. A second helper counts the click.
Tick “also count clicks” in site settings. That adds a second file, cf-clicks.js: outbound hosts, file extensions (pdf, zip, …), buttons, and anything with data-cfa="…". Same POST beacon, named events, not billed. Not a heatmap. The default script does not listen.
03 · Now
The briefing you already see, mailed once a week. No extra tracking.
Monday, once. Visitors, pageviews, top page and source from the last 7 days. Unsubscribe is a link. Switch it off in account settings. Not a daily drip.
04 · Now
utm_source, medium, campaign, content, term. Everything else is dropped in the browser.
The script allowlists those five and POSTs them in the body, so tokens and emails never hit access logs. Inner SPA routes do not inherit the landing UTMs. The dashboard lists source, medium, campaign, content, and term separately. Messy URLs stay messy on your site — they do not become our dimension soup.
05 · Now
OAuth with your Google login. Empty on the dashboard until then — no invented clicks.
Connect Google on the dashboard. You grant Search Console read on a property you own. The table stays empty until then — we do not invent clicks.
06 · Now
Unique visitors, visits, pageviews, views per visit, bounce, duration. Line, bars, or auto. Compare overlays the previous window.
The numbers sit on the chart, not in a separate row. Click a tile to overlay. Compare draws the previous window as a dashed line, aligned point-for-point (yesterday on Today, the seven days before Last 7 days). Tiles already show the period delta. Auto uses columns for hours and short ranges, a line for longer trends, and a mix when you overlay volume with bounce or duration (counts as bars, rates as lines). Mixed units are scaled so the shapes stay readable; the tooltip keeps the real figures. Visit duration is last minus first pageview in a 30-minute visit. One-page visits are 0 seconds. No heartbeat, no extra script.
07 · Now
You write a launch. The first day a UTM campaign arrives, we stamp it. Volume stays on the chart.
Vertical line, tooltip, list. Type a note, or we add “Campaign: …” the first time that utm_campaign (or source / medium) is seen. Day-over-day traffic % is not a note — the tiles already show that. The Monday briefing is separate and is not mailed from these stamps.
09 · Now
Natural Earth outlines. Click a country to zoom. Tabs for regions and cities from the same edge headers.
Natural Earth 110m outlines on the dashboard. Click a country to filter and zoom. Regions and cities are copied from Vercel or Cloudflare request headers (US-CA, not a MaxMind city database). No IP, no lat/long, no postal code, no map tiles. Tests fail an empty map.
10 · Now
Who is on which path right now, without a heartbeat.
Distinct visitor hashes in the last five minutes. The path is their last pageview. A tab left open does not ping. No extra script. The pill at the top of the dashboard jumps to the list.
11 · Now
A hashed bearer. The same visitors, pages, sources, and live you already see.
Starter and Growth. Mint cfa_live_… on Account. We store a hash, show the secret once. GET /api/v1/sites and overview, pages, sources, live. Growth adds funnels. No visitor hashes. No raw pageview dump. Hobby stays the dashboard. MCP is the next card — same token.
12 · Now
Ask after a deploy. OAuth 2.1 in Claude and Cursor, or the hashed bearer. No visitor hashes.
Starter and Growth. POST /mcp is Streamable HTTP JSON-RPC. Tools: list_sites, get_overview, get_pages, get_sources, get_live, get_funnels. Claude and Cursor sign in on this host — that is OAuth 2.1, not a Google access token. curl still uses cfa_live_… from Account. The model sees aggregates, not hashes. Recipe: /blog/cookieless-analytics-mcp.
13 · Now
Drop-off between pages and events. A hash cannot cross midnight.
Two to eight steps: a path or a cfa() event. Visitors who hit step 1, then 2, on the same UTC day. The salt is deleted at midnight, so we do not pretend a funnel spans days. No extra script. No session replay. Hobby and Starter keep a single goal.
14 · Now
A checkout funnel, speed pages, and goals from events that already fire. You confirm. Nothing invented.
The dashboard can read your homepage menu and the paths that already have pageviews. On Growth it can save a same-day funnel (landing → product → checkout) if those URLs exist. Goals still need a cfa() event that already fired. Grok names the plan when xAI is connected; without it we still pick from the page list. Owner click, not a silent rewrite. Grok naming shares the period-briefing daily cap.
The moat is how we collect and how we forget. Full recipe on /methodology.