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.
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.
utm_source, utm_medium and utm_campaign. Those three are the only UTM parameters stored.data-gm-event on the call-to-action button. One attribute, no JavaScript, and the click is recorded with the page path and the session's UTM.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.
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:
utm_source is the specific place the link lives: a newsletter name, a site, a platform.utm_medium is the type of channel: email, social, referral, paid.utm_campaign is the launch itself, plus anything you need to tell apart.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 lives | utm_source | utm_medium | utm_campaign |
|---|---|---|---|
| Launch email to your list | newsletter | launch-main | |
| Founder post on a social profile | social | launch-main | |
| Link in a community thread | community-forum | referral | launch-main |
| Partner's newsletter mention | partner-name | launch-partner | |
| Paid placement, headline A | ad-network | paid | launch-paid-a |
| Paid placement, headline B | ad-network | paid | launch-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.
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.
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:
section through the programmatic call, or use two names if you only use the attribute form. Decide before launch, because renaming mid-week splits your counts.The custom events guide goes deeper on naming patterns that keep the panel readable as the list grows.
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.
| Panel | What it shows | Launch question it answers | Limit to remember |
|---|---|---|---|
| UTM Breakdown | Source, medium, campaign and visits, for the top 20 combinations | Which tagged link brought the most visits? | Fixed columns; no filter by campaign inside the panel |
| Referrers and source types | Referrer names, grouped into search, social, direct and referral | What traffic arrived that you did not tag? Who linked to you? | No referrer header means "direct" |
| Entry pages | The page each visit started on | Is the launch page the front door, or is traffic landing elsewhere? | Shows pages, not which campaign sent each entry |
| Scroll-depth funnel | How far down the page visitors got | Do visitors reach the pricing block and the signup form? | Depth is a position on the page, not proof of reading |
| Custom Events | Event name, count and last fired | How many CTA clicks, and when was the last one? | Fixed columns; no per-campaign view in the panel |
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.
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 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.
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.
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.
utm_content is not stored).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.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 know | In GhostMetrics | Use instead |
|---|---|---|
| Revenue per campaign | No numeric value or revenue field on events | Your payment or CRM tool for revenue, then join to campaign visit counts from the dashboard or export |
| A funnel across several visits | No per-visitor funnel across sessions; nothing persists after the tab closes | An in-product or CRM record that follows a signed-in user; a coupon or referral code per channel |
| Which ad variant or button placement won | Only source, medium and campaign are stored; no utm_term or utm_content | Put the variant in the campaign name, or use the ad platform's own reporting |
| Ad spend, impressions, cost per click | No ad-platform integration | The ad platform's dashboard; combine with visit counts by campaign name |
| Email opens and link clicks | Not tracked | Your email platform; use the dashboard for what readers did after the click |
| Returning visitors and multi-session attribution | None, by design | Accept 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.
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.
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.
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.