Deeplinkly

Glossary/iOS platform and privacy

Conversion Value

Definition

A conversion value is a 6-bit integer between 0 and 63 that an iOS app sets after install to describe post-install behaviour, and which the operating system reports to the ad network in an attribution postback.

Six bits is the entire budget. Everything you want to know about a user acquired from an ad — did they register, did they pay, how much — has to be encoded into one number from 0 to 63, decided within the first conversion window, and it may still be downgraded to low, medium or high before it is sent. Designing that encoding is the single highest-leverage decision in iOS measurement, and it is not reversible without losing comparability across cohorts.

The two kinds of value, and when each is sent

Fine and coarse conversion values compared.
FineCoarse
Range0–63 (6 bits)low, medium, high
Windows it can appear inWindow 1 only (days 0–2)All three windows
RequiresCrowd anonymity tier 3Tier 1 or above
Typical useRevenue bucket or funnel stepValue band for long-window signals

You set both in the same call, and the OS decides which one survives. This is why a schema must be designed as a pair: the fine value is your detailed answer and the coarse value is the answer you can still live with when the cohort is small.

Setting both values
import StoreKit

// SKAdNetwork 4.0
SKAdNetwork.updatePostbackConversionValue(
    12,
    coarseValue: .medium,
    lockWindow: false
) { error in
    if let error { print("CV update failed: \(error)") }
}

// AdAttributionKit, same schema, different call
try await Postback.updateConversionValue(
    fineConversionValue: 12,
    coarseConversionValue: .medium,
    lockPostback: false
)

A lower value never overwrites a higher one

Apple only accepts an update if the fine value is greater than the current one, or if it locks the window. Send 20 for a purchase and then 2 for a session start and the 2 is discarded — which is correct for a monotonic funnel and a silent data loss for any schema where the numbers are unordered categories.

Three encoding schemas that actually fit

The schemas below are the ones that survive contact with the constraints above. Pick one; do not blend them, because a blended range cannot be read as a single ordering.

Revenue bucket schema — for apps monetising in the first 48 hours.
ValueFirst-48h revenueCoarse
0$0.00low
1–5$0.01 – $0.99low
6–15$1.00 – $4.99medium
16–30$5.00 – $19.99medium
31–50$20.00 – $99.99high
51–63$100.00+high
Funnel schema — for apps whose value signal is behavioural, not monetary.
ValueFurthest step reachedCoarse
0Install only, no sessionlow
5Completed onboardinglow
10Registered an accountmedium
20Completed the core action oncemedium
30Completed it three or more timeshigh
40Started a trialhigh
50Subscribedhigh

The third option is a mixed-bit schema: split the six bits into fields, for example two bits of engagement tier and four bits of revenue bucket. It carries two dimensions at once, and it costs you the monotonic ordering that makes Apple's greater-than rule safe — so it only works if you can compute the final value in one call, at the end of the window, with lockWindow: true.

A mixed-bit encode, computed once and locked
// bits 4-5: engagement tier (0-3)   bits 0-3: revenue bucket (0-15)
let value = (engagementTier << 4) | revenueBucket   // 0...63

SKAdNetwork.updatePostbackConversionValue(
    value,
    coarseValue: coarse,
    lockWindow: true       // no further updates; do this once
) { _ in }

// Decoding, server side:
// let tier   = value >> 4
// let bucket = value & 0b1111

Designing one without wasting the bits

  1. Decide what decision the number has to support. If it is bid optimisation, the value must correlate with revenue; if it is creative testing, a funnel step is enough.
  2. Check that the signal is observable within 48 hours of install. Anything later cannot reach the fine value at all, and belongs in the coarse value for windows 2 and 3.
  3. Reserve 0 for "installed, did nothing", so that a genuine zero is distinguishable from an absent value.
  4. Keep the mapping monotonic — higher always means more valuable — unless you lock the window in a single call.
  5. Map every fine value onto a coarse value up front. If you cannot, the schema fails on the majority of campaigns, which sit below tier 3.
  6. Version the schema and record which version each cohort used. Changing the mapping mid-flight without a version makes two cohorts numerically comparable and semantically different.
  7. Publish the mapping to every ad network before launch. They optimise on the number; if their interpretation differs from yours, their bidding is optimising for something else.

The most common wasted schema

Using values 1–63 as unordered event IDs. Apple's greater-than rule means the highest-numbered event that happens to fire first wins, later events are dropped, and the postback reports an arbitrary event rather than the most valuable one. If your values are categories rather than a ranking, you need the lock-once approach instead.

Both frameworks read the same schema, so this work is not SKAN-specific: the encoding you design here is what AdAttributionKit sends too.

SKAN conversion value builder

Our builder turns your events and revenue bands into a concrete 0–63 mapping with the coarse fallback filled in, flags non-monotonic schemas that Apple's update rule would silently drop, and exports the table your ad networks need.

Open the skan conversion value builder

Frequently asked questions

What is a conversion value in SKAdNetwork?
It is a 6-bit integer from 0 to 63 that an app sets after an ad-driven install to describe what the user did, and which iOS then reports to the ad network in an attribution postback. Because the payload is only six bits and is finalised within the first conversion window, the number is an encoding of post-install behaviour rather than a raw event or revenue figure.
What is the difference between fine and coarse conversion values?
The fine value is the full 0 to 63 integer and is only sent in the first postback, and only when the install cohort reaches the highest crowd anonymity tier. The coarse value is one of low, medium or high, can be sent in all three conversion windows, and requires a much smaller cohort, so it is what most campaigns actually receive.
Why did my conversion value not update?
Apple only accepts an update when the new fine value is higher than the value already recorded for the window, or when the call locks the window. A lower or equal value is silently discarded. If your schema treats the numbers as unordered event identifiers rather than a ranking, this rule will drop most of your updates and report whichever high number fired first.
How should I design a conversion value schema?
Choose a single dimension the number represents — revenue buckets or funnel steps — keep the mapping monotonic so higher always means more valuable, reserve zero for installs with no activity, and define a coarse low, medium or high equivalent for every fine value. Confirm the signal is measurable within 48 hours of install, then share the mapping with every ad network before launch.
Does AdAttributionKit use the same conversion values?
Yes. AdAttributionKit carries the same 6-bit fine value and the same low, medium and high coarse values, subject to the same crowd anonymity thresholds, so one schema serves both frameworks. The only difference is the API call used to set it: updatePostbackConversionValue on SKAdNetwork versus updateConversionValue on AdAttributionKit's Postback type.

Related terms

  • SKAdNetworkSKAdNetwork is Apple's StoreKit framework that attributes app installs to advertising campaigns without exposing a device identifier, by having the operating system send a delayed, aggregated postback to the ad network that won the install.
  • Crowd AnonymityCrowd anonymity is Apple's privacy mechanism that decides how much campaign and conversion detail an attribution postback may contain, based on whether the install cohort is large enough that the report cannot identify an individual.
  • SKAN PostbackA SKAN postback is a signed JSON report that iOS sends from the device to an ad network's server after an advertised app is installed, containing the campaign identifier and any conversion value the install's privacy tier permits.
  • AdAttributionKitAdAttributionKit is Apple's ad attribution framework, introduced in iOS 17.4, that reports privacy-preserving install and re-engagement postbacks for advertised apps installed from the App Store or an alternative app marketplace.