Skip to content

Tracking link checker: find broken macros and click IDs

Paste a tracking link, an offer or landing URL with click data, or a postback. See every parameter decoded, which one is the click ID, and what will break attribution: macros left as text, missing click IDs, duplicates, encoding mistakes and parameters the server never receives.

Runs in your browser. The link you paste is never sent anywhere.
A tracking link, landing or offer URL, postback URL, or just the parameter string.
Try an example

Click IDs it recognises

fbclid
Meta
gclid
Google Ads
gbraid
Google Ads
wbraid
Google Ads
msclkid
Microsoft Advertising
ttclid
TikTok
twclid
X
li_fat_id
LinkedIn
ScCid
Snapchat
epik
Pinterest
rdt_cid
Reddit
yclid
Yandex Direct

Also read as tracker or network fields: sub1–sub10, subid, sub_id_1…, clickid, click_id, cid, aff_sub…, var1…, s1–s5. Keys starting with utm_ are labelled UTM.

Result

1 error

Findings

  1. Error

    Macro left as literal text

    The ad platform, tracker or network sent its template instead of a value. Usually the macro name is wrong for that platform, the placement doesn't support it, or the macro sits in a field where it isn't expanded.

    • sub3={{adset_name}}

Structure

Scheme
https
Host
lp.example.com
Path
/offer/
Length
230 characters

Parameters

Key Value (decoded) Type
utm_source facebook UTM
utm_medium paid UTM
campaign_id 120210001 Other
adset_id 120210101 Other
ad_id 120210111 Other
sub1 Facebook_Mobile_Feed Tracker sub / click
sub2 fb Tracker sub / click
sub3 {{adset_name}} Tracker sub / click macro not replaced
fbclid IwY2xjawF3kLpleHRuA2FlbQEwAAEdQ9mTzXaR Click ID · Meta

What each finding means and how to fix it

Errors break attribution outright. Warnings break it on some servers or some of the time. Info is context worth knowing before launch.

Finding What it means How to fix it
Error Macro left as literal text A platform, tracker or network sent its placeholder instead of a value, so every click carries the same string, like {{adset_name}} or __CID__. Check the macro name against that platform's list and the field it sits in, then re-test on a real click, not a preview.
Error No usable click identifier No platform click ID and no tracker sub or click parameter with a value. A postback has nothing to match the visit to. Pass your tracker's click ID into the network's sub or click field; let the ad platform append its own click ID.
Error Second ? in the query Only the first ? starts the query. After a second one, the next key is swallowed into the previous value. Join parameters with &. Encode any URL you put inside a parameter.
Error Raw spaces or line breaks Messengers, ad fields and servers cut or reject a link at the first raw space. Encode spaces as %20 and keep the template on one line.
Warning Parameters after # The fragment never leaves the browser, so the tracker's server doesn't receive those keys. Move parameters before the #. The fragment always goes last.
Warning No ? before the parameters Without a ?, key=value pairs become part of the path or host. Put ? before the first parameter when you paste a parameter string after a full URL.
Warning Repeated parameters One server reads the first copy, another the last, a third keeps both. Keep one copy. Check that the tracker template and the ad platform's URL parameters don't both add the key.
Warning Empty values The key arrives with nothing in it, usually a macro with no data at that step. Find the system that fills the key and confirm it has the value when the link is built.
Warning Encoded twice or broken encoding %25 means an already-encoded value was encoded again. A stray % or non-UTF-8 bytes can't be decoded. Encode once, at the step that inserts the value. Write a literal % as %25 and send text as UTF-8.
Warning http:// or non-ASCII text http sends click data unencrypted; Cyrillic or accented text gets mangled by some systems in the chain. Use https:// and ASCII values, or percent-encode text as UTF-8 yourself.
Warning Very long URL Past about 2,000 characters, older browsers, some proxies and ad-platform URL fields truncate links. Exact limits vary by system. Drop parameters you never report on.
Info Nested URL or literal + A redirect or offer URL inside a parameter is decoded and checked too. A + in a value reads as a space on most servers. Encode the nested URL once, as a whole value. Write a literal plus as %2B.

Why a link that opens can still lose attribution

A page that loads proves the domain and path work. It says nothing about the values. A literal {{adset_name}} still opens the landing; so does a link whose click ID sits after the # or arrives empty. The tracker logs a click either way.

The gap shows up days later, when the network's postback carries a value that matches no click, or no value at all. Attribution depends on one string surviving every hop unchanged: ad platform, tracker, offer, postback. So check the URL that was actually delivered at each hop, not the template you typed.

Where link checks usually go wrong

  1. 1

    Checking the template

    A template in Ads Manager always contains macros. Copy the URL from the landing page's address bar or the tracker's click log after a real click.

  2. 2

    Stopping at the first hop

    Every redirect can drop or rewrite the query. Check the landing URL, the outgoing offer link and the postback the network sends back.

  3. 3

    Using fbclid as your click ID

    Platform click IDs belong to the ad platform. The network needs your tracker's click ID in its sub or click field to send a postback you can match.

  4. 4

    Fixing one link by hand

    Editing a broken value in one URL hides the template that produced it. Fix the macro at its source and test again.

See what every click actually carried.

DarkCore records each click with its campaign fields, sub1–sub10 and platform click IDs, expands Track Link macros and attaches the network's postback to the same click.

Check my tracking setup