Tracking links
A tracking link is the URL you put in an ad. It records the click, shows a short page and sends the person to the right store page, so the install can be matched back to the ad.
Direct Meta website links can include one public landing selector, such as ?for=music, in their saved HTTPS destination. The selector is a lowercase slug of up to 64 characters. Other destination query parameters and fragments are not accepted.
What a tracking link does
- Records the click with its click ID (
fbclid,gclid,ttclid,opprefortwclid), campaign parameters and the signals used for matching. - Works out the network from the click ID, then
utm_source, then the network set on the link. - Shows a landing page suited to the network (see below) and opens the App Store or Google Play.
- Carries the click to Android installs through the Play Install Referrer, so Android installs match deterministically.
Link types
AppRefer picks the URL path from the link's network when you create it. Copy the exact URL from the Links page.
| Path | Used for | What the visitor sees |
|---|---|---|
/api/c/{linkId} | Meta, TikTok and every other source (email, QR codes, influencers, bio links) | An app card that opens the store by itself |
/g/{linkId} | Google Ads | A crawlable app page with App Store and Google Play buttons |
/o/{linkId} | ChatGPT Ads (beta) | The same crawlable app page, recording a click only with a valid oppref |
/x/{linkId} | X Ads (website funnels only) | Passes the visitor on to your website with the click IDs |
The app card page
Links on /api/c/ show a small card with your app's icon, name and subtitle from the store and a real store button, then open the store automatically. The store details are cached on the link and refreshed in the background about once a week, so a click never waits on a store lookup.
- Instagram preloads. Instagram loads ad destinations in a hidden view (for example under the comments sheet) where a jump to the store is blocked. The card only opens the store once the page is actually visible, after Meta's Parameter Builder has loaded or 1.5 seconds have passed, and only once.
- Back works. The jump replaces the page in history, so pressing Back doesn't bounce the visitor to the store again.
- Only seen clicks are counted. The click is stored for matching straight away, but it is counted in the dashboard only when the page reports that it was shown. Hidden preloads and Meta prefetches that are never opened don't inflate your click numbers.
- Meta prefetches are de-duplicated. A prefetch from the same IP for the same link within 5 minutes reuses the first click, including its Play Install Referrer.
Link previews from crawlers (Facebook, X, LinkedIn, Slack, WhatsApp, search engines and similar bots) see the page but are never recorded as clicks. Links set to landingStyle: "legacy" keep the older plain "Redirecting…" page.
Google Ads landing page
Google Ads can reject uncertified click trackers in a final URL, so Google links use a real landing page at /g/{linkId}. It does not redirect on its own; the visitor taps the App Store or Google Play button that matches their device, and the click is recorded with the platform and store they were sent to.
The page fills itself from your public App Store and Google Play listings (name, description, screenshots, rating). Send a landingPage object when you create the link only if you want to override that content. Copy must be about the app, written for the person downloading it.
{
"headline": "Plan better workouts on your phone",
"subheadline": "Plan sessions, compare progress and stay consistent.",
"features": [
"Build workouts around your goals",
"See progress after every session",
"Install from the official app stores"
],
"imageUrls": [
"https://example.com/screenshot-1.png",
"https://example.com/screenshot-2.png"
],
"rating": "4.8 stars",
"proof": "Loved by 10k+ people",
"testimonial": "Makes my routine simple.",
"testimonialAuthor": "App Store review",
"faqs": [{ "question": "Is it free to try?", "answer": "Yes, with a free trial." }]
}Up to 3 screenshots and 2 FAQs are shown. Google Android App campaigns that send people straight to Google Play, without this page, are still attributed through the gclid in the Play Install Referrer (see Attribution).
ChatGPT Ads landing page
ChatGPT Ads links use /o/{linkId}, the same crawlable page as Google. OpenAI adds an opaque oppref to real ad clicks; a visit without a valid oppref (including OpenAI's review and search crawlers) sees the page but is not recorded. Never create or change oppref yourself.
ChatGPT Ads has no campaign URL macros, so set the campaign, ad group and ad IDs on the link itself (externalCampaignId, externalAdGroupId, externalAdId).
X Ads website links
X Ads links use /x/{linkId} and always send the visitor to your website, for purchases you then report as verified website receipts. The destination must be a clean HTTPS URL with no query string or fragment. A click is recorded only when X supplied a valid twclid and the browser did not send a Global Privacy Control opt-out (Sec-GPC: 1). The website receives ar_click_id, ar_link_id and twclid. Forwarding to X is off by default for each app; see X Ads.
Store destinations and custom product pages
By default a link opens the App Store and Google Play URLs in your app settings. A link can override each platform, for example to send an ad to an App Store custom product page or a Google Play custom store listing, and carry a short storeVariantKey for reporting.
{
"storeVariantKey": "creator_a",
"iosStoreUrl": "https://apps.apple.com/us/app/example/id1234567890?ppid=abc123",
"androidStoreUrl": "https://play.google.com/store/apps/details?id=com.example.app&listing=creator_a"
}AppRefer uses the link's URL for the visitor's platform, then an older single storeUrl on the link if it is a store URL for that platform, then the app's default store URL, then the link's fallback URL. iosStoreUrl must be an App Store URL and androidStoreUrl a Google Play URL. storeVariantKey takes up to 80 letters, numbers, dots, underscores, tildes or hyphens.
Android keeps both parameters
On Google Play, AppRefer adds itsreferrer (for install matching) and keeps your listing parameter, so the custom store listing still shows.Setting up each ad network
Ad platforms take the link and the tracking parameters in separate fields. Copy both from the Links page.
https://apprefer.com/api/c/your_meta_linkfbclid={{fbclid}}&campaign_id={{campaign.id}}&campaign_name={{campaign.name}}&adset_id={{adset.id}}&adset_name={{adset.name}}&ad_id={{ad.id}}&ad_name={{ad.name}}&utm_id={{campaign.id}}&utm_name={{campaign.name}}Meta also adds the real fbclid to each click. If a placeholder such as {{fbclid}} arrives unreplaced, AppRefer ignores it rather than sending a bad value to Meta.
https://apprefer.com/g/your_google_linkcampaign_id={campaignid}&campaign_name={campaignname}&adgroup_id={adgroupid}&keyword={keyword}&utm_id={campaignid}&utm_name={campaignname}Keep Google auto-tagging on; it adds the gclid.
https://apprefer.com/api/c/your_tiktok_linkcampaign_id=__CAMPAIGN_ID__&campaign_name=__CAMPAIGN_NAME__&adgroup_id=__AID__&adgroup_name=__AID_NAME__&utm_id=__CAMPAIGN_ID__&utm_name=__CAMPAIGN_NAME__&ttclid=__CLICKID__https://apprefer.com/o/your_openai_linkMacro syntax differs by network
Meta uses{{campaign.id}}, Google uses {campaignid} and TikTok uses __CAMPAIGN_ID__. The ad platform replaces them when the ad is served.Query parameters
| Parameter | Source | Description |
|---|---|---|
| fbclid | Meta | Meta click ID |
| gclid | Google Ads | Google click ID |
| ttclid | TikTok | TikTok click ID |
| oppref | ChatGPT Ads | Opaque OpenAI click reference; only read on ChatGPT Ads links |
| twclid | X Ads | X click ID; only read on /x/ links |
| campaign_id / campaign_name | All | Campaign |
| adset_id / adgroup_id | All | Ad set or ad group ID |
| adset_name / adgroup_name | Meta, TikTok | Ad set or ad group name |
| ad_id / ad_name | Meta | Ad |
| keyword | Search keyword | |
| utm_source | Any | Source name; sets the network when there is no click ID |
| utm_medium / utm_campaign | Any | Medium and campaign (utm_campaign is used when campaign_name is missing) |
Creating links
On the Links page, pick a link type (Meta Ads, Google Ads, TikTok Ads, ChatGPT Ads, Email, Instagram bio, QR code, SMS, referral, influencer, podcast or custom), or use Create default links to make Meta, Google and TikTok links in one go. From code, use POST /api/v1/apps/{appId}/links with an organisation API key that has links:write; see the API reference.
curl -X POST https://apprefer.com/api/v1/apps/APP_ID/links \
-H "Authorization: Bearer ak_live_..." \
-H "Content-Type: application/json" \
-d '{
"linkId": "meta_spring_ugc",
"name": "Meta spring UGC",
"network": "meta",
"iosStoreUrl": "https://apps.apple.com/us/app/example/id1234567890?ppid=abc123"
}'Link performance
The Links page shows clicks, installs, trials, purchases (new payers), revenue and install rate for every link over the date range you pick. It follows the Live/Sandbox and platform switches, and you can sort by any column. Revenue is net of refunds and is credited to the link of the install it belongs to.
Verified website purchases are not tied to a link, so web-funnel revenue appears on the Campaigns page instead. See the Dashboard guide for how each number is defined.