SEM hop tracker

Track the hop.
Keep the landing honest.

Clickerwave is the measurement URL you drop into the Google Ads Tracking template. Shoppers stay on the Final URL. You get a visible em_dest hop that every User-Agent follows, a 204 only when that hop is missing, and a live console.

https://clickerwave.com/click?em_dest={lpurl}

Console

302 hops

Successful

0

Last hop

example.org

When

2026-09-10 10:21:27

GET /click?em_dest=https%3A%2F%2Fshop.example%2Fpromo

→ 302 shop.example/promo

Logged to click_events · HTTPS hostname only

These counters count successful 302 hops only. Validation failures and 204 PINGs stay on Audit.

Google Ads Tracking template {lpurl} / {unescapedlpurl} Visible em_dest hop 204 No Content PING HTTPS hostname guard Empty 400 fail-closed Server-side 302/303 Audit ledger No cookies on /click Google Ads Tracking template {lpurl} / {unescapedlpurl} Visible em_dest hop 204 No Content PING HTTPS hostname guard Empty 400 fail-closed Server-side 302/303 Audit ledger No cookies on /click

Product

One edge URL. Two lanes.

Google Ads sends shoppers to the Final URL and loads Clickerwave in the background. A browser hitting /click follows the HTTPS hostname you encoded.

01

Visible next hop

Every click URL exposes em_dest. The server follows that value—never a backend-only landing map.

02

Follow em_dest first

A valid em_dest is followed with an empty 302 on every path—including Google-Ads-Compliance. 204 is only used when there is no followable hop.

03

Fail closed

http, IPs, and deeplinks get empty 400 after logging. We never 302 to this host.

04

Install in one field

Paste the template, encode the landing, copy the hop URL from the builder.

Tracking modes

The same /click. Three honest outcomes.

Signal Browser hop Google PING
Valid em_destEmpty 302 to that URLEmpty 302 to that URL
Missing / invalid hopEmpty 400204 No Content
Body / cookiesNoneNone
click_eventsWrittenNever written

Install

Copy the hop. Paste the field.

  1. 1

    Build the URL with your HTTPS landing, then paste it into Google Ads Tracking template—not the Final URL.

  2. 2

    Keep landings inside em_dest as HTTPS hostnames. Foreign params belong there too.

  3. 3

    Match a 302 on Audit against the template you actually ran. PINGs will not appear.

Open the URL builder https://clickerwave.com/click?em_dest={lpurl}
Sat
Sun
Mon
Tue
Wed
Thu
Fri

Successful 302 hops · last 7 days · 2026-09-10 10:21:27

Live product

Recent successful hops.

Latest valid 302 rows from click_events. Validation failures stay on Audit. Google-Ads-Compliance PINGs receive 204 and never appear here.

Open full console →
Time Status Reason Target
2026-09-10 10:21:27 valid redirected https://example.org/
2026-09-10 02:17:00 valid redirected https://example.org/
2026-09-10 02:16:59 valid redirected https://example.org/
2026-09-10 00:10:47 valid redirected https://example.org/
2026-09-09 18:20:35 valid redirected https://example.org/
2026-09-09 15:01:18 valid redirected https://example.org/
2026-09-09 01:24:51 valid redirected https://example.org/
2026-09-09 01:24:44 valid redirected https://example.org/

FAQ

Questions before you paste the template.

Google Ads parallel tracking: follow em_dest, then 204

Under Google Ads parallel tracking, shoppers go to the campaign Final URL. This measurement URL is loaded in the background. If that request carries a valid em_dest, the server follows it with an empty server-side 302—any User-Agent, including Google-Ads-Compliance. That is the published transparency rule.

A Google-Ads-Compliance request with no followable hop returns 204 No Content: empty body, no cookies, no click_events write. Humans with a missing or invalid hop receive empty HTTP 400. We never 302 those requests to this host.


// Clickerwave Compliance Protocol
$target = $request->query('em_dest');
if (/* valid HTTPS hostname in em_dest */) {
    return response('', 302, ['Location' => $target]);
}
if ($request->header('User-Agent')
    === 'Google-Ads-Compliance') {
    return response()->noContent(204);
}
return response('', 400);

Deployed logic matches this snippet. Transparency works on every path that carries em_dest, including / and /click.