Landing Page and Campaign Analytics Without Google (2026)

A launch gives you a few days of concentrated traffic and no second chance to set up measurement. Here is the workflow for a cookieless tool: tag the links, count the call to action, read four panels, and know in advance what the data cannot tell you.

By Null Agency · Updated October 20, 2026 · Written for founders, marketers and developers launching a product page, a campaign or a waitlist

TL;DR — three UTM parameters, one event, four panels

A launch page needs to answer four questions: which link sent the visitor, which page they entered on, whether they read it, and whether they clicked the main button. You can answer all four without Google Analytics, a cookie banner or a tag manager.

What a launch page needs to answer

Analytics for a launch is a different job from analytics for a content site. A blog accumulates traffic for years and the useful questions are about trends. A launch concentrates most of its traffic into a short burst driven by a handful of sources you control: a post, an email, a community thread, a partner mention, maybe a paid placement. The decisions you make during that burst are narrow. Which of these sources is worth another hour of effort? Is the page itself losing people before the button? Did the button get clicked?

That maps to four measurements:

Everything else on a typical analytics dashboard is context. If you need the basics of measuring a site in general, how to measure website traffic covers the fundamentals. This page assumes the tool is already installed (one script tag in the <head>) and focuses on the launch workflow around it.

The reason to do this without Google Analytics is not ideology. A launch page often exists to collect a signup, and a consent banner sitting above the signup form is friction on the one element that matters. GhostMetrics sets no cookies, uses no localStorage and stores no IP addresses, so there is nothing to ask consent for on its account. The longer argument is in web analytics without a consent banner.

Step one: tag every link you control

If a visitor arrives with no utm_* parameters and no referrer header, the dashboard files the visit under "direct". It cannot tell a typed URL from a link whose referrer was stripped by a messaging app, an email client or an https-to-http hop. On a launch, most of your early traffic comes through exactly those channels, so untagged links turn your best data into a large direct bucket. The fix is cheap: tag everything you can.

The UTM parameters guide covers what each of the five standard parameters means and the common naming mistakes. For launch purposes, only the three that GhostMetrics stores matter:

Because utm_term and utm_content are not stored, there is no field for "ad variant B" or "button at the top versus the bottom". If you need that split, push it into the campaign name. A scheme that survives a busy week:

Where the link livesutm_sourceutm_mediumutm_campaign
Launch email to your listnewsletteremaillaunch-main
Founder post on a social profilelinkedinsociallaunch-main
Link in a community threadcommunity-forumreferrallaunch-main
Partner's newsletter mentionpartner-nameemaillaunch-partner
Paid placement, headline Aad-networkpaidlaunch-paid-a
Paid placement, headline Bad-networkpaidlaunch-paid-b

The last two rows show the workaround: the variant lives in the campaign name because there is no utm_content to hold it. A finished link looks like this:

https://example.com/launch?utm_source=newsletter&utm_medium=email&utm_campaign=launch-main

Keep every value lowercase and hyphenated. The UTM Breakdown groups on exact strings, so Newsletter and newsletter become two rows and your totals split. Write the scheme in a shared note before anyone creates a link, and have one person generate all of them. Do not tag links between pages of your own site: an internal link with UTMs can label a visit that arrived untagged with a campaign it never came from.

How first-touch works in practice

When a visitor lands with UTMs in the URL, gm.js reads source, medium and campaign and keeps the first set it sees in sessionStorage for that tab. Every later pageview and custom event in that tab carries those values. That is useful on a launch: a visitor who clicks your email, reads the landing page, goes to pricing and then clicks the CTA has the CTA click attributed to the newsletter campaign, even though the pricing page URL has no UTMs.

The same design has a boundary you should plan around. sessionStorage clears when the tab closes and nothing persists afterward. A visitor who reads the launch email at breakfast, closes the tab, and comes back from a bookmark in the evening arrives as a new session with no campaign. The dashboard does not stitch the two together, by design; it keeps no cross-session identifier. Treat campaign numbers as a floor on what each channel produced, not a full count.

Step two: count the call-to-action click

A visit count tells you who showed up. The CTA click tells you whether the page worked. Add one attribute to the element that represents success:

<a class="btn" href="/signup" data-gm-event="launch-cta-click">Join the waitlist</a>

<button type="submit" data-gm-event="launch-form-submit">Request early access</button>

A single delegated listener on the document handles every data-gm-event element, so buttons rendered after page load by a client-side router, a modal or a widget are tracked without any re-binding. If a form submits without a click you can hook, such as an embedded form that posts to a third party, call the event from code at the moment of success:

window.ghostmetrics.track('waitlist-joined', { section: 'hero' });

Only section is stored as metadata. Each event carries the page path and the session's UTM, and the Custom Events panel lists event name, count and last-fired time. Two practical rules for launch week:

The custom events guide goes deeper on naming patterns that keep the panel readable as the list grows.

Step three: read the dashboard during the launch

With links tagged and the CTA instrumented, the dashboard's real-time view shows the first arrivals within moments, which doubles as a smoke test. After that, work through the panels in this order. Each answers one launch question, and each has a specific limit worth knowing.

PanelWhat it showsLaunch question it answersLimit to remember
UTM BreakdownSource, medium, campaign and visits, for the top 20 combinationsWhich tagged link brought the most visits?Fixed columns; no filter by campaign inside the panel
Referrers and source typesReferrer names, grouped into search, social, direct and referralWhat traffic arrived that you did not tag? Who linked to you?No referrer header means "direct"
Entry pagesThe page each visit started onIs the launch page the front door, or is traffic landing elsewhere?Shows pages, not which campaign sent each entry
Scroll-depth funnelHow far down the page visitors gotDo visitors reach the pricing block and the signup form?Depth is a position on the page, not proof of reading
Custom EventsEvent name, count and last firedHow many CTA clicks, and when was the last one?Fixed columns; no per-campaign view in the panel

Reading the UTM Breakdown

This is the main table for a launch. Sort your attention by the campaign column first, then by source. If launch-main shows 600 visits from newsletter and 40 from linkedin, you know where the effort paid off, and you can compare that against how much work each channel took. The visits column counts pageviews carrying that UTM set, so a reader who opens three pages in a tagged session counts three. The panel lists the top 20 combinations, so a launch with dozens of sources and variants can push small rows out of view. Keep the number of distinct combinations lower than that, or use the export for the full picture.

Reading referrers next to it

Referrers catch what you did not tag: a blogger who linked you unprompted, a forum thread someone else started, a directory listing. Compare the two panels. A large "direct" bucket with a small UTM Breakdown means your tagging missed channels or the clicks came through apps that strip referrers; direct traffic explained goes through the causes and a short list of fixes.

Entry pages and the scroll-depth funnel

Entry pages tell you whether visitors land where you expect. If your launch page is /launch and the entry list shows the home page at the top, the traffic you are paying for or earning is not seeing the page you built. The scroll-depth funnel then tells you how much of a landing page is actually reached. If most visitors stop before the block that holds the signup form, moving the form or repeating the CTA higher up is a better use of launch day than changing the headline. Read it as a position, not a verdict: depth does not prove the text was read.

Getting a per-campaign answer

The dashboard panels have fixed columns, so "how many CTA clicks came from launch-paid-a versus launch-paid-b" is not a single table view. The raw event export, available as CSV from the Export data button or as JSON from the API on every plan including free, carries the session UTM on each event row. Export it, group by utm_campaign and count rows where the event name is your CTA event. Divide that by the campaign's entry pageviews (rows in the events export with is_entry set, grouped the same way) and you have a click rate per landing session.

Pre-launch checklist

Most launch measurement failures are setup failures discovered after the traffic has gone. Run through this list the day before, while a mistake costs you nothing.

  1. Confirm the script is on every page in the path. Check the landing page, the pricing page and any thank-you page. Open each in a fresh tab and watch the visit appear in the real-time dashboard.
  2. Check your own browser settings. GhostMetrics honors Global Privacy Control and Do Not Track by collecting nothing, so a test visit from a browser with either enabled will not show up. That is correct behavior, not a broken install.
  3. Write down the UTM scheme. One shared note with lowercase, hyphenated values for source, medium and campaign, and a rule for where variants go (in the campaign name, since utm_content is not stored).
  4. Generate and test every tagged link. Click each one, then confirm that the visit lands in the UTM Breakdown with the exact source, medium and campaign you intended. Fix typos now; a typo in a live email cannot be corrected after it is sent.
  5. Add data-gm-event to the CTA and click it in a test session. Confirm the event name appears in the Custom Events panel with a recent last-fired time.
  6. Decide the success event and its name. One name for the main action. Write it next to the UTM scheme so everyone reads the same panel row.
  7. Test the full path with a tagged link. Click a tagged link, move through two pages, click the CTA, and confirm the event shows the campaign on the export rather than only on the landing visit.
  8. Check the thank-you or handoff step. If the signup lives on another domain or inside an embedded form, decide how you will count completions there, in that tool, since this dashboard stops at your page.
  9. Set up the other half of the picture. Email opens and clicks live in your email platform, ad spend and impressions in the ad platform, revenue in your payment tool. Know where each number will come from before launch.
  10. Export a baseline. Pull a CSV before the launch so you can separate launch traffic from what the site received beforehand.
  11. Pick the review times. Look at the dashboard after the first hour, at the end of day one and after a week.

What you cannot measure, and what to use instead

A cookieless, session-scoped tool trades some analytical reach for not tracking people. For a launch, the trade is usually fine, as long as you know which questions to take somewhere else. These are the gaps that matter:

You want to knowIn GhostMetricsUse instead
Revenue per campaignNo numeric value or revenue field on eventsYour payment or CRM tool for revenue, then join to campaign visit counts from the dashboard or export
A funnel across several visitsNo per-visitor funnel across sessions; nothing persists after the tab closesAn in-product or CRM record that follows a signed-in user; a coupon or referral code per channel
Which ad variant or button placement wonOnly source, medium and campaign are stored; no utm_term or utm_contentPut the variant in the campaign name, or use the ad platform's own reporting
Ad spend, impressions, cost per clickNo ad-platform integrationThe ad platform's dashboard; combine with visit counts by campaign name
Email opens and link clicksNot trackedYour email platform; use the dashboard for what readers did after the click
Returning visitors and multi-session attributionNone, by designAccept it as a floor, or ask signups "how did you hear about us" at the form

The biggest practical gap is the handoff. If your landing page sits on a marketing domain and the signup form is on another, the CTA click is the last thing this dashboard sees. Completed signups have to be counted where they happen. A tidy way to reconcile is by campaign name: the dashboard says how many visits and CTA clicks launch-main produced, the signup system says how many accounts were created in the same period, and the ratio between them is your rough conversion rate.

For paid acquisition the honest answer is different. If you are buying traffic and need the ad platform to optimize on conversions, you need conversion events inside that platform, and Google Analytics 4 with its Ads integration is genuinely strong at that. A cookieless tool is a poor fit for ad-platform feedback loops and should not be pitched as one. For organic, email, community and partner launches, where you control the links, the workflow above gives you the answers you will actually act on. The Google Analytics alternatives page compares the options if your needs sit somewhere in between.

If your launch is a newsletter issue, the same method applies with one campaign per issue; newsletter traffic analytics covers that case specifically.

After launch: what to keep

Launch data has a shelf life, so export it. The CSV export on the dashboard carries every stored row and every column, on every plan, and ships with a manifest.json describing the columns. Save the file with the launch name. Then write down three things next to it: the UTM scheme you used, the dates of each send or post, and the success event name. Those notes are what let you compare one launch to the next later.

Then carry the scheme forward. Reuse the same source and medium values for the next campaign, change only the campaign name, and keep the main action's event name stable. The UTM Breakdown then stays comparable between launches.

Measure your launch without a banner or a tag manager

Free forever, no card1 siteUnlimited pageviewsNo cookie banner

GhostMetrics is cookieless web analytics with one script tag, about 3 KB compressed, and no cookies, no localStorage and no stored IP addresses. The free plan is free forever with no card: one site, unlimited pageviews, the real-time dashboard, every view, full history, plus raw CSV or JSON export on every plan. We use it on nullagency.io.

Need more than one site or a public dashboard URL? Pro is $9.99/mo flat with unlimited websites (fair-use ceiling of 250) and a 30-day free trial; a card starts the trial, nothing is charged for 30 days, and you can cancel anytime. Track the launch CTA with data-gm-event="launch-cta-click" on any element, or window.ghostmetrics.track('name', { section: 'hero' }) from code.

Start free, no card See the live demo

FAQ

Can I run a launch campaign without Google Analytics?
Yes, if the questions you need answered are about traffic and one main action: which link brought visitors, which pages they entered on, how far they scrolled, and whether they clicked the call to action. UTM-tagged links, the UTM Breakdown, referrers and a data-gm-event on the CTA cover that. You will not get ad-platform attribution, revenue values or cross-session funnels.
Which UTM parameters does GhostMetrics store?
utm_source, utm_medium and utm_campaign. utm_term and utm_content are not stored, so encode anything you need to tell apart, such as two ad variants, into the campaign name instead.
Does it attribute a signup to a campaign if the visitor returns later?
Not across sessions. The first UTM set seen is kept in sessionStorage for that tab and attached to later pageviews and custom events in it. It clears when the tab closes, and nothing persists afterward, so a visitor who returns tomorrow through an untagged link is not tied back to the original campaign.
Can I record revenue or conversion value?
No. Custom events carry the page path, any session UTM and an optional section label, but there is no numeric value or revenue field. Record revenue in your payment or CRM tool and compare it with campaign visit counts from the dashboard or the raw export.
Does the free plan cover a launch page?
Yes for one site. The free plan is free forever with no card: one website, unlimited pageviews, the real-time dashboard, every dashboard view, full history, and CSV or JSON export. If the launch page lives on a separate domain from your main site, a second site needs Pro at $9.99/mo.

Keep reading

UTM Parameters Guide

Naming conventions, case rules and common mistakes

Track Custom Events

data-gm-event and ghostmetrics.track patterns

Conversion Funnels Without GA4

How many landing visits reached the signup page

GhostMetrics Live Demo

The real dashboard, live data

Disclosure: GhostMetrics is built by Null Agency and we use it on this site, so we're not a neutral party about our own product. We've kept the claims to what the free and paid plans actually do and pointed to Google Analytics 4 where it genuinely fits better, namely ad-platform conversion tracking. Pricing for third-party products can change; always check the vendor's current pricing page before deciding.