01
Visible next hop
Every click URL exposes em_dest. The server follows that value—never a backend-only landing map.
SEM hop tracker
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
GET /click?em_dest=https%3A%2F%2Fshop.example%2Fpromo
User-Agent: Google-Ads-Compliance
→ 302 shop.example/promo
Parameter is followed · no cookie · no click_events write
GET /click · no valid em_dest
→ 204 No Content
These counters count successful 302 hops only. Validation failures and 204 PINGs stay on Audit.
Product
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
Every click URL exposes em_dest. The server follows that value—never a backend-only landing map.
02
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
http, IPs, and deeplinks get empty 400 after logging. We never 302 to this host.
04
Paste the template, encode the landing, copy the hop URL from the builder.
Tracking modes
| Signal | Browser hop | Google PING |
|---|---|---|
| Valid em_dest | Empty 302 to that URL | Empty 302 to that URL |
| Missing / invalid hop | Empty 400 | 204 No Content |
| Body / cookies | None | None |
| click_events | Written | Never written |
Install
Build the URL with your HTTPS landing, then paste it into Google Ads Tracking template—not the Final URL.
Keep landings inside em_dest as HTTPS hostnames. Foreign params belong there too.
Match a 302 on Audit against the template you actually ran. PINGs will not appear.
https://clickerwave.com/click?em_dest={lpurl}
Successful 302 hops · last 7 days · 2026-09-10 10:21:27
Live product
Latest valid 302 rows from click_events.
Validation failures stay on Audit. Google-Ads-Compliance PINGs receive 204 and never appear here.
| 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
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.