Free tool
Affiliate link & SubID builder
Most affiliate links are built by hand, and the two mistakes that follow are invisible: joining a parameter with & onto a URL that has no ?, and picking a placement label you cannot aggregate six months later. This builds the URL correctly for 10 networks and platforms — it knows each one's parameter name, how many slots it has and where it truncates — and it enforces a placement convention that can actually answer which placement converted. Runs entirely in your browser.
Two different placeholders appear on this page, and they mean different things:YOURID is a made-up value in the example above, while•••••• further down is a real affiliate ID of mine with the value masked out. Nothing you type here leaves your browser.
Press Build the link.
This validates the URL, not the click. It checks that the string is well-formed and inside the limits recorded for that network. It cannot tell you the link resolves, that your affiliate ID is still active, or that the program credited you — none of which can be established without a server request, and this page makes none. Send one real test click and read the dashboard; that is the only proof.
Affiliate SubID parameters by network
The parameter name, how many slots you get, where it truncates, and whether the value ever reaches the advertiser's landing page. Every row says how it was checked and when — 2 read on the network's own documentation, 4 taken first-hand from links running on this site, 6 seen in a single independent write-up, and 1 left deliberately incomplete. Only 6 of 13 publish a character limit anywhere we could find it.
Read the “what it is” column before you append anything. A parameter that carries your identity is not a placement slot. Rewardful’svia and FirstPromoter’s fpr say who you are; appending your placement to them sends the same key twice, which at best is ignored and at worst breaks the link. 4 of these 13 rows give you no placement slot at all — that is the case the cloak layer exists for, and no other builder tells you which rows they are.
| Network | Parameter | What it is | SubID slots | Limit | Reaches landing page | Checked |
|---|---|---|---|---|---|---|
| impact.comdocs ↗ | subId1, subId2, subId3 | SubID | 3 | 255 chars | No | Vendor docs |
| Awindocs ↗ | clickref, clickref2, clickref3, clickref4, clickref5, clickref6 | SubID | 6 | 50 chars | No | Vendor docs |
| ShareASale | afftrack | SubID | 1 | 255 chars | Not documented | Secondary |
| CJ Affiliate | sid | SubID | 1 | Not documented | Not documented | Secondary |
| Rakuten Advertising (LinkShare) | u1 | SubID | 1 | 72 chars | Not documented | Secondary |
| Tradedoubler | epi, epi2 | SubID | 2 | 64 chars | Not documented | Secondary |
| Partnerize (Performance Horizon) | pubref | SubID | 1 | 100 chars | Not documented | Secondary |
| Amazon Associates | No SubID available | — | None | Not documented | Not documented | Secondary |
| PartnerStack | Not recorded | — | Not documented | Not documented | Not documented | Unverified |
| FirstPromoter | fpr, fp_ref | Identity | None | Not documented | Yes | First-hand |
| Rewardful | via | Identity | None | Not documented | Yes | First-hand |
| In-house programs (query-shaped) | kaid, aff_id, id, source | Identity | None | Not documented | Yes | First-hand |
| In-house programs (path-shaped) | Not recorded | — | Not documented | Not documented | Yes | First-hand |
What each row is based on, and what bites you — 13 notes
- impact.com
Vendor docschecked 2026-09-04
Parameter names, slot count, 255-character limit and the alphanumeric rule read on Impact’s own partner help page. SharedId behaviour from the same page.
The gotcha: SharedId is a fourth, separate slot and behaves differently: SubIds are visible only to you, SharedId is visible to you AND the brand. Use SharedId when you want the advertiser to be able to act on the value, and a SubId when you do not. Impact links are also path-shaped (semrush.sjv.io/•••••• — the id masked, see the note on why) with no query string at all, so your first parameter needs "?" and not "&" — the most common way an Impact link gets broken by hand.
Sources disagree: Impact’s own partner docs give 255 characters for SubId1–3. The most-cited third-party table gives 64/64/32. We publish Impact’s figure because it is the primary source, and flag the disagreement rather than hiding it — if you are anywhere near either limit, test before you rely on it.
- Awin
Vendor docschecked 2026-09-04
The six clickref slots and the non-public status of clickref2–6 read directly on Awin’s developer docs. The 50-character alphanumeric limit is from Awin’s own Click References guide, which was not re-read at source in this pass — treat the limit as slightly softer than the rest of the row.
The gotcha: Only the first clickref is public. Awin’s developer documentation states plainly that clickref2–clickref6 (and pref2–pref6) are non-public parameters that cannot be transmitted to the advertiser’s landing page — they stay inside Awin’s reporting. So if your plan was to read clickref3 in your own analytics on the destination, it will never arrive. Put anything you need on the landing page in clickref itself.
- ShareASale
Secondarychecked 2026-09-04
Parameter name, single slot and 255-character limit from one independent SubID reference. Not confirmed on ShareASale’s own documentation in this pass.
The gotcha: One slot only, so everything you want to know has to be encoded into a single string — which is exactly why a fixed, parseable convention beats ad-hoc labels. ShareASale now sits under Awin, but the parameter has not changed to clickref: it is still afftrack.
- CJ Affiliate
Secondarychecked 2026-09-04
Parameter name "sid" and the single slot from one independent reference. Character limit not documented in any source found; left null rather than guessed.
The gotcha: One slot, and the character limit is not published anywhere we could find — which is a reason to keep values short by convention rather than discovering the cap from a report full of truncated strings.
- Rakuten Advertising (LinkShare)
Secondarychecked 2026-09-04
Parameter "u1" and the 72-character limit from one independent reference. Charset not documented; not confirmed at source.
The gotcha: 72 characters is an unusual and easily-hit cap — a three-part value with a long post slug will breach it before you notice. This is the network that most rewards short slot names.
- Tradedoubler
Secondarychecked 2026-09-04
Two epi slots at 64 characters from one independent reference. Not confirmed at source.
- Partnerize (Performance Horizon)
Secondarychecked 2026-09-04
Parameter "pubref" and the 100-character limit from one independent reference. Not confirmed at source.
- Amazon Associates
Secondarychecked 2026-09-04
ascsubtag’s invitation-only status and the Tracking ID alternative from independent write-ups and community threads. Not confirmed in Amazon’s own associate documentation in this pass.
The gotcha: Amazon has no SubID available to ordinary associates. The ascsubtag parameter exists, but access is by invitation, granted to large associates and country-specific — so the guides telling you to "just add ascsubtag" are describing something most accounts cannot use. The mechanism you actually have is multiple Tracking IDs: create one per site or per placement and read them in the Associates reports. That is coarser than a SubID and there is a practical ceiling on how many you will keep straight.
- PartnerStack
Unverifiedchecked 2026-09-04
PartnerStack’s own support article returned 403 to an unauthenticated fetch, so the exact parameter name, slot count and limit are NOT recorded here. What is recorded — that Sub IDs are appended externally and appear as numbered columns in reporting — comes from the article summary and a glossary page. Deliberately left incomplete rather than filled in with a plausible guess.
The gotcha: Sub IDs have to be appended to a PartnerStack link externally — the dashboard does not build them for you — and they then surface as numbered Sub ID columns in the Commissions and Customer performance reports. So the naming convention is entirely yours to enforce, which is the case where a fixed scheme matters most.
- FirstPromoter
First-handchecked 2026-09-04
Both parameter names taken from affiliate links currently live on this site (src/data/tools.ts). The single-slot behaviour is from running them; the character limit has never been tested here and is left null.
The gotcha: The same platform ships under two different parameter names depending on how the vendor configured it — this site runs live links using BOTH fpr (LLM Pulse, Morningscore) and fp_ref (Writesonic). You cannot assume the parameter from the platform; read it off the link the program actually gave you. FirstPromoter also supports direct-URL tracking with no parameter at all, in which case there is nothing in the URL to append to and per-placement attribution has to happen on your side of the click.
- Rewardful
First-handchecked 2026-09-04
Parameter taken from live links on this site (Rankscale, Otterly). Limit and charset never tested here; left null.
The gotcha: via carries the affiliate identity itself, not a SubID — there is no second slot for placement data. Anything you want to know about which placement converted has to be tracked on your own side of the click, before the redirect, which is precisely the job the cloak layer does.
- In-house programs (query-shaped)
First-handchecked 2026-09-04
All four parameter names taken from affiliate destinations currently live on this site (src/data/affiliates.ts). Slot counts and limits are program-specific and not generalisable, so they are left null.
The gotcha: Programs running their own tracking invent their own parameter names and there is no convention at all — this site has live links using kaid (Kinsta), id (Cloudways) and an offer_id/aff_id/source triple (Hostinger, a HasOffers-style stack). In that last one, source is effectively the SubID slot even though nothing calls it that. When a program is in-house, the only reliable move is to send one test click and read what came through in the dashboard.
- In-house programs (path-shaped)
First-handchecked 2026-09-04
Shape taken from three affiliate destinations currently live on this site (Kit, SiteGround, Semrush via Impact’s sjv.io short domain).
The gotcha: The affiliate id sits in the PATH, not a query string — partners.kit.com/<token>, siteground.com/go/<name>, semrush.sjv.io/<token>. There is no "?" in the URL, so the first parameter you append must use "?" and not "&". Getting this backwards is the single most common way a hand-built affiliate link breaks, and it fails silently: the link still works, the click still counts, and the attribution value is simply absent from every report.
Not in the table yet: ClickBank, Awin (ShareASale migration specifics), FlexOffers, Skimlinks, AvantLink, eBay Partner Network, MaxBounty, Refersion, Tapfiliate. Published as an open queue rather than quietly omitted — a reference that tells you where it stops is worth more than one that sounds complete.
How to structure affiliate link tracking
The two mistakes, both silent
One: the join character. A parameter appended to a URL that already has a query string needs &. Appended to one that has none, it needs?. Get it backwards and the link still works, the click still counts, the sale still credits — and the attribution value is simply absent from every report. There is no error to notice. Path-shaped links are where this bites hardest, because they look like they must have a query string somewhere: partners.kit.com/••••••, siteground.com/go/•••••• and Impact's semrush.sjv.io/•••••• all have none.
Two: the placement label. Whatever you type is what you have forever. Placement data cannot be reconstructed later — if two links to the same program on one post shared a label, the difference between them is gone, permanently.
Why page-slot-program, in that order
The point of attribution is answering which placement converts, and the common two-part schemes cannot. page-program collapses a sidebar card and an inline mention on the same post into one bucket. page-slot loses which program earned it. The three-part form answers both, and sorts sensibly: everything from one page groups together, and every sidebar across the site aggregates.
Keep the slot names from a fixed vocabulary, or the aggregation you built the scheme for never happens — sidebar, side-card and rightrailare three numbers you cannot add up. The seven below are the whole list:
intro— Above or inside the opening section, before the first subhead.table— Inside a comparison table or pricing grid.sidebar— A sidebar card or sticky rail unit.verdict— Inside a verdict, pros-and-cons or top-pick box.final— The closing call to action at the end of the page.inline— A plain in-body mention in the middle of the prose.quiz— A quiz, finder or calculator result.
Short names are not a style preference, they are a budget. The tightest documented cap in the table above is 50 characters (Awin), with Rakuten at 72 — and a long post slug plus a verbose slot name breaches both before you notice. The builder warns as you approach whichever limit applies to the network you picked.
The two-layer model, using this site as the example
Every affiliate link on this site points at /go/<program>?pos=<placement>rather than at the vendor. That is two layers doing two different jobs, and it is worth separating them:
- The cloak layer —
/go/— owns the link the reader sees and clicks. It is a stable, branded URL on your own domain, which means changing a destination is one edit rather than a hunt through two hundred posts. It isDisallowed in robots.txt, kept out of the sitemap, and carriesrel="sponsored nofollow noopener". - The attribution layer —
?pos=— is yours, not the network's. It records placement on your side of the click, which is the only thing that works when the program gives you nothing to work with. Rewardful'sviacarries affiliate identity and has no second slot; FirstPromoter's direct-URL mode has no parameter at all. In both cases the network cannot tell you which placement converted, and the cloak layer can.
When the click forwards, ?pos has to merge onto a destination that may already carry a query — appended with &, never producing a second?. That is nine lines of code, it is the exact thing this page warns about, and on this site it is a single shared function (mergeQuery in src/lib/goRedirect.ts) used by both the redirect and its build-time test, so the two cannot drift:
/go/llmpulse?pos=best-geo-tools-sidebar-llmpulse
↓ mergeQuery — destination already has "?", so join with "&"
https://llmpulse.ai?fpr=••••••&pos=best-geo-tools-sidebar-llmpulse
/go/kit?pos=kit-vs-mailchimp-verdict-kit
↓ path-shaped destination, no "?" at all — first param uses "?"
https://partners.kit.com/••••••?pos=kit-vs-mailchimp-verdict-kitWhy the IDs above are masked
Those are real slugs, real destination hosts and real parameter names — the mechanism is exactly what runs here. The ID values are replaced with •••••• on purpose. A working affiliate ID published in a tutorial can be substituted into someone else's links or used in ways that breach a program's terms, and the account that gets terminated is yours. Most guides publish theirs without thinking about it. Don't — mask yours too, and keep a build check that fails if one ever reaches a public page, which is what this site does.
Honest limits
- Half the table is not vendor-confirmed. 2 of 13 rows were read on the network's own documentation. 6 come from a single independent write-up and 1 is deliberately incomplete — PartnerStack's support article returns 403 to an unauthenticated fetch, so its parameter name is not recorded rather than guessed. The labels in the last column are there so you can weigh each row rather than trust the table uniformly.
- Impact's own docs and the most-cited secondary table disagree about the SubId character limit — 255 versus 64/64/32. Published as a conflict rather than resolved by picking the more convenient number.
- It cannot check that a link works. No network requests are made, by design. Validation is on the string only.
- Migrating an existing scheme costs you your own history. If you have been using a different convention, renaming old values orphans the click data already sitting behind them in your dashboards — the reports do not follow a rename. The honest move is to adopt the new convention going forward and accept a discontinuity, rather than lose the past to tidy up. That is what happened here: this site's own
?posvalues are a mix of shapes —landing-page-vs-website-kitis page-program,backlinks-ctais page-slot — because they were written before the convention was settled. They are staying as they are.
Frequently asked questions
What is a SubID in affiliate marketing?
A SubID is a value you append to your affiliate link that the network stores against the click and reports back to you when it converts. It is how you find out which page, which placement or which campaign actually earned a commission, rather than seeing one undifferentiated total. Every major network supports one, but they all call it something different — Impact uses subId1 to subId3, Awin uses clickref, ShareASale uses afftrack, CJ uses sid and Rakuten uses u1 — and Amazon Associates does not offer one to ordinary associates at all.
How do I add a SubID to an affiliate link?
Append the network’s parameter to the link the program gave you, using "&" if the URL already contains a "?" and "?" if it does not. That single decision is where most hand-built links break, because the failure is silent: the link still works and the sale still credits, but the attribution value never arrives in the report. Path-shaped links like partners.kit.com/token or Impact’s sjv.io links have no query string at all, so their first parameter always needs "?".
What should I put in the SubID value?
A fixed three-part convention: page, slot, program. Two-part schemes cannot answer the question attribution exists for — page-and-program collapses two links to the same program on one post into one bucket, and page-and-slot loses which program earned the sale. Keep slot names from a short fixed vocabulary (intro, table, sidebar, verdict, final, inline, quiz) so they aggregate across your whole site, and keep the whole value short: Awin truncates at 50 characters and Rakuten at 72.
Does Amazon Associates support SubIDs?
Not for most accounts. The ascsubtag parameter exists but access is by invitation, granted to large associates and country-specific, so the many guides telling you to simply add ascsubtag are describing something the average account cannot use. What you do have is multiple Tracking IDs: create one per site or per placement group and read them in the Associates reports. It is coarser than a SubID and there is a practical limit to how many you will keep straight.
Should I cloak affiliate links, and does it hurt SEO?
Cloaking through a redirect on your own domain is standard practice and does not hurt SEO when done properly: disallow the redirect path in robots.txt, keep it out of your sitemap, and mark the outbound links rel="sponsored nofollow noopener". The real argument for it is maintenance and attribution rather than appearance — a stable branded URL means changing a destination is one edit instead of a hunt through every post, and it gives you a place to record which placement was clicked even when the program offers no SubID slot at all.
Can this tool check whether my affiliate link actually works?
No, and that limit is deliberate. Confirming a link resolves requires a request to the destination from a server, and this page makes no network calls of any kind — everything happens in your browser. It validates the URL string: that it is well-formed, that the parameter is joined correctly, and that the value fits the character limit recorded for that network. The only real proof a link credits you is one test click read back in the program dashboard.
Why are the affiliate IDs in the examples masked?
Because publishing a working affiliate ID in a tutorial invites substitution and misuse, and a program terminates the account whose ID was misused — yours. The examples on this page use real slugs, real destination hosts and real parameter names so the mechanism is genuinely what runs on this site, with only the ID values replaced. It is advice almost no guide gives, largely because most of them publish their own IDs without noticing.