SKAN – SKAdNetwork, Apple's privacy-safe attribution for app installs from ads · AAK – AdAttributionKit, its successor with the same postback model · postback – the message Apple sends the ad network (and your MMP) about one install · conversion window – the period a postback covers, counted from first launch. Apple calls them days 0–2, 3–7 and 8–35; in hours that is 0–48, 48–168 and 168–840 · fine value – a number from 0 to 63 (6 bits), only in postback 1 · coarse value – low, medium or high; the only value in postbacks 2 and 3, and what small sources get in postback 1 · tier – the crowd-anonymity level Apple gives a source; it decides whether you get a fine value, a coarse one or nothing · non-install session – any app open after the first launch; the usual Low condition in postbacks 2 and 3 · lockWindow – closing postback 1 early so it is sent sooner · MMP – mobile measurement partner (AppsFlyer, Adjust and others) · SAN / SRN – self-attributing network, or self-reporting network in AppsFlyer's terms: claims installs through its own API (Meta, Google, TikTok) · AEM – Meta's Aggregated Event Measurement.
What is a SKAN conversion schema?
The mapping your MMP uses to turn what a user did after install into the values Apple sends back: a fine value from 0 to 63 (six bits) in postback 1, and a coarse value – low, medium or high – in postbacks 2 and 3 and for small sources. You set it once, in the MMP, for every network that buys iOS installs.
What are the SKAN 4 conversion windows?
Three, counted from the first launch, not from the install: days 0–2 (the first 48 hours), 3–7 and 8–35. Postback 1 arrives 24–48 hours after its window closes; postbacks 2 and 3 arrive 24–144 hours after theirs. Only postback 1 can carry a fine value, and only on crowd-anonymity tiers 2–3.
Why is there no revenue in postback 1 for a subscription app with a trial?
Because a trial has charged no one by 48 hours. Postback 1 codes the stage and the plan – a trial started on the monthly or the annual plan – and the money goes to the postback whose window holds the first charge: postback 2 for a 3–5-day trial started in the first 48 hours, postback 3 for a 7- or 14-day trial. A 1-month trial charges too close to day 35 for any postback to see it.
Should I lock postback 1 early?
Not at launch. A lock at 24 hours sends postback 1 about a day sooner and loses everything between 24 and 48 hours after first launch. It is worth testing later only when your own data shows almost all of the optimization event within 24 hours of first launch, a meaningful share of budget goes to ad networks that optimize on SKAN, and those networks agree. Meta optimizes on AEM and Google on its own model, so for them the speed of the postback matters little.
Does SKAN work without tracking consent?
Yes. Apps can call the SKAN APIs regardless of their tracking authorization status, so SKAN counts installs from ads whether users consented or not. It does not see organic installs, networks that don't use SKAN, or installs that are never opened.
SKAdNetwork or AdAttributionKit?
Both work, with the same postback model: three windows, the same delays, a fine value only in postback 1. On its SKAdNetwork page Apple writes: “Use AdAttributionKit for app ad campaigns on the App Store and alternative marketplaces.” The SKAdNetwork class itself is not deprecated, and a schema carries over as it is.
Is anything I type sent anywhere?
No. The schema is computed in your browser and nothing you enter leaves the page. The tool is not affiliated with Apple, AppsFlyer or Adjust.
If you buy mostly Meta and Google, SKAN isn't what you optimize on – they, and since 2025 TikTok, run on their own data. It's insurance you set up before you need it: ad networks without their own measurement officially have nothing else, clean SKAN data takes weeks to build up, and it's an independent cross-check on what the platforms report.
Honest limit: Google uses SKAN as one input to its iOS modeling and shows a separate SKAN report – how much weight it gets, Google doesn't say.
Skipping the schema doesn't switch SKAN off – installs still get reported, just with no value attached, so networks bidding on SKAN can only optimize for installs, not for trials or revenue. That's why the schema matters – and why you only want to design it once.
Changing the schema no longer pauses Meta ad sets, as it did in 2021–23. It still costs about six weeks of mixed data and a break in the series, so you design it once.
The old advice was "if you change the schema, everything stops for a few days". The conclusion still holds; the reason changed.
| Old reason (2021–23) | Today (2025–26) | |
|---|---|---|
| What happened when you changed the schema | Meta paused the affected iOS ad sets that ran on SKAN. There, SKAN was the only optimization signal. | No pause. Meta optimizes on AEM, which does not use the SKAN schema. TikTok can run without SKAN. Google and Apple never paused. |
| Where the cost is | Campaign downtime: lost money and volume. | Data. Postbacks from installs made under the old schema keep arriving for up to about 41 days (a 35-day window plus up to 144 hours of delay), and your MMP decodes them with the new schema. Networks that bid on SKAN relearn. Before/after comparison breaks. |
| Who it hurts most | Anyone buying iOS on Meta through SKAN campaigns. The pause was Meta's own; Google and Apple didn't pause. | Anyone buying through networks without their own measurement: games, ad networks. |
| So | Set the schema once and leave it. | The same. Design it once with spare bits, change it rarely and on purpose, and treat the next six weeks or so as a break in the series. |
Trials start in the first 48 hours; a 7-day trial first charges 6–9 days after first launch. Postback 1 covers the first 48 hours, postback 2 runs to 168 hours, postback 3 to day 35.
Windows count from the first launch.?Windows count from the first launch, not from the install. Postback 1 arrives 24–48 hours after its window closes; postbacks 2 and 3 arrive 24–144 hours after theirs.
| Value | Event | What it means |
|---|---|---|
| 32 | trial_ | started a trial on the annual plan? You said the annual plan brings more money per subscriber. One shared trial_started would make the network treat an annual trial and a monthly trial as equal, and it would bring both just as happily. This is the most expensive pair of bits in the schema. |
| 16 | trial_ | started a trial on the monthly plan? Its own bit, so a monthly trial isn't confused with an annual one. |
| 8 | paywall_ | reached the paywall? Mid-funnel diagnostics: separates people who saw the offer and passed from people who never got there. |
| 4 | onboarding_ | finished onboarding? The strongest non-money sign of intent in the first 48 hours. |
| 2 | onboarding_ | started onboarding? Separates people who opened and left from people who began. |
| 1 | signup_ | created an account? The cheapest event in the funnel. |
| Level | Condition | Value | What it means |
|---|---|---|---|
| Low | Session | Install | installed, nothing else? Something has to sit on Low, and 'installed and nothing more' is the one condition every install meets. |
| Medium | Event | trial_ | trial on the monthly plan? Coarse arrives exactly where volume is lowest. Keeping the plan split here means optimization isn't blind on the smallest sources. |
| High | Event | trial_ | trial on the annual plan? The same plan split as the fine value. paywall_view drops out of coarse on purpose: losing mid-funnel diagnostics is cheaper than losing the difference in value. |
A lock at 24 hours sends postback 1 about a day sooner, but everything between 24 and 48 hours after first launch is lost for it: trials and purchases on day 1, later funnel steps, sessions. It can pay off only for ad networks that optimize on SKAN (AppLovin, Unity, Moloco and similar), and only once your own data shows almost all trials within 24 hours of first launch. Meta optimizes on AEM, so for Meta alone the speed of the postback doesn't matter. Tick your channels further down to see whether a lock is worth testing. For reference, RevenueCat 2026: 78–90% of trials start on install day, another 5–12% on days 1–3 (see Setup, Source). Install day is a calendar day, not the 24 hours after first launch, so check this in your own data.
In the MMP: AppsFlyer Conversion Studio locks by time or when the high coarse value is reached. Adjust generally advises against lock windows and suggests agreeing with the network first.
| Level | Condition | Value | What it means |
|---|---|---|---|
| Low | Session | Non-install session | came back to the app after install? You can't map the absence of an event, only something that happened. A session after install is the floor that still says the user came back. |
| Medium | Event | core_ | used the main feature? The feature people subscribe for. Using it in the trial is the earliest predictor of conversion you control. |
| High | Event | core_ | reached the second key feature? Moving on to a second feature means the person explored the product, not just looked once. If your MMP allows a count condition, repeat use of the main feature is a good alternative: habit predicts conversion better than a single action. |
| Level | Condition | Value | What it means |
|---|---|---|---|
| Low | Session | Non-install session | came back, but no paid subscription? You can't map the absence of an event, only something that happened. A session after install is the floor that still says the user came back. |
| Medium | Event | trial_ | paid subscription on the monthly plan? The plan you said brings less sits on the middle level, so the two kinds of money stay apart. |
| High | Event | trial_ | paid subscription on the annual plan? This mirrors postback 1. If you optimize on annual trials, this is where you check that annual money followed. Measuring 'any conversion' here would leave nothing to check. |
Where a network optimizes on SKAN, optimize on postback 1: many signals, fast. Postbacks 2 and 3 are for checking, not for optimizing. When they diverge, that is a signal: postback 1 grows and postback 3 doesn't, so trials don't reach money; annual trials grow but trial_
Optional. Doesn't change your schema.?The schema follows your product, not the platform: one schema for every network. Your channels only settle one setting, the lockWindow advice for postback 1.
Tick the channels you buy on iOS and, if you like, type rough shares of your iOS budget.
Tick the channels you buy on iOS to see where SKAN sits for each of them.
It counts installs from ads whether users consented to tracking or not. Apple: apps "can call these APIs regardless of their tracking authorization status."
It does not see:
So "SKAN covers every install" is wrong. The accurate version: SKAN sees everyone who came from an ad, consented or not. It doesn't see organic installs or networks without SKAN.
| Postback | Window | Delay after the window | What arrives |
|---|---|---|---|
| 1 | days 0–2 (first 48 h) | 24–48 h | fine value (0–63) on tiers 2–3, otherwise coarse |
| 2 | days 3–7 (48–168 h) | 24–144 h | coarse only |
| 3 | days 8–35 (from 168 h) | 24–144 h | coarse only |
| Tier | Postback 1 | Postbacks 2–3 |
|---|---|---|
| 0 | 2-digit source identifier, no value | not sent |
| 1 | 2 digits + coarse | 2 digits + coarse |
| 2 | 2, 3 or 4 digits + fine | 2 digits + coarse |
| 3 | as tier 2 + source app ID (in-app ads) or source domain (web ads), optionally country code | 2 digits + coarse |
Apple does not publish tier thresholds in installs. The tier can't be configured and can change between periods. It depends on the crowd size of the placement, the advertised app, the country and the identifier itself.
Web ads: since iOS 16.1 a click-through ad in Safari itself (not in an app's built-in browser) can be attributed too, but only when a registered ad network serves it as an attributable web ad: a special App Store link with a one-time nonce and a signed response from the network's server. An ordinary web-to-app landing page doesn't qualify. The user has 30 days to install. Money taken on the web before the store never reaches SKAN. Attribution windows: 30 days from click to install, 24 hours for view-through, 60 days to first launch. With AdAttributionKit on iOS 18.4, the developer can set them: click 1–30 days, view 1–7 days, plus a cooldown of 0–720 hours.
| Channel | SAN / SRN? | How it sees iOS users who didn't consent | SKAN role |
|---|---|---|---|
| Meta | Yes | AEM, Meta's own aggregated protocol. | Secondary |
| Google Ads | Yes | Modeled conversions: IDFA of users who consented, on-device measurement, and SKAN as one input. | Input |
| TikTok | Yes, since 2023 | Data your MMP shares about all users: matched for users who consented, modeled for the rest. SKAN is a switch you can turn off. | Optional |
| Apple Ads | Own attribution (AdServices) | The AdServices token, which attributes without ATT. Apple Ads registered with AdAttributionKit in April 2025, starting with SKAN versions 1–3. | Own attribution |
| Ad networks AppLovin, Unity, Moloco, ironSource, Mintegral, Liftoff | No – MMP links | Only SKAN. They work through MMP links, so for users who said no to tracking there is nothing else. | Core |
| Web funnels web2web; web2app with payment on the web | – | Pixel and Conversions API, click IDs, matching by login. | Not in path |
It has been a SAN since 2023 (earlier it worked through MMP links). Its iOS campaigns now run on data the MMP shares about all users; SKAN is a switch in TikTok, and with it off the iOS campaign quota is unlimited (TikTok help, checked 30 Sep 2026).
AppLovin, Unity, Moloco, ironSource, Mintegral, Liftoff and similar networks work through MMP tracking links. A link carries a click ID and, if there is one, the IDFA. For users who consented, the MMP matches click and install. For users who didn't, the MMP has no identifier to match, and fingerprinting is against Apple's rules, so the install usually lands as organic in the MMP. For them the only official trace is the SKAN postback. The difference between SRN and non-SRN is not "SKAN or no SKAN", it is what covers users who said no: an SRN has its own protocols and modeling, a non-SRN has only SKAN.
For a deterministic match on a paid install, the IDFA has to be available in two apps: the one that showed the ad and the one being advertised. The user has to allow tracking in both. So deterministic data on paid installs covers fewer people than your app's own opt-in rate suggests. This is one more reason SKAN matters for networks that have no other signal.
| Era | What it was | SKAN | For buying |
|---|---|---|---|
| Before ATT (until iOS 14.5, April 2021) | IDFA by default for everyone who hadn't switched it off | not needed | Per-user deterministic attribution; revenue tied to campaign and creative |
| ATT without enforcement (2021–23) | ATT prompt; fingerprinting against the rules but not checked in practice. MMPs kept probabilistic matching | SKAN 2–3: one postback, 6 bits, a 24-hour timer restarted by each higher value | For many, SKAN was a formality |
| The closed door (2023/24 to now) | Privacy manifests and required-reason APIs, enforced from spring 2024; for users who said no, attribution moved to SKAN, platform modeling and aggregates. SRNs cover opted-out users with their own protocols and modeling | SKAN 4 (iOS 16.1): up to three postbacks, fine only in the first, coarse after, lockWindow instead of a timer. AdAttributionKit (iOS 17.4): same model | For non-SRN networks SKAN is the main signal, so games depend on it most. Subscription apps with web funnels can barely notice it |
This tool describes only the third era. Anything about a timer or a single postback belongs to history, not to the logic here.
Tags: B – checked source (vendor help or published report) · A – assumption. Platform facts checked 27–28 Sep 2026. Run the built-in self-test.
Not affiliated with Apple, AppsFlyer or Adjust. Nothing you enter leaves this page. Other tools: Unit Economics Estimator · LTV Calculator.