# How Traqio attributes an install

URL: https://traqio.app/docs/concepts/attribution
Last updated: 2026-10-22

The evidence behind every attributed install — the Play Install Referrer, SKAdNetwork, Apple Ads — the rules that refuse a claim, and what organic means.

**Install attribution** is deciding which ad, if any, caused an app install. Traqio attributes an install only on evidence it can show, and records which kind of evidence it was. Where there is none, the install is **organic** — not a guess.

## Android: the Play Install Referrer

The **Google Play Install Referrer** is a string Google Play hands to an app after install, through the Install Referrer API: whatever was in the `referrer` parameter of the Play Store URL the user came from. Traqio uses it to carry its click id through the store:

1. The user taps a Traqio tracking link (`https://<host>/c/<code>`). Traqio records a click with a fresh click id and the link's network, campaign, ad set and ad.
2. Traqio redirects to the app's Play Store page with `referrer=traq_click=<click id>` (plus the source and the campaign ids).
3. On first launch the SDK reads the referrer and sends it with the install. The server extracts the click id and finds the click — the match is exact.

The result is a **deterministic** install, stamped with the click's network and campaign hierarchy, provided the click is inside the app's [attribution window](https://traqio.app/docs/concepts/attribution-windows) (7 days by default). Only installs made by Google Play carry a referrer: an `adb` install, a sideloaded APK or a build from another store is organic.

## iOS: SKAdNetwork and Apple Ads

iOS has no install referrer, and Traqio does not read the IDFA by default, so a Traqio click cannot be carried through the App Store. iOS attribution comes from Apple's two channels instead:

| Source | What it is | Granularity |
| --- | --- | --- |
| SKAdNetwork | Apple sends a cryptographically signed postback per install to the ad network and — when your app declares Traqio's endpoint — to Traqio, with the campaign and a six-bit conversion value. | per campaign, delayed 24 h or more |
| Apple Ads | The SDK reads the AdServices attribution token; Traqio resolves it with Apple, which answers for its own ads. | per install |

SKAdNetwork installs are counted from *winning* postbacks of the first conversion window only — Apple sends up to three postbacks per install, and counting them all would triple iOS installs. Their revenue, modelled from the conversion value, is reported apart and never mixed into measured revenue or ROAS. Details in [iOS attribution](https://traqio.app/docs/concepts/ios-attribution).

## The kinds of attribution you will see

| Label | Evidence | Billed |
| --- | --- | --- |
| Deterministic | a Traqio click id in the Play Install Referrer, inside the attribution window | yes |
| SKAN | a winning SKAdNetwork postback, first conversion window | yes |
| Self-attributed | Apple Ads, through the AdServices token | yes |
| View-through | an impression of the same app from the same address, inside the view-through window — off unless you turn it on | yes |
| Probabilistic | no click id; a click on your link from the same hashed address, inside the probabilistic window, for a user who consented — off unless you turn it on | yes |
| Organic | no evidence, or a claim refused by a fraud rule | no |

## View-through attribution

A tracking link has a second URL, `/i/<code>`, that records an *impression* instead of a click. When an app turns on a view-through window, an install that matched no click can be attributed to an impression of the same app recorded from the same address inside that window. A view leaves no referrer, so this match rests on the hashed IP address alone — weaker evidence than a click, which is why it is off by default and always ranks below a click. See [Attribution windows](https://traqio.app/docs/concepts/attribution-windows#view-through).

## Probabilistic web-to-app matching

Attribution is deterministic by default. One case has no carrier for the click: a tap on your link in a browser, then an install on iOS. An app can turn on **probabilistic matching** in Settings for that case. An install that carries no click id is then matched to a click on your link from the same hashed IP address inside a short window (2 hours unless you choose another, 24 hours at most), and only when every such click credits the same ad. It runs only for users whose app reported consent with `Traqio.setConsent(true)` — on iOS, report it only after the user has also authorized App Tracking Transparency. It never overrides a click id, and every install it attributes is labelled **Probabilistic**. Apple's privacy guidance counts the network connection among the device signals it forbids for identification, and may reject apps whose SDKs use them: the console shows that risk before it can be turned on. Hashed IP addresses are deleted after 30 days.

## Reinstalls and reattribution

Before matching, Traqio asks whether the install is a new user. A device or user it already knows, active recently, is a **reinstall** and keeps the attribution it had. One that has been inactive longer than the app's inactivity period and clicked an ad since can be **reattributed** to that click. Recognising a returning user depends on the first-party ids described in [Identity](https://traqio.app/docs/concepts/identity).

## Claims Traqio refuses

Four rules can refuse an attribution. They are checked against data Traqio already holds, and a rule that fires takes the **attribution**, never the install: the install is still recorded — as organic, with the reason — so your install count keeps matching the store's, and a rule can only ever lower a bill.

| Reason | Fires when |
| --- | --- |
| click_injection | the matched click is younger than 10 seconds at install — the signature of malware that fakes a click while an install is in progress |
| duplicate_device | the same device already produced an attributed install of the app in the last 24 hours |
| referrer_malformed | an Android install claims a click id that no valid Play referrer carries |
| anonymous_ip | the click arrived with no usable client address |

Every refusal is counted and readable — in the console, and through the API's [rejections report](https://traqio.app/docs/api#endpoints). Traqio does not score traffic with a statistical model.

> **Ceilings on the public endpoints** The ingestion and click endpoints also have generous per-app and per-device rate ceilings, so a looping client or a leaked SDK key cannot run up an invoice. A refused request is answered with HTTP 429 and counted with the other refusals.

### Related

- [Tracking links](https://traqio.app/docs/concepts/tracking-links) — where the click id comes from.
- [Attribution windows](https://traqio.app/docs/concepts/attribution-windows) — how long a click can claim an install.

## Frequently asked questions

**What is deterministic attribution?**
Attribution backed by an exact identifier carried from the ad to the install — on Android, Traqio's click id inside the Google Play Install Referrer — as opposed to probabilistic attribution, which guesses a match from shared signals such as an IP address. Traqio's Android click attribution is deterministic.

**Why are some installs organic even though they came from an ad?**
An install is attributed only when there is evidence: a Traqio click id in the Play Install Referrer within the attribution window, a SKAdNetwork postback, or an Apple Ads token. An ad whose destination is not a Traqio tracking link, an install from outside Google Play, a click older than the window or an install refused by a fraud rule leaves no usable evidence, and the install is organic.

**Is an organic install billed?**
No. A conversion is one attributed install, nothing else; installs Traqio could not attribute to an ad are not billed, and the events you track are measured and reported but never billed.
