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.
Click IDs it recognises
fbclid- Meta
gclid- Google Ads
gbraid- Google Ads
wbraid- Google Ads
msclkid- Microsoft Advertising
ttclid- TikTok
twclid- X
li_fat_idScCid- Snapchat
epikrdt_cidyclid- 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
Nothing to fix: no macros left as text, and a click identifier has a value.
- 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/
- Fragment (#)
- —
- Length
- 230 characters
Parameters
No parameters in this link.
| 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
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
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
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
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.