Build Log Our product

How we built and launched Trakr, our campaign URL builder for GA4

Trakr went live on 2 July 2026 at app.trakr.studio. It exists because sixteen years of analytics work kept showing the same wound: campaigns bleeding into GA4's Unassigned channel through hand-typed UTMs. This is the architecture, and what launch day actually looked like.

Published July 2026 by Balázs Turán, Creative Data Engineers.

What we built
  • A guided URL builder with governed syntax: configure your naming rules and channel definitions once, then every URL your team builds follows them, validated against GA4 channel definitions before copy.
  • Live since 2 July 2026: Free plan for solo use (no card), Pro at EUR 29 a month for the shared team workspace and bulk generation.
  • The stack: React on Netlify, Supabase Postgres with row-level security on every table, Deno edge functions, Stripe billing, Resend email, Slack alerting.
  • The launch itself was a tested code change: a regression test asserts that no waitlist copy survives anywhere on the site.
Why we built it

Unassigned is not a GA4 bug, it is a governance gap

When traffic lands in GA4's Unassigned channel, the data was usually broken at the moment someone typed a UTM by hand. Google's own URL builder is five empty text fields with no rules, no validation, and no way to share a naming convention with a team. We kept rebuilding the same governance for clients: agreed syntax, allowed values, channel checks. Trakr is that governance turned into a product.

The builder is a wizard, and the wizard is generated from your own configuration: which UTM parameters you use, which fields compose each one, the separators, the allowed values, and your channel definitions (the 18 standard GA4 ones are built in, custom ones welcome). The review step tells you which channel the URL will land in before you ever copy it.

The system

Two front doors, one governed backend

A static landing at trakr.studio and the React app at app.trakr.studio, both on Netlify, share one Supabase backend: Postgres with row-level security on every table, auth with Google and Microsoft sign-in, and edge functions that talk to Stripe, Resend, and Slack.

Our product Data layer External services Human gate

Hover or focus any box for a plain-language explanation.

A The product A static landing and the app, both on Netlify sign up LANDING trakr.studio pricing, guides, help center APP app.trakr.studio React SPA, guided builder LAUNCH DAY The launch switch a tested copy flip, merged one backend B One Supabase backend Auth, row-level-secured Postgres, and edge functions who you are server-side work IDENTITY Auth Google, Microsoft, email DATA Postgres with RLS every row owner-scoped SERVER Edge functions billing, invites, webhooks the outside world C The money and the mail Payments, email, and an alert channel that watches both receipts, invites anomalies PAYMENTS Stripe Pro EUR 29/mo, free = no card EMAIL Resend auth, invites, announcements ALERTING Slack alerts a human notices same day

Launch state is verifiable in the codebase, which we like: the waitlist-to-live flip is asserted by a test, robots and sitemap opened up for indexing on launch day, and the announcement sequence went out the morning after through the same email infrastructure the product uses.

What it looks like

Configure once, build forever

Three moments from the product, with demo data: the syntax configuration that generates the wizard, the guided builder with its live URL preview, and the validation step that tells you where the URL will land before you copy it.

Trakr's Configure Syntax screen: global separator settings, UTM parameter fields, and a live preview of the generated wizard steps
The configuration IS the product. Separators, fields, and allowed values on the left; the wizard those rules generate, previewed on the right.
Trakr's guided builder on the Channel step: a Paid Social channel selected, source and medium auto-populated, with the saved-config library and live UTM preview beside it
The guided flow. Pick a channel and source and medium auto-populate to GA4-compliant values; the live preview builds the URL as you click.
Trakr's review step showing Ready to Generate with a validation check, next to the library and live preview panels
Validation before copy. The review step checks the URL against your channel definitions, so it lands where you expect instead of in Unassigned.
What we learned

Three decisions that made the launch boring, in the good way

1

Make the launch a test, not a mood. Waitlist mode and live mode are one copy state, and a regression test asserts that no waitlist or coming-soon wording survives the flip anywhere on the site. Going live meant making a test pass and merging. No 2 a.m. find-and-replace, no stragglers.

2

Row-level security from day one, hardened before launch. Every table is owner-scoped at the database layer, and the billing columns were locked down against client writes weeks before anyone could pay. Retrofitting isolation after launch is how SaaS horror stories start.

3

The free plan is the product, Pro is the team. Solo users get the full builder and validation for EUR 0 with no card, because a single analyst adopting governed URLs is how a team ends up wanting the shared workspace. The gate sits at collaboration, never at correctness.

FAQ

Questions we get about Trakr

What is Trakr?

A guided campaign URL builder for GA4 teams. You configure your naming syntax and channel definitions once; from then on every URL your team or agency builds follows the same structure, and each one is validated against GA4 channel definitions before you copy it. Live at app.trakr.studio since July 2026.

What does Trakr cost?

The Free plan is EUR 0 for solo use with no card required: the full guided builder, validation, and link history. Pro is EUR 29 a month (or EUR 290 a year) and adds the shared team workspace, shared configurations, and bulk URL generation.

What is Trakr built on?

A React single-page app on Netlify, with Supabase as the backend: Postgres with row-level security on every table, Supabase Auth with Google and Microsoft sign-in, and Deno edge functions for billing and email. Stripe handles payments, Resend sends the emails, and Slack alerts us when a webhook sees something odd.

Why build a URL builder at all?

Sixteen years of enterprise analytics work kept surfacing the same failure: campaigns landing in GA4's Unassigned channel because someone typed a UTM by hand. Trakr productizes the governance we kept rebuilding for clients: agreed syntax, allowed values, and validation before the URL ever ships.

Try Trakr on your next campaign

The free plan is live: full builder, full validation, no card. If your campaign reporting has an Unassigned problem, this is the cheapest fix you will find.

Related builds: Measr, our self-hosted analytics toolkit, came from the same habit of productizing client work. We also teach operators to build systems like this, hands-on. Balázs runs the build sessions at Agent-J+.