The three approaches compared

Client-sideProxy (first-party)Server-side
Where it firesBrowser or mobile app, via SDKBrowser → endpoint on your domain → the toolYour backend, after the action is confirmed
CompletenessLowest - blockers, ITP and network failures drop events silentlyHigh - requests look first-party, so most blocked events are recoveredHighest - nothing on the user's machine can stop it
Tamper-resistanceLow - the code runs on the user's machineLow - still originates client-sideHigh
Front-end contextFull - clicks, page, referrer, device, UI sequenceFull - same payload, different routeLimited - the server can't see UI state
Setup effortLowestMedium - infrastructure to run and maintainHighest - real engineering per event
Best forEngagement, UX behaviour, funnels through the interfaceRecovering blocked client eventsRevenue, sign-ups, anything business-critical

Every analytics setup has to answer one question for each event: where does it get sent from? The same “Purchase Completed” event can be fired from the user's browser, routed through a proxy on your own domain, or sent straight from your backend. The choice changes how much data you actually capture, how reliable it is, and how much it can be tampered with or blocked.

Client-side tracking

The event fires directly from the browser or mobile app, usually via an analytics SDK. It's the fastest to set up and captures rich front-end context: which button was clicked, page and referrer details, device, and the full sequence of UI interactions. The downside is reliability. Ad blockers, privacy browsers (Safari's ITP, Firefox), and network failures silently drop a meaningful share of events, and because the code runs on the user's machine it can be inspected or spoofed. Great for engagement and UX behaviour; risky for anything you need to be exact.

Server-side tracking

The event is sent from your own backend after an action is confirmed. Because it doesn't depend on the user's browser, it can't be blocked by extensions and is far harder to tamper with, which makes it the right home for revenue, sign-ups, and any business-critical or financial event. The trade-off is that the server often lacks front-end context (exact UI state, client-side attribution signals) and it takes more engineering effort to instrument. It's the source of truth, not the full picture.

Proxy (first-party) tracking

A proxy routes client-side events through an endpoint on your own domain before forwarding them to the analytics tool. You keep the richness of client-side data while recovering much of what ad blockers and tracking-prevention would otherwise drop, because the requests look first-party rather than third-party. It needs some infrastructure to run and maintain, but it's the practical way to make client-side data more complete without moving everything to the server.

How to combine them

For most products the answer isn't one method, it's a deliberate split. Use server-side for revenue, sign-ups, and anything that must be exact; use client-side for UI interactions, engagement, and the behavioural detail server events can't see; and add a first-party proxy to recover the client events that blockers would otherwise lose. Decide per event based on the outcome you need from it, not by picking a single approach for everything.

Which method should each event use?

EventFire it fromWhy
Purchase / payment completedServerMust be exact; must not be blockable or spoofable
Subscription started, renewed, cancelledServerBilling truth lives in your backend, not the browser
Sign-up / account createdServerDrives CAC and activation denominators
Page or screen viewedClient, via proxyNeeds front-end context; volume makes server instrumentation expensive
Button or CTA clickedClient, via proxyOnly the client knows what was on screen
Feature used in-appClient, via proxyBehavioural detail the server can't see
Form errors, drop-off within a flowClient, via proxyPure UI state
Email opened, link clickedServer, from your ESP webhookNot your front end at all
Client vs proxy vs server-side tracking - slide 1 of 13
Client vs proxy vs server-side tracking - slide 2 of 13
Client vs proxy vs server-side tracking - slide 3 of 13
Client vs proxy vs server-side tracking - slide 4 of 13
Client vs proxy vs server-side tracking - slide 5 of 13
Client vs proxy vs server-side tracking - slide 6 of 13
Client vs proxy vs server-side tracking - slide 7 of 13
Client vs proxy vs server-side tracking - slide 8 of 13
Client vs proxy vs server-side tracking - slide 9 of 13
Client vs proxy vs server-side tracking - slide 10 of 13
Client vs proxy vs server-side tracking - slide 11 of 13
Client vs proxy vs server-side tracking - slide 12 of 13
Client vs proxy vs server-side tracking - slide 13 of 13
Questions

Tracking questions

Is server-side tracking better than client-side?

Not better - different. Server-side is more reliable and harder to tamper with, so it is right for revenue and sign-ups. Client-side sees the interface, so it is right for behaviour. Most products need both.

Do I need a first-party proxy?

If a meaningful share of your client events are being dropped by ad blockers or Safari’s ITP, yes. It is the cheapest way to recover them without re-instrumenting everything server-side.

Does server-side tracking break attribution?

It can. Click IDs and campaign parameters arrive in the browser, so if you move an event server-side without passing that context through, attribution goes with it. Capture the attribution parameters client-side on landing, persist them, and attach them to the server-side event.

Which events should fire from the server?

Anything that must be exact or must not be blockable: purchases, subscription changes, sign-ups, trial starts. Anything that depends on what was on screen - clicks, feature use, form drop-off - belongs client-side.