ICM (Integrated Conversion Management), ODM (On Device Measurement), Fine & Coarse Values — plus full media partner integration intelligence and Flutter implementation guide.
Conversion Studio schema maps events to 6-bit CV values with configurable priority.
↓
3
Smart CV Management
Optimised monotone-increasing updates within Apple's constraints across all three windows.
↓
4
Postback Ingestion
SKAN postbacks received, parsed, and enriched with modelled data where CV is null.
↓
5
Analytics + Reporting
Single-source-of-truth dashboard: SKAN, modelled, and probabilistic data unified.
❌ What SKAN Does NOT Send
User ID or Device ID (IDFA)
Exact install or conversion timestamp
IP address or geolocation
User demographics
Exact revenue amounts
✅ What SKAN DOES Send
Fine conversion value (0–63) — Window 1
Coarse value (low/mid/high) — all windows
Campaign ID (1–100)
Source app ID (above privacy threshold)
Source domain (web-to-app, SKAN 4.0)
AppsFlyer SKAN Advantages
PredictiveLTV Modelling
ML-estimated lifetime value from early behaviour signals
UnifiedSingle Dashboard
SKAN + probabilistic + deterministic data in one view
SmartCV Optimisation
AI-powered Conversion Studio schema recommendations
ICM — Integrated Conversion Management
AppsFlyer's statistical methodology that fills attribution gaps from ATT opt-out traffic — using aggregated signals, probabilistic matching, and ML to model conversions that SKAN alone cannot capture.
What Is ICM and Why Does It Exist?
With iOS 14.5+, a large proportion of iOS traffic operates with no IDFA and limited SKAN signal. Integrated Conversion Management estimates attribution for this "dark traffic" using available aggregated signals — without compromising Apple's privacy framework.
Deep SKAN integration via Google's own SKAd postback ingestion. ICM supplements Google's proprietary NCS (Network Conversion Signals) modelling to fill gaps in opt-out traffic.
Direct SKAN PostbacktROAS OptimisationNCS Modelling
📘
Meta (Facebook/Instagram)
AEM · CAPI · Advantage+
Complex
Uses Aggregated Event Measurement (AEM) alongside SKAN. Meta's Conversions API (CAPI) allows server-side event sharing to supplement SKAN's limited signal.
Direction
Data Shared
AF → Meta
Up to 8 prioritised events (AEM), aggregated conversion values, SKAN postbacks
Meta → AF
Modelled conversions (VTA + CTA), campaign cost data
Constraint
8-event max (AEM), 7-day click / 1-day view attribution window
AEM (8 Events)88% Null CV RiskCAPI Integration
🍎
Apple Search Ads
Native · Search · Browse · Today
Best Quality
Highest-fidelity SKAN integration due to Apple's native relationship. ASA receives direct SKAN postbacks from Apple, with AppsFlyer reconciling data for unified reporting.
Direction
Data Shared
Apple → ASA
Direct SKAN postback (campaign ID, ad group ID, keyword ID, creative set)
ASA → AF
Granular campaign hierarchy, Search Match vs Exact, Creative Set performance
Null CV Rate
~0.01% — industry lowest via Apple native integration
Amazon Attribution tags supplement SKAN postbacks. DSP operates via separate tracking. ICM fills gaps where Amazon's direct SKAN integration is less mature.
Newer SKAN integration — Reddit primarily serves upper-funnel awareness campaigns. CAPI integration is less mature; ICM plays a significant role in filling measurement gaps.
AppsFlyer's proprietary attribution methodology that infers the complete attribution picture from a single device's available signals — without cross-device tracking, IDFA, or user-level data.
What Is ODM?
ODM is designed for the post-ATT world where IDFA is unavailable. Rather than linking multiple devices or users, it focuses entirely on what can be inferred from a single device's interaction at the moment of install.
Fully device-level (no cross-user linking)
Privacy-safe — no PII required
Probabilistic, not deterministic
Complements SKAN, does not replace it
What Signals Does ODM Use?
Device Fingerprint
IP address, device model, OS version, screen resolution, language, carrier
Temporal Signals
Install timestamp, click timestamp, time decay weighting
Cohort Pattern Matching
Comparison against AppsFlyer's aggregate cohort signals from opted-in traffic
How ODM Works — End to End
📱
Install Event
User installs app. No IDFA consent. Device signals captured.
→
🧮
Signal Processing
Probabilistic engine matches device signals against known ad interaction patterns.
→
🏆
Attribution Output
Modelled attribution credit assigned. Surfaces in dashboard as "probabilistic."
How ODM Improves SKAN Measurement
🕳️
1. Fills Null CV Gaps
When SKAN returns a null conversion value (privacy threshold not met), ODM provides a modelled attribution signal so campaigns still receive measurable performance data.
⏱️
2. Extends Attribution Window
SKAN only covers install-level signal within defined windows. ODM extends attribution modelling to post-install events — providing LTV signal beyond Window 3 (day 35).
✅
3. Cross-Validates SKAN Data
ODM probabilistic data validates whether SKAN postback volumes are consistent with expected campaign performance — flagging anomalies in SKAN reporting.
📈
4. Enables Incrementality Testing
ODM provides the baseline model needed to run incrementality tests — measuring true campaign lift against organic baseline, which pure SKAN data cannot do alone.
💰
5. Improves ROAS Accuracy
By recovering attribution for ~40% of ATT opt-out traffic, ODM significantly improves Return on Ad Spend calculations — preventing systematic under-reporting of paid performance.
🔮
6. Feeds LTV Prediction
ODM modelled conversions feed AppsFlyer's LTV prediction models — allowing pLTV to be calculated even for users acquired through dark traffic.
ODM vs SKAN — Complementary Not Competing
ODM and SKAN serve different parts of the iOS attribution picture. Use both together for complete coverage.
Dimension
SKAN
ODM (On Device Measurement)
Attribution type
Deterministic (Apple-validated)
Probabilistic (modelled)
Data source
Apple-signed postback
Device signal matching
User identity
None (aggregate only)
None (device-level only)
Coverage
ATT opt-in + privacy threshold met
ATT opt-out traffic
Post-install events
CV update only (windows 1–3)
Extended modelled events
Privacy compliance
Apple-mandated
AppsFlyer privacy-safe
Ideal use
Primary attribution signal
Gap-filling and validation
Fine vs Coarse Conversion Values
SKAN 4.0 introduced a two-tier conversion value system. Fine values give granular 6-bit precision in Window 1; Coarse values provide a low/medium/high fallback across all three windows.
64Fine values (0–63, 6-bit)
3Coarse values (low/mid/high)
W1 OnlyFine values available
W1–W3Coarse values available
The Three Conversion Windows
Window 1
Days 0–2
Early post-install behaviour. Highest signal quality.
Whenever threshold met; fallback when fine is withheld
AF mapping
low = CV 0–20 · medium = CV 21–42 · high = CV 43–63
API enum
SKAdNetwork.CoarseConversionValue
Privacy Threshold — Why It Matters
Apple's crowd anonymity system withholds granular signals if a campaign-source combination has too few installs. The threshold is dynamic and based on Apple's privacy model.
🔴
Threshold Not Met
Apple sends null for both fine and coarse. No CV signal. High null CV rate in dashboard.
🟡
Coarse Threshold Met
Apple sends coarse only (low/medium/high). Fine value withheld. Partial signal.
🟢
Fine Threshold Met
Apple sends both fine (0–63) and coarse. Full signal available. Low null CV rate.
Fine Conversion Value Grid (0–63)
Hover any cell to see its value. Colour bands indicate user value tier.
0 — Install only
1–15 — Low value
16–31 — Mid value
32–47 — High value
48–63 — Premium
AppsFlyer: Fine → Coarse Mapping
Coarse Bucket
Fine CV Range
Typical User Behaviour
Window Availability
low
CV 0–20
Install only, minimal engagement, no purchase
W1 (fallback), W2, W3
medium
CV 21–42
Active engagement, registration, add-to-cart
W1 (fallback), W2, W3
high
CV 43–63
Purchase, subscription, high-value action
W1 (fallback), W2, W3
Reading the 6-Bit Fine Value
Each fine CV is a 6-bit binary number. Each bit represents a distinct user action or revenue band.
Fine CV Bit Schema Example
Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
Checkout AddCart SignUp MobileRev HBBRev ─── Revenue Band (2-bit)
└─► 00=$0 01=$1-50 10=$51-100 11=$100+
Example: User signs up + spends $75 in mobile revenue
Bit 5=0 Bit 4=0 Bit 3=1 Bit 2=1 Bit 1=1 Bit 0=0
Binary: 001110 → Decimal CV = 14
Coarse mapping: "low" (CV 14 < 21)
Flutter / Dart Implementation
Complete implementation handling all three scenarios: consent granted, consent denied, and runtime consent changes.
Set measurement window activity per window (W1, W2, W3)
Validate in sandbox mode
Deploy to production — allow 72h for schema propagation
Example 6-Bit Schema
Bits 0–1
Revenue Bands
$0 / $1–50 / $51–100 / $100+
Bit 2
HBB Revenue
Yes / No
Bit 3
Mobile Revenue
Yes / No
Bit 4
Sign Up
Completed / Not
Bit 5
Checkout
Initiated / Not
Campaign ID Constraints by Ad Network
SKAN allows Campaign IDs 1–100, but each network has its own constraints and best practices.
🔍
Google Ads
100 IDs
Structure: Flexible mapping by campaign type
Types: Search, Display, YouTube, App
Best practice: Group by campaign objective
📘
Meta (Facebook)
100 IDs
Structure: 3-digit hierarchical mapping
Mapping: Campaign (1st) · Ad Set (2nd) · Ad (3rd)
Best practice: 10 campaigns × 10 ad sets
🍎
Apple Search Ads
100 IDs
Structure: Campaign → Ad Group → Keyword
Advantage: Native SKAN integration
Best practice: Mirror ASA campaign structure
🎵
TikTok
100 IDs
Structure: Campaign-level mapping
Limitation: One ID per campaign
Best practice: Reserve IDs by objective type
👻
Snapchat
63 IDs
Structure: Campaign-based
Limitation: Lower than full SKAN range
Best practice: Focus on top campaigns only
📦
Amazon Ads
50–60 eff.
Types: Sponsored Products, Brands, Display
Limitation: DSP has separate tracking
Best practice: Segment by product line
🤖
Reddit
100 IDs
Structure: Promoted Posts / Takeover
Best practice: Reserve IDs by subreddit tier
Note: High null CV rate — consolidate campaigns
💹
The Trade Desk
100 IDs
Structure: Advertiser → Campaign → Ad Group
Feature: Cross-device DSP support
Best practice: Align with DSP hierarchy
Campaign ID Planning Best Practice
📋 ID Range Strategy
IDs 1–10: Top-performing always-on campaigns
IDs 11–50: Regular campaign rotation
IDs 51–100: Testing, seasonal, experimental
Document all assignments in a shared registry
🔄 Optimisation Tips
Reuse IDs after campaigns end (30-day recycle window)
Consolidate campaigns to reduce null CV rate
Monitor null CV % per network in SKAN dashboard
Adjust assignment per network performance data
Conversion Studio Configuration
How to configure AppsFlyer's Conversion Studio in Custom Encode Mode for a telco client — mapping 6 discrete purchase-funnel events to the 6-bit SKAN schema.
📌 CV 0 — Install
Reserved by Apple and AppsFlyer. Automatically set when no conversion event fires during the measurement window. Cannot be overridden.
⚙️ CV 1–63 — Custom Encode
All 6 bits freely assignable. In fixed/revenue mode bits 0–1 default to af_purchase revenue ranges. Custom encode mode replaces this with any event mapping.
📈 Monotone Rule
CV can only ever increase within a measurement window — never decrease. Schema should therefore order bits from lowest to highest business value.
Bit Assignment — As Configured in Conversion Studio
In Custom Encode mode, navigate to Settings → SKAN Conversion Studio → Custom and assign each bit to an in-app event. Below is the telco configuration for this schema.
Bit
CV +
In-App Event (Conversion Studio)
Event Type
Funnel Stage
Fires when…
Bit 0
+1
af_add_to_cart
Standard AF Event
Top of funnel
Customer adds any product to basket — earliest measurable intent signal
Bit 1
+2
af_initiated_checkout
Standard AF Event
Mid funnel
Customer enters payment or personal details flow — high purchase intent
Bit 2
+4
electronics_order
Custom Event
Conversion
Purchase of accessory, tablet, router, or smart home device — upsell signal
Bit 3
+8
handset_order
Custom Event
Conversion
Mobile device purchased on a 24-month airtime contract — strong ARPU lock-in
Bit 4
+16
simo_order
Custom Event
Conversion
SIM-only airtime plan taken — high-margin, recurring ARPU, low churn signal
Bit 5
+32
hbb_purchase
Custom Event
Highest value
Home Broadband bundle completed — highest single-event CV contribution in schema
Conversion Studio groups bit assignments into priority bundles. In custom encode mode, each bit maps to one event — the priority order reflects ascending business value, with higher-value product events assigned to higher bits.
1
HBB Purchase — Bit 5hbb_purchase · +32 CV · Highest single-event value
Highest Priority
🏠 hbb_purchaseCustom event · 1 occurrence · Bit 5 set → CV +32
Home Broadband bundle completed within the measurement window. Firing Bit 5 alone produces CV = 32. Combined with SIMO or Handset (cross-sell within window) → CV reaches 48–63.
2
SIMO Order — Bit 4simo_order · +16 CV · High-margin recurring revenue
High Priority
📶 simo_orderCustom event · 1 occurrence · Bit 4 set → CV +16
SIM-only airtime plan taken. Firing Bit 4 alone → CV = 16. With Add to Cart + Checkout also fired (earlier in window) → CV = 19. Strong LTV indicator for ARPU modelling.
3
Handset Order — Bit 3handset_order · +8 CV · Device + airtime contract
Medium-High Priority
📱 handset_orderCustom event · 1 occurrence · Bit 3 set → CV +8
Mobile device on a 24-month contract. Bit 3 alone → CV = 8. With funnel entry events also set → CV = 11. High device ARPU and long contract term make this a strong LTV signal.
4
Electronics Order — Bit 2electronics_order · +4 CV · Accessories & peripherals
Medium Priority
🖥️ electronics_orderCustom event · 1 occurrence · Bit 2 set → CV +4
Tablet, router, smart home device, or broadband add-on purchased. Bit 2 alone → CV = 4. Lower ARPU than core products but indicates cross-sell propensity — valuable upsell signal.
💳 af_initiated_checkoutStandard AF event · 1 occurrence · Bit 1 set → CV +2
Customer entered the checkout flow. Standard AppsFlyer event name — no custom SDK mapping required. Bit 1 alone → CV = 2. Strong predictor of same-window purchase completion in telco.
6
Add to Cart — Bit 0af_add_to_cart · +1 CV · Earliest intent signal
Lowest Priority
🛒 af_add_to_cartStandard AF event · 1 occurrence · Bit 0 set → CV +1
Customer added a product to basket. Standard AppsFlyer event. Bit 0 alone → CV = 1. Ensures CV ≥ 1 for any engaged user, distinguishing real sessions from null postbacks. Lowest CV weight — top-of-funnel signal only.
CV Value Map — All 63 States Decoded
Because each bit is independent and non-exclusive (except CV 0 which is reserved), all 63 combinations are valid. Key values to know for campaign optimisation:
0
Install only — no events fired Reserved by Apple
1
Add to Cart only 000001
3
Cart + Checkout 000011
4
Electronics only 000100
8
Handset only 001000
11
Cart + Checkout + Handset 001011
16
SIMO only 010000
32
HBB only 100000
19
Cart + Checkout + SIMO 010011
35
Cart + Checkout + HBB 100011
48
HBB + SIMO cross-sell 110000
63
All 6 events — max LTV 111111
Coarse CV Mapping (Windows 2 & 3)
SKAN 4.0 sends coarse values (low / medium / high) in Windows 2 and 3 after the fine CV window closes. For this telco schema, the coarse thresholds should be configured in Conversion Studio as:
CV 8–31 Handset or SIMO purchased Core product conversion
high
CV 32–63 HBB purchase (± any other product) Highest-value customer segment
Sample SKAN Dashboard — Media Source Performance
Media Source
Installs
Null CV Rate
Cost
Revenue
Signal Quality
Organic
333,823
N/A
N/A
€1.74
Baseline
Apple Search Ads
7,599
0.01%
€14,607
€1.71
Excellent
TikTok
1,128
5.67%
€2,985
€1.71
Good
Snapchat
864
10.65%
€522
€1.71
Good
Google Ads
2,923
30.41%
€7,824
€0.03
Moderate
Meta / Facebook
1,607
88.18%
€835
€0.03
Low — Consolidate
⚠️ Meta Action Required: 88.18% null CV rate indicates Meta campaigns are below Apple's privacy threshold. Consolidate ad sets to increase per-campaign install volumes and recover conversion signal.
Technical Requirements
Implementation prerequisites, SDK references, and testing checklist.
Steps: Register test device → Enable SDK debug mode → Monitor CV updates → Validate postbacks in AF test dashboard.
TR4 — ATT Permission Flow ▼
Implement App Tracking Transparency prompt before initialising the AppsFlyer SDK.
Package: app_tracking_transparency: ^3.x.x
Set timeToWaitForATTUserAuthorization to give sufficient time for the ATT dialog. Recommended: 10.0 seconds.
TR5 — Conversion Studio Configuration ▼
Define conversion schema in AppsFlyer dashboard before going live. Schema changes take up to 72 hours to propagate (pending active CV window expiry).
Recommended: test schema in sandbox for minimum 48h before production deployment.
TR6 — ODM & ICM Configuration ▼
Enable On Device Modelling and Integrated Conversion Management in the AppsFlyer dashboard under Settings → Attribution → Privacy-Preserving Attribution.
ICM requires: consent framework implementation, Conversion Studio schema active, and minimum 30-day data collection window for model training.
Interactive SKAN Simulator
Simulate a real telco customer journey and watch how each purchase event sets bits in the 6-bit conversion value schema — exactly as AppsFlyer encodes it for SKAN postbacks.
How This Simulator Works
1
Trigger a Purchase Event
Each button below represents a real post-install customer action — an HBB purchase, Handset order, or SIMO subscription.
2
Bits Flip in the Schema
AppsFlyer's SDK maps that event to a specific bit position in the 6-bit schema. The bit flips from 0 → 1 and the decimal CV increases.
3
SKAN Postback Is Encoded
After the window closes, Apple sends this CV to the ad network. AppsFlyer decodes it back to understand which products were purchased.
⚠️ Key SKAN Rule: The conversion value can only ever increase — never decrease. Once a bit is set to 1, it stays at 1. This is why event prioritisation in Conversion Studio matters.
Step 1 — Simulate the Telco Customer Funnel
Each event below maps to a single bit in the 6-bit schema — configured in AppsFlyer Conversion Studio custom encode mode. Trigger events in any order to build up the CV.
📌 Schema note: In Conversion Studio's fixed revenue mode, bits 0–1 are conventionally tied to af_purchase revenue ranges. In custom encode mode — used here — all 6 bits are freely assignable. This telco schema replaces that convention with a full purchase-funnel mapping across 6 discrete events, ordered by ascending value.
— SIMO Orders (Bits 0–1) —
📶
Bit 0 · +1 CV
SIMO 30-Day
Rolling SIM-Only contract
Customer takes a 30-day rolling SIM-only plan — no handset, no long-term commitment. Flexible entry-level product. Lowest CV weight but strong acquisition volume signal.
AF eventsimo_30d
Bit setBit 0 → binary 000001
CV aloneFiring this bit only → CV = 1
📶
Bit 1 · +2 CV
SIMO 2-Year
24-month committed contract
Customer commits to a 24-month SIM-only contract. Higher ARPU than 30-day, significantly lower churn. Strongest LTV signal in the SIMO category — preferred by UA optimisation models.
AF eventsimo_24mo
Bit setBit 1 → binary 000010
CV aloneFiring this bit only → CV = 2
🏠
Bit 2 · +4 CV
HBB Purchase — FTTC
Fibre-to-the-Cabinet broadband
Customer purchases a Fibre-to-the-Cabinet (FTTC) broadband plan — copper last mile, typically 30–80 Mbps. Lower revenue tier than full fibre but high adoption volume.
AF eventhbb_fttc
Bit setBit 2 → binary 000100
CV aloneFiring this bit only → CV = 4
— HBB Full Fibre & Handset Orders (Bits 3–5) —
🏠
Bit 3 · +8 CV
HBB Purchase — FTTP
Full Fibre to the Premises
Customer purchases a full-fibre FTTP plan — fibre all the way to the property, typically 150–1000 Mbps. Higher ARPU than FTTC, strong retention due to superior product quality.
AF eventhbb_fttp
Bit setBit 3 → binary 001000
CV aloneFiring this bit only → CV = 8
📱
Bit 4 · +16 CV
Handset — Mid Range
£200–£500 device + contract
Customer orders a mid-range handset (e.g. Samsung Galaxy A-series, iPhone SE) on a 24-month device plan. Solid ARPU — contract lock-in makes this a reliable LTV predictor.
AF eventhandset_mid
Bit setBit 4 → binary 010000
CV aloneFiring this bit only → CV = 16
📱
Bit 5 · +32 CV
Handset — Premium
£800+ flagship device + contract
Customer orders a flagship handset (e.g. iPhone Pro, Samsung Galaxy S-series) on a premium device plan. Highest single-bit CV — strong revenue, high ARPU, and strong brand loyalty retention signal.
AF eventhandset_premium
Bit setBit 5 → binary 100000
CV aloneFiring this bit only → CV = 32
Step 2 — Live Conversion Value Readout
This updates in real time as you trigger events above. This is exactly what AppsFlyer encodes into the SKAN postback sent to Apple.
Fine CV (0–63)
0
Decimal value sent in SKAN postback
6-Bit Binary
000000
Each bit = one product/revenue signal
Coarse Bucket
—
Windows 2 & 3 fallback
Products Active
None
Bits set across 3 products
6-Bit Schema — Live State (MSB → LSB)
Bit 5 · +32
0
Handset Prem.
Bit 4 · +16
0
Handset Mid
Bit 3 · +8
0
HBB FTTP
Bit 2 · +4
0
HBB FTTC
Bit 1 · +2
0
SIMO 2yr
Bit 0 · +1
0
SIMO 30D
Custom encode mode — all 6 bits freely assigned. Bits shown MSB→LSB (left to right). Each event sets exactly one bit independently.
📋 Event Log
No events fired yet. Trigger a purchase event above to begin the simulation.
Step 3 — What This CV Tells AppsFlyer
When AppsFlyer receives the SKAN postback with this CV, here is how it decodes and uses the data for campaign optimisation.
🔍
Postback Interpretation
Waiting for your first event trigger…
Trigger one or more purchase events above and the interpretation will update here in real time.
Full 6-Bit Schema Reference
The complete mapping of bits to events for this telco SKAN schema. AppsFlyer's Conversion Studio encodes this in the dashboard before deployment.
Bit Position
Decimal Value
Event / Signal
Trigger Condition
Business Meaning
Bit 0
+1
SIMO 30-Day
simo_30d
30-day rolling SIM-only contract. Flexible, no lock-in. Firing alone → CV = 1. Lowest CV weight — high volume, lower ARPU than committed plan.
Bit 1
+2
SIMO 2-Year
simo_24mo
24-month committed SIM-only contract. Higher ARPU, lower churn. Firing alone → CV = 2. With 30-day also set (rare) → CV = 3.
Bit 2
+4
HBB FTTC
hbb_fttc
Fibre-to-the-Cabinet broadband (30–80 Mbps, copper last mile). Firing alone → CV = 4. Lower revenue tier than FTTP but strong volume. With SIMO 2yr → CV = 6.
Bit 3
+8
HBB FTTP
hbb_fttp
Full Fibre to the Premises (150–1000 Mbps). Higher ARPU and retention vs FTTC. Firing alone → CV = 8. Premium broadband — strongest HBB LTV signal.