Skip to content
Browse documentation

Transparent links (/c)

The /c/{key}?url= link used in Google Ads tracking templates — link keys, url= decoding, allowlist, the only macros allowed, appended click ID, refusals and how status is recorded.

Last updated 4 min read

On this page

A transparent link redirects to exactly the URL in its url= parameter, in one 302, or refuses with an error page. It never substitutes another destination. This is the behaviour Google requires from certified click trackers, so /c/ links are what you put in Google Ads tracking templates. Setup in Google Ads: Google Ads setup.

URL
https://trackcrown.com/c/OFFERCODE-PARTNERCODE?gclid={gclid}&campaignid={campaignid}&force_transparent=true&url={lpurl}

The part after /c/ decides what the click is attributed to. It is resolved in this order:

KeyAttributed to
OFFERCODE-PARTNERCODEThat offer and partner (same workspace)
OFFERCODEThat offer, no partner
<Workspace ID>The workspace only (no offer, no partner)

A trailing slash is accepted. Any path also honours url=: /r/…, /click, /s/… with url= behave the same way.

Parameters#

ParameterRequiredNotes
urlYesThe next hop, normally Google's {lpurl}. Put it last.
force_transparentNoAccepted and ignored; place it immediately before url=. Never forwarded.
sub1…sub10, source_id, gclid, ValueTrack mappings…NoStored on the click (Sub IDs & parameters).

How url= is read#

Form of the valueExampleResult
Fully percent-encoded ({lpurl} not at the start)url=https%3A%2F%2Fshop.example.com%2Fp%3Fa%3D1Decoded → https://shop.example.com/p?a=1
Encoded twice or three times ({lpurl+2}, {lpurl+3})url=https%253A%252F%252F…Decoded until the scheme is literal (max. 3 times)
Literal scheme, escaped query (Google's partial escaping)url=https://shop.example.com/p%3Fa%3D1%26b%3D2→ https://shop.example.com/p?a=1&b=2
Literal ({unescapedlpurl})url=https://shop.example.com/p?a=1&b=2Used verbatim to the end of the query string, minus trailing force_transparent
  • The key url is matched case-insensitively. A + in an encoded value stays +.
  • Two url= parameters with different values are refused (duplicate_url) because parsers disagree on which wins.

Validation and allowlist#

The decoded target must be:

  • an absolute http:// or https:// URL of at most 4,096 characters;
  • free of spaces, control characters, backslashes and user:password@;
  • on a public DNS hostname — no IP addresses, localhost, .local, .internal, .home.arpa or single-label names;
  • on the allowlist: the workspace's Allowed destination domains ∪ the offer's Allowed transparent destinations ∪ the host of the offer's Destination URL ∪ the hosts of its landing pages (for a smart link: of every offer it references).

Rules: *.example.com (or .example.com) matches example.com and every subdomain; example.com matches example.com and www.example.com.

Google parallel tracking: https://google.com/asnc/… and https://www.google.com/asnc/… are always accepted, whatever the allowlist says, because Google substitutes {lpurl} with that endpoint in background requests.

Refusals#

A refused request gets an HTML error page — never a redirect — and is logged as a blocked click with the reason.

SituationHTTPReason
No url=400missing_url
Conflicting url= values403duplicate_url
Empty / invalid / too long / wrong scheme / credentials403empty, invalid, too_long, scheme, credentials
IP address or local host403ip_host, local_host, bad_host
Host not on the allowlist403not_allowed ("Destination not allowed for this tracking link")
Host flagged by Google Web Risk (when configured)403unsafe_target

Full list: Error codes.

What is added to the destination#

Nothing, except:

  1. Macros inside the url= value — only these are expanded (both {name} and encoded %7Bname%7D, values percent-encoded): {click_id}, {transaction_id}, {aff_id}, {offer_id}, {sub1}…{sub10}, {source_id}.
  2. The click ID parameter, only if Append the click ID to transparent redirects is on in Workspace settings: <Click ID parameter name>=<click id>.

Every other byte of the URL — including its own encoding and #fragment — is preserved.

URL
GET /c/OFFERCODE?url=https%3A%2F%2Fshop.example.com%2Fp%3Fa%3D1 HTTP/1.1

HTTP/1.1 302 Found
Location: https://shop.example.com/p?a=1&click_id=0192a6c3f1e04b7e9c2d8a1f3b5c7d9e

(The click_id part appears only with the append option on.)

Status is recorded, never enforced#

Offer status, partner approval, targeting, traffic controls and caps are evaluated only to label the click:

Label (status reason)Meaning
pausedOffer not active
not_approvedPartner not approved
targetingCountry/device/OS outside targeting
traffic_controlA traffic control would block it
cap_overClick cap reached (the click still counts)
workspace_inactiveWorkspace not active

Schedule, terms, extended targeting, forwarding, fail routes, landing pages, pre-landers and redirect mode never apply. No cookie is set.

Click IDs from the landing URL#

gclid, gbraid, wbraid, msclkid, fbclid and ttclid found in the query of the decoded url= are stored on the click (read only — the URL is not modified). The click mode is parallel for the asnc endpoint (or Google's gb=1 marker), sequential for other Google clicks. One gclid counts as one unique click per link within 30 minutes.

If the key no longer exists (renamed or deleted offer, partner or smart link) and url= is present, the tracker still redirects when the target is the asnc endpoint or passes the combined allowlists of the brand's active workspaces; the click is logged with reason unknown_link. Otherwise it shows the 404 page. Offers, partners and smart links with recent clicks are archived rather than deleted, so live ads keep working.

Methods#

GET, HEAD and POST (body ignored) return the identical redirect; other methods get 405.

Use Tracking → Google Ads → Transparency tester, or the Test with a real final URL field on the offer's Tracking tab, which checks the allowlist and builds a test link. See Transparency.

Something unclear or missing in this article?Tell us