View as Markdownllms.txt

Attribution

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.

  • Records the click with its click ID (fbclid, gclid, ttclid, oppref or twclid), 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.

AppRefer picks the URL path from the link's network when you create it. Copy the exact URL from the Links page.

PathUsed forWhat 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 AdsA 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 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.

Optional landingPageJSON
{
  "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 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.

Per-link store destinationsJSON
{
  "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 its referrer (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.

Meta: Website URL
https://apprefer.com/api/c/your_meta_link
Meta: URL parameters
fbclid={{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.

Google: Final URL
https://apprefer.com/g/your_google_link
Google: Final URL suffix
campaign_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.

TikTok: Destination URL
https://apprefer.com/api/c/your_tiktok_link
TikTok: custom parameters
campaign_id=__CAMPAIGN_ID__&campaign_name=__CAMPAIGN_NAME__&adgroup_id=__AID__&adgroup_name=__AID_NAME__&utm_id=__CAMPAIGN_ID__&utm_name=__CAMPAIGN_NAME__&ttclid=__CLICKID__
ChatGPT Ads: Destination URL
https://apprefer.com/o/your_openai_link

Macro 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

ParameterSourceDescription
fbclidMetaMeta click ID
gclidGoogle AdsGoogle click ID
ttclidTikTokTikTok click ID
opprefChatGPT AdsOpaque OpenAI click reference; only read on ChatGPT Ads links
twclidX AdsX click ID; only read on /x/ links
campaign_id / campaign_nameAllCampaign
adset_id / adgroup_idAllAd set or ad group ID
adset_name / adgroup_nameMeta, TikTokAd set or ad group name
ad_id / ad_nameMetaAd
keywordGoogleSearch keyword
utm_sourceAnySource name; sets the network when there is no click ID
utm_medium / utm_campaignAnyMedium and campaign (utm_campaign is used when campaign_name is missing)

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.

Terminal
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"
  }'

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.