cd /blog
#Analytics#GA4#Marketing#Dashboards#Growth

Full Marketing Analytics Stack for Under $50/Month

//5 min read//Mehdi

Most small businesses are flying blind. They have Google Analytics installed, they check the sessions number once a week, and they call it "data-driven."

Most agencies have the opposite problem: they're paying $2,000/month for tools they use 10% of.

There's a middle ground. Here's what it looks like, what it costs, and exactly how to build it.

The Stack

ToolPurposeCost
GA4Web events + audiencesFree
Google Search ConsoleOrganic search dataFree
Microsoft ClarityHeatmaps + session recordingsFree
SupabaseCustom event storageFree (up to 500MB)
Looker StudioDashboardFree
Google Tag ManagerTag managementFree

Total: $0/month for most small businesses, with Supabase Pro at $25/month if you're storing a serious volume of events.

The money-saving insight: you don't need Hotjar Pro, Mixpanel, or Segment to answer the three questions that actually matter:

  1. Where are leads coming from?
  2. Where are they dropping off?
  3. What does a converting session look like vs a non-converting one?

Setting It Up

Step 1: GA4 with server-side conversion events

Browser-based GA4 tracking misses roughly 20-40% of conversions in 2026 due to ad blockers and ITP (Intelligent Tracking Prevention) in Safari.

Fix this with a server-side event for form submissions:

// app/api/lead/route.ts
import { track } from "@/lib/analytics"; // wrapper around GA4 Measurement Protocol

export async function POST(req: Request) {
  const data = await req.json();

  // Insert lead to DB
  await supabase.from("leads").insert(data);

  // Fire server-side conversion event
  await track({
    client_id: data.ga_client_id, // passed from browser
    name: "generate_lead",
    params: {
      source: data.utm_source,
      medium: data.utm_medium,
      campaign: data.utm_campaign,
      value: 1,
      currency: "AED",
    },
  });

  return Response.json({ success: true });
}

This fires a generate_lead event directly from your server to GA4's Measurement Protocol, bypassing the browser entirely. It won't get blocked.

Step 2: Capture GA4 client ID in your form

The server needs the GA4 client_id to attribute the conversion correctly:

// Get GA4 client ID from browser
function getGa4ClientId(): Promise<string> {
  return new Promise((resolve) => {
    gtag("get", "G-XXXXXXXXXX", "client_id", resolve);
  });
}

// Add to form submission
const clientId = await getGa4ClientId();
formData.ga_client_id = clientId;

Step 3: Microsoft Clarity for behaviour data

Install Clarity's script (one line of code, or via GTM) and you immediately get:

  • Session recordings for every visitor
  • Heatmaps by page
  • Rage clicks and dead clicks flagged automatically
  • "Smart Events" that detect frustration patterns

It's free, GDPR-compliant, and honestly better than Hotjar's free tier.

For each session with a conversion, Clarity lets you tag it and replay exactly what that user did. This is how you find out what your converting users have in common.

Step 4: Custom Supabase events table

For anything that GA4 can't capture cleanly — CRM stage changes, email opens, WhatsApp replies — I push custom events to a Supabase table:

create table custom_events (
  id uuid default gen_random_uuid() primary key,
  event_name text not null,
  properties jsonb,
  session_id text,
  created_at timestamptz default now()
);

This becomes a queryable event log you fully own. No sampling, no 90-day retention limits, no $300/month bill.

You can see this exact events table used in a live lead routing system in Real-Time Lead Routing CRM with Next.js & Supabase.

Step 5: Looker Studio dashboard

Connect Looker Studio to:

  • GA4 (official connector)
  • Search Console (official connector)
  • Supabase (via the PostgreSQL connector or a simple API endpoint)

Build one dashboard with four sections:

  1. Traffic — sessions, source/medium breakdown, top landing pages
  2. Conversions — goal completions, conversion rate by source, cost per lead (if you import ad spend)
  3. Behaviour — top pages by engagement, scroll depth, bounce rate
  4. SEO — clicks, impressions, average position, CTR from Search Console

Schedule it to email to your client every Monday morning. They will think you're a genius.

The One Metric That Changes Decisions

Everything above is infrastructure. But the single metric I watch most closely for any lead-gen business is:

Cost per qualified lead by source

Not total leads. Not traffic. Qualified leads — ones that turn into conversations — segmented by where they came from.

A Facebook lead at AED 50 that converts at 2% is more expensive than a Google lead at AED 150 that converts at 12%.

Most clients have never seen this number calculated. When you show it to them, it instantly clarifies where to put budget.

What This Stack Can't Do

To be honest: if you're running a complex SaaS product with multiple pricing tiers, user roles, and a 90-day sales cycle, you'll outgrow this. You'll want Segment, Amplitude, or PostHog.

But for a service business, agency, or property developer doing under $5M/year in revenue? This stack answers every question you'll actually ask.


If you're using this stack to measure paid ad performance, the full landing page and UTM setup that feeds it is in The Landing Page That Fixed Our Google Ads ROI.

Need a proper analytics setup built for your business? Let's talk.