SKAdNetwork 4 for subscription apps: what your ad dashboards can and can't see

How SKAdNetwork 4's windows, coarse values and privacy tiers blur trial payments and hide renewals, and what to measure from store revenue instead.

Key takeaways

  • Without ATT permission, ad networks can't tie an iOS install to later purchases, so they rely on Apple's SKAdNetwork, which reports installs anonymously.
  • SKAdNetwork 4 sends up to three postbacks, for days 0 to 2, 3 to 7 and 8 to 35, each at least a day late, and only the first can carry a detailed value.
  • A 7-day trial's first payment lands in a later window as a coarse value at best, and Meta's Ads Manager leaves those postbacks out.
  • Renewals after day 35 never reach an ad network through SKAdNetwork, but Apple Ads, through AdServices, lets you credit a download's later payments to its campaign.
  • Design the schema around trial starts and early payments, then judge spend on store revenue: the payers your ads add, valued at what they pay in a year.

Why ATT moved iOS installs into SKAdNetwork

Since iOS 14.5, an app needs a person's permission, through App Tracking Transparency (ATT), to track them or read their device's advertising identifier, and Apple counts linking your app's data with other companies' data for ad measurement as tracking (Apple). Without permission, the identifier is all zeros (Apple).

That ended the old method, where an ad network matched the device that saw an ad with the device that installed and paid. For everyone who declines, or is never asked, iOS offers Apple's SKAdNetwork instead. When someone who saw or tapped an ad installs and opens the app, their device later sends the ad network a postback signed by Apple, with the winning campaign's code but no user or device, whatever the person chose in the ATT prompt (Apple).

Meta also measures iOS campaigns with its own Aggregated Event Measurement (Meta), covered in our Ads Manager vs RevenueCat guide.

Three conversion windows, fine and coarse values

SKAdNetwork 4 gives each attributed install up to three postbacks, one per conversion window: days 0 to 2, 3 to 7 and 8 to 35 after the first launch (Apple). In each window your app sets a conversion value, and when the window ends, the device sends the last one set.

Since iOS 16.1, your app can set two kinds of value, and you or your ad network decide what each means (Apple):

  • A fine value is a number from 0 to 63. Only the first postback can carry one.
  • A coarse value is low, medium or high. It is all the second and third postbacks ever carry, and it replaces the fine value in the first postback when the privacy tier is too low.

Postback delays and crowd anonymity tiers

Every postback arrives late on purpose: Apple adds a random 24 to 48 hours after the first window closes, and 24 to 144 hours after the second and third (Apple). Counted from the first launch:

When the postbacks arrive1st postback = day 2 + 24 to 48 hours = day 3 or 4 2nd postback = day 7 + 24 to 144 hours = day 8 to 13 3rd postback = day 35 + 24 to 144 hours = day 36 to 41

Meta dates SKAdNetwork results by the day it receives them, not the day they happened (Meta), so a Monday install shows up under Thursday or Friday.

How much a postback says depends on crowd anonymity. Apple gives each install a postback data tier from 0 to 3, by the size of the crowd sharing its details: the app or site showing the ad, your app, the country and the campaign code (Apple).

What each tier reveals
TierFirst postbackSecond and third
3, largest crowdsFine value, campaign code of up to 4 digits, the app or site the ad ran in, sometimes the countryCoarse value, 2-digit code
2Fine value, campaign code of up to 4 digitsCoarse value, 2-digit code
1Coarse value, 2-digit codeCoarse value, 2-digit code
0, smallest2-digit code onlyNone

Apple's documentation gives no crowd sizes, but the fewer installs share a campaign, country and placement, the less you learn, so a small budget spread thin gets few fine values.

Free trials: the payment lands in a later window

Take a fictional app with a 7-day trial. Someone opens it on day 0 and starts the trial minutes later. The App Store charges them when the trial ends, about seven days later, right where the second window ends and the third begins, so the payment can reach the ad network only as a coarse value, never the price.

It can also be missed. The App Store charges whether or not your app is open, but only your app can update the value, during that window (Apple). So the payment usually counts only if the person opens the app after being charged. A 14-day or one-month trial puts the first payment in the third window.

Then each network decides what to show. Meta's Ads Manager includes only first postbacks with a fine value, or coarse ones its SDK can map, and reports second and third postbacks only as coarse values in its Ads Insights API (Meta). TikTok's Ads Manager breaks results down by postback, so the later windows are visible there (TikTok).

So for a trial app, SKAdNetwork's strongest signal is the trial start. The payment arrives later, vaguer, or not at all. Our guide to trial length shows what that means for 3-day, 7-day and no-trial plans.

After day 35, renewals are never seen

The third window closes 35 days after the first launch, and no postback covers anything later (Apple). A monthly plan without a trial pays again around day 30, still in the third window, as a coarse value at best. Through SKAdNetwork, nothing after day 35 reaches the ad network, including every annual renewal. One fictional subscriber on a monthly plan with a 7-day trial, in a campaign measured with SKAdNetwork:

One fictional subscriber, three sources
EventDaySKAdNetworkAds ManagerStore revenue
Installs, starts the trial0First postback, fine or coarseFine value, or coarse if Meta's SDK maps itYes
First payment7Second or third postback, coarse, if the app records itNoYes
Second payment37NoNoYes
Each later payment67+NoNoYes

The stores see every row, but not which ad caused it.

How to design a conversion value schema

A schema is your table of what each value means. Your app sets one value, whichever network won the install, so every network reads the same schema. On Meta you set it in Events Manager or import it from your MMP (Meta). For a subscription app:

  1. Spend the fine value on the first two days. It is your only detailed signal, so use it for what predicts a payer: trial started, which plan, a purchase and its price band, onboarding progress.
  2. Give the coarse values the same order. Low tiers get only a coarse value, so low, medium and high should tell the same story in one word.
  3. Use the second window for the trial's outcome. StoreKit tells your app whether a trial is still set to renew, so the value can step up to medium, then to high once paid.
  4. Use the third window for money: not paying, paying monthly or paying annually.
  5. Only raise values, and leave locks off. A lock ends a window early so its postback comes sooner (Apple), but Meta advises against both locks and lowering values (Meta), and TikTok says wide use of locks may cause data gaps (TikTok).
Coarse values for a fictional app with a 7-day trial
WindowLowMediumHigh
Days 0 to 2Opened the appStarted a monthly trialStarted an annual trial, or paid
Days 3 to 7Opened the appTrial still set to renewPaid
Days 8 to 35Opened, not payingPaying monthlyPaying annually

Change the schema rarely: postbacks sent under an old one mean something else.

AdAttributionKit, Apple's newer framework

Apple's SKAdNetwork documentation now tells developers to use AdAttributionKit for app ad campaigns (Apple). Available from iOS 17.4, it builds on SKAdNetwork and adds re-engagement: from iOS 18, an ad someone taps to come back to your app can get the credit (Apple). It also covers alternative app marketplaces (Apple).

For a subscription app, little changes: the windows, values, delays and tiers are the same (Apple), so trial payments and renewals stay just as hidden. One ad wins each install across both frameworks, and values set through SKAdNetwork are mirrored into AdAttributionKit (Apple).

The exception: Apple's own ads

Apple Ads, called Apple Search Ads until April 2025 (Apple), has a more direct route. Through the AdServices framework, your app gets a token when it opens and, within 24 hours, exchanges it with Apple for that download's campaign, ad group, keyword, country and placement (Apple).

The record comes once per download, with no conversion windows, so you can keep it with the customer and credit every later payment, renewals included, to its campaign. RevenueCat does this when your app sends it the token: you can filter its charts by Apple Ads campaign or ad group and follow those customers for months (RevenueCat).

Apple says the record identifies no user or device and isn't tracking as ATT defines it, and calls it particularly valuable for smaller developers, who may get little back from AdAttributionKit because of crowd anonymity. Two limits: ad groups that target by age or gender get no attribution, and since AdServices knows only Apple's ads, it can claim an install another network also claims (Apple Ads).

What to measure from store revenue instead

Store revenue has the opposite problem: it sees everything except the ad. App Store Connect's analytics count trial starts, trials converted to full price and renewals, by territory and by cohort (Apple), and RevenueCat's charts filter by country and, with AdServices data, by Apple Ads campaign (RevenueCat). Measure four things:

  1. Daily new trials and payers by country, next to each network's daily spend by country, on one clock.
  2. The lift. New payers above the level you reach without ads are what the ads added. Our guide to measuring what your app ads really add shows how.
  3. Trial-to-paid rate by start week. If new campaigns bring trials that don't convert, it drops a trial length later.
  4. First-year value per payer, from your own cohorts after the store's fee, to value the added payers against spend. Our break-even ROAS guide covers the fees.

Use SKAdNetwork to rank campaigns inside a network, and store revenue to decide whether the spend pays back.

How INTARC does this

INTARC measures subscription apps from store revenue, not from postbacks. It reads App Store Connect, Google Play or RevenueCat, and your ad accounts, with read-only keys and no SDK. It counts the paying customers each campaign adds on the days and in the countries it spends, values them at what they actually paid, and forecasts whether the spend will pay back within a year, with a range. Every forecast it makes on its own studio's apps is written down in advance and scored in public at /proof. You can look around the demo or create an account to run it on your own apps.

Frequently asked questions

Does SKAdNetwork 4 report free trial conversions?

Partly. A 7-day trial's first payment comes around day 7, where the second window ends, so it can arrive only as a coarse value, and only if your app records it in time. Meta's Ads Manager leaves those postbacks out.

Can SKAdNetwork see subscription renewals?

Not after day 35, when the third window closes. A monthly plan's second payment can land in the third window as a coarse value, but later payments and annual renewals never reach an ad network through SKAdNetwork or AdAttributionKit.

Do I need ATT permission to use SKAdNetwork or AdAttributionKit?

No. Apple says apps can call both whatever the person chose in the ATT prompt. Permission is needed only to track people across other companies' apps and websites, or to read the advertising identifier.

Should I move from SKAdNetwork to AdAttributionKit?

Apple now recommends AdAttributionKit for app ad campaigns, so ask each ad network which one it signs with. The windows, values and tiers are the same, so what you see of trials and renewals does not change.

Why can I tie renewals to Apple Ads campaigns but not to other networks?

Because AdServices gives your app a record for each download it attributes, with the campaign, ad group and keyword, and no conversion windows. Keep it with the customer, as RevenueCat can, and every later payment can be credited to that campaign.

Attribution frameworks and ad platforms' reporting change often. We checked every linked source on November 13, 2026. Examples use fictional apps and numbers.