Skip to main content
Back to Blog
AnalyticsJune 2026

GA4 setup for indie developers and side projects

You would rather ship features than click through GA4 admin. Here is a developer-friendly GA4 + GTM setup that survives refactors and answers "did the launch work?" in one query.

Get analytics insights without the guesswork

ClimbPast connects to GA4 and Search Console so you can ask questions in plain English.

Start free trial

Indie developers treat analytics like tests: important, easy to skip, painful when missing. GA4’s default pageview stream is not enough once you ship auth, billing, and feature flags. You need a small event contract — signup_completed, trial_started, feature_activated — and a way to verify events after each deploy without opening four browser tabs. This is the setup /for/solo-developers use before they hire growth.

Start with an event contract in the repo

List every event name, when it fires, and required parameters in TRACKING.md or AGENTS.md. When you rename a button component, grep for the event name before merging. Most broken GA4 setups are refactors that dropped a gtag call, not misconfigured admin settings.

Use GTM only if you need marketer access

Solo devs can fire events from application code with gtag or the GA4 measurement protocol. GTM helps when marketers add pixels without PRs. Either way, test in Preview mode or GA4 DebugView after deploy — see /guides/how-to-set-up-ga4-event-tracking for the GTM path.

Verify tracking in CI or post-deploy checks

Add a smoke test that loads staging and asserts key dataLayer pushes or network collect requests. ClimbPast /features/tracking-health scans production URLs for missing events when you do not want to maintain Playwright scripts yourself.

Ask product questions in plain English

After launch week, you need "signups by landing page" not a custom Exploration. Conversational analytics on top of GA4 — /conversational-analytics — keeps you in the editor instead of the GA4 UI. Pair with /features/slack-alerts when signup_completed drops after a deploy.