[{"data":1,"prerenderedAt":611},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Fmarketing\u002Fios-17-post-att-attribution-stack":13},{"i18nKey":4,"paths":5},"marketing-003-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fmarketing\u002Fios-17-nach-attribution-stack","\u002Fen\u002Fmarketing\u002Fios-17-post-attribution-stack","\u002Fes\u002Fmarketing\u002Fstack-atribucin-post-ios-17","\u002Ffr\u002Fmarketing\u002Fstack-attribution-ios-17-post","\u002Fit\u002Fmarketing\u002Fios-17-sonrasi-attribution-stack","\u002Fru\u002Fmarketing\u002Fios-17-sonrasi-atribucija-stack","\u002Ftr\u002Fmarketing\u002Fios-17-sonrasi-ad-attribution-stacki",{"_path":14,"_dir":15,"_draft":16,"_partial":16,"_locale":17,"title":18,"description":19,"publishedAt":20,"modifiedAt":20,"category":15,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":605,"_id":606,"_source":607,"_file":608,"_stem":609,"_extension":610},"\u002Fen\u002Fmarketing\u002Fios-17-post-att-attribution-stack","marketing",false,"","iOS 17 Post-ATT Attribution Stack","Rebuilding iOS attribution with SKAdNetwork 4, modeled conversions, and incrementality tests: practical strategy for post-lookback maturity era.","2026-06-02",[22,23,24,25,26],"ios-attribution","skadnetwork","att","modeled-conversions","mobile-measurement",8,"Roibase",{"type":30,"children":31,"toc":591},"root",[32,40,47,52,63,73,83,88,94,99,106,111,119,154,159,165,170,175,181,197,203,208,216,250,260,270,276,281,289,322,332,338,343,496,504,532,537,543,551,556,564,569,577,582,586],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","Five years have passed since Apple deployed App Tracking Transparency in iOS 14.5. Since that moment, the foundational assumptions of mobile performance marketing shifted. Deterministic user-level attribution died; probabilistic and aggregated models became mandatory. iOS 17 and SKAdNetwork 4's new conversion value schema, post-lookback maturity window, and modeled conversions are redrawing the game. This article explains how to structure iOS attribution in 2026, which signals to use in which order, and how to blend MMPs with incrementality testing.",{"type":33,"tag":41,"props":42,"children":44},"h2",{"id":43},"attribution-anatomy-after-att",[45],{"type":38,"value":46},"Attribution Anatomy After ATT",{"type":33,"tag":34,"props":48,"children":49},{},[50],{"type":38,"value":51},"Before iOS 14.5, MMPs (Adjust, AppsFlyer, Kochava) could read IDFA at device level, tying every conversion directly to a campaign. ATT closed this mechanism for >95% of users (2025 Statista: opt-in rate ~7%). Now we have three layers:",{"type":33,"tag":34,"props":53,"children":54},{},[55,61],{"type":33,"tag":56,"props":57,"children":58},"strong",{},[59],{"type":38,"value":60},"1. Deterministic (IDFA opt-in users):",{"type":38,"value":62}," The ~7% who grant permission still flow through classic MMP pipelines. Click\u002Fimpression timestamp, install, in-app event — all user-level. But this segment no longer carries representative weight.",{"type":33,"tag":34,"props":64,"children":65},{},[66,71],{"type":33,"tag":56,"props":67,"children":68},{},[69],{"type":38,"value":70},"2. SKAdNetwork (aggregated postback):",{"type":38,"value":72}," Apple's privacy-first framework. Attribution window 0–72 hours; conversion value limited to 6-bit encoding (0–63). SKAdNetwork 4 added second and third postbacks (8–35 day lockWindow), making D7–D30 retention measurable.",{"type":33,"tag":34,"props":74,"children":75},{},[76,81],{"type":33,"tag":56,"props":77,"children":78},{},[79],{"type":38,"value":80},"3. Modeled conversions:",{"type":38,"value":82}," Machine-learning predictions by MMPs. Combines aggregate click\u002Fimpression data, install counts, and SKAN signals. Lower fidelity than deterministic, but provides scale.",{"type":33,"tag":34,"props":84,"children":85},{},[86],{"type":38,"value":87},"We must use all three together. None is sufficient alone: IDFA too narrow, SKAN aggregated and delayed, modeled inherently predictive. Architecting a stack that balances all three is now core competency.",{"type":33,"tag":41,"props":89,"children":91},{"id":90},"what-skadnetwork-4-brings",[92],{"type":38,"value":93},"What SKAdNetwork 4 Brings",{"type":33,"tag":34,"props":95,"children":96},{},[97],{"type":38,"value":98},"SKAdNetwork 4 (shipped iOS 16.1, matured by iOS 17) introduces three major features:",{"type":33,"tag":100,"props":101,"children":103},"h3",{"id":102},"conversion-value-hierarchy-and-postback-chain",[104],{"type":38,"value":105},"Conversion Value Hierarchy and Postback Chain",{"type":33,"tag":34,"props":107,"children":108},{},[109],{"type":38,"value":110},"No longer a single 6-bit value—now three postbacks: 0–2 days, 3–7 days, 8–35 days. Each carries its own 6-bit value. This lets you separate early IAP (install-to-purchase \u003C48h) in postback one from retention signals (D3–D7 session count) in postback two. Previously, we squeezed all signals into 64 slots; now we have 64+64+64 combinatorial space (sequential encoding).",{"type":33,"tag":34,"props":112,"children":113},{},[114],{"type":33,"tag":56,"props":115,"children":116},{},[117],{"type":38,"value":118},"Example mapping:",{"type":33,"tag":120,"props":121,"children":122},"ul",{},[123,134,144],{"type":33,"tag":124,"props":125,"children":126},"li",{},[127,132],{"type":33,"tag":56,"props":128,"children":129},{},[130],{"type":38,"value":131},"Postback 1 (0–2 days):",{"type":38,"value":133}," D0 IAP status (0=no event, 1–10=revenue bracket, 11–20=specific SKU, 21–63=custom blend)",{"type":33,"tag":124,"props":135,"children":136},{},[137,142],{"type":33,"tag":56,"props":138,"children":139},{},[140],{"type":38,"value":141},"Postback 2 (3–7 days):",{"type":38,"value":143}," D3–D7 retention tier (0=churn, 1–20=session count band, 21–40=engagement depth)",{"type":33,"tag":124,"props":145,"children":146},{},[147,152],{"type":33,"tag":56,"props":148,"children":149},{},[150],{"type":38,"value":151},"Postback 3 (8–35 days):",{"type":38,"value":153}," D30 LTV proxy (0–63=cumulative revenue bracket)",{"type":33,"tag":34,"props":155,"children":156},{},[157],{"type":38,"value":158},"Structuring this correctly requires weekly review of conversion value mapping. As user behavior drifts, the most informative signal's slot assignment shifts.",{"type":33,"tag":100,"props":160,"children":162},{"id":161},"source-identifier-and-hierarchical-source-id",[163],{"type":38,"value":164},"Source Identifier and Hierarchical Source ID",{"type":33,"tag":34,"props":166,"children":167},{},[168],{"type":38,"value":169},"SKAdNetwork 4 exposes publisher app and sub-publisher network IDs in four-tier hierarchy. No longer just \"came from Meta\"—now \"Meta → Audience Network → Publisher App X\" (if the ad network exposes it). This enables sub-publisher performance comparison.",{"type":33,"tag":34,"props":171,"children":172},{},[173],{"type":38,"value":174},"In practice, walled gardens (Facebook, TikTok, Google) don't fully expose this field, but it creates critical advantage in programmatic and rewarded video networks.",{"type":33,"tag":100,"props":176,"children":178},{"id":177},"web-to-app-attribution-support",[179],{"type":38,"value":180},"Web-to-App Attribution Support",{"type":33,"tag":34,"props":182,"children":183},{},[184,186,195],{"type":38,"value":185},"iOS 17.4 added SKAdNetwork support for web clicks. Safari banner → App Store → install now flows through SKAN postback. For brands running joint web + app UA strategy, this enables cross-channel incrementality calculation when blended with ",{"type":33,"tag":187,"props":188,"children":192},"a",{"href":189,"rel":190},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fppc",[191],"nofollow",[193],{"type":38,"value":194},"performance marketing (PPC)",{"type":38,"value":196}," campaigns.",{"type":33,"tag":41,"props":198,"children":200},{"id":199},"modeled-conversions-how-it-works-when-to-trust-it",[201],{"type":38,"value":202},"Modeled Conversions: How It Works, When to Trust It",{"type":33,"tag":34,"props":204,"children":205},{},[206],{"type":38,"value":207},"Modeled conversions merge SKAN postbacks, aggregate impression\u002Fclick counts, and install volume via machine learning for probabilistic attribution. AppsFlyer calls it \"predictive analytics,\" Adjust \"statistical modeling\"—technically identical: regression + Bayesian inference.",{"type":33,"tag":34,"props":209,"children":210},{},[211],{"type":33,"tag":56,"props":212,"children":213},{},[214],{"type":38,"value":215},"Trust-enabling conditions:",{"type":33,"tag":217,"props":218,"children":219},"ol",{},[220,230,240],{"type":33,"tag":124,"props":221,"children":222},{},[223,228],{"type":33,"tag":56,"props":224,"children":225},{},[226],{"type":38,"value":227},"Sufficient data volume:",{"type":38,"value":229}," Minimum 500+ installs\u002Fday, 50+ conversions per campaign (SKAN or IDFA). Below this, the model overfits.",{"type":33,"tag":124,"props":231,"children":232},{},[233,238],{"type":33,"tag":56,"props":234,"children":235},{},[236],{"type":38,"value":237},"SKAN signal stability:",{"type":38,"value":239}," Conversion value mapping must stay consistent. Daily remapping prevents the model from capturing historical patterns.",{"type":33,"tag":124,"props":241,"children":242},{},[243,248],{"type":33,"tag":56,"props":244,"children":245},{},[246],{"type":38,"value":247},"Incrementality calibration:",{"type":38,"value":249}," Run at least one geo-holdout or time-based holdout per quarter. Compare modeled numbers to actual lift, apply bias correction.",{"type":33,"tag":34,"props":251,"children":252},{},[253,258],{"type":33,"tag":56,"props":254,"children":255},{},[256],{"type":38,"value":257},"Bad usage example:",{"type":38,"value":259}," New campaign launched, 20 installs in 3 days, MMP says \"modeled 15 IAP.\" Pure noise—sample too small. Wait 2+ weeks.",{"type":33,"tag":34,"props":261,"children":262},{},[263,268],{"type":33,"tag":56,"props":264,"children":265},{},[266],{"type":38,"value":267},"Good usage example:",{"type":38,"value":269}," 50K installs over 30 days across Meta + TikTok + Google UAC; SKAN delivered 3K conversion postbacks. MMP modeled it to 8K. Same period, geo-test holdout (France vs Germany) showed +12% lift. You revise modeled to 8K × 1.12 = 8.96K. This is reliable.",{"type":33,"tag":41,"props":271,"children":273},{"id":272},"post-lookback-maturity-signal-beyond-day-35",[274],{"type":38,"value":275},"Post-Lookback Maturity: Signal Beyond Day 35",{"type":33,"tag":34,"props":277,"children":278},{},[279],{"type":38,"value":280},"SKAdNetwork 4's third postback covers events in days 8–35. After day 35, no SKAN postback arrives. Yet real user behavior extends beyond day 35: D60 retention, D90 LTV, annual subscription renewals.",{"type":33,"tag":34,"props":282,"children":283},{},[284],{"type":33,"tag":56,"props":285,"children":286},{},[287],{"type":38,"value":288},"Solution approaches:",{"type":33,"tag":217,"props":290,"children":291},{},[292,302,312],{"type":33,"tag":124,"props":293,"children":294},{},[295,300],{"type":33,"tag":56,"props":296,"children":297},{},[298],{"type":38,"value":299},"Cohort-based LTV projection:",{"type":38,"value":301}," Fit a cohort LTV curve using first-35-day SKAN + modeled conversion data (typically power law or exponential decay). Extrapolate 90–180-day LTV. This is an estimate, but with sufficient cohort size, variance drops.",{"type":33,"tag":124,"props":303,"children":304},{},[305,310],{"type":33,"tag":56,"props":306,"children":307},{},[308],{"type":38,"value":309},"Cross-channel holdout and incrementality:",{"type":38,"value":311}," Pause one channel for 2 weeks, measure organic install and in-app revenue change. Calculate net incrementality, backfill post-day-35 signals with this test. Repeat quarterly.",{"type":33,"tag":124,"props":313,"children":314},{},[315,320],{"type":33,"tag":56,"props":316,"children":317},{},[318],{"type":38,"value":319},"Server-side event enrichment:",{"type":38,"value":321}," Feed late-stage events missing from SKAN postbacks (subscription renewal, high-ticket IAP) to the MMP via server-to-server. Not deterministic, but creates patterns in aggregate. MMP uses this as modeling input.",{"type":33,"tag":34,"props":323,"children":324},{},[325,330],{"type":33,"tag":56,"props":326,"children":327},{},[328],{"type":38,"value":329},"Caution:",{"type":38,"value":331}," Apple doesn't explicitly ban server-side user-level signal delivery, but MMPs claiming it as user-level attribution violates policy. Using it as aggregate modeling input is acceptable.",{"type":33,"tag":41,"props":333,"children":335},{"id":334},"practical-stack-setup-scenario",[336],{"type":38,"value":337},"Practical Stack Setup Scenario",{"type":33,"tag":34,"props":339,"children":340},{},[341],{"type":38,"value":342},"Say you operate a subscription-based fitness app. iOS comprises 60% of your install base; you target 100K new installs\u002Fmonth. Here's your attribution stack:",{"type":33,"tag":344,"props":345,"children":346},"table",{},[347,376],{"type":33,"tag":348,"props":349,"children":350},"thead",{},[351],{"type":33,"tag":352,"props":353,"children":354},"tr",{},[355,361,366,371],{"type":33,"tag":356,"props":357,"children":358},"th",{},[359],{"type":38,"value":360},"Layer",{"type":33,"tag":356,"props":362,"children":363},{},[364],{"type":38,"value":365},"Tool",{"type":33,"tag":356,"props":367,"children":368},{},[369],{"type":38,"value":370},"Role",{"type":33,"tag":356,"props":372,"children":373},{},[374],{"type":38,"value":375},"Trust Range",{"type":33,"tag":377,"props":378,"children":379},"tbody",{},[380,404,427,450,473],{"type":33,"tag":352,"props":381,"children":382},{},[383,389,394,399],{"type":33,"tag":384,"props":385,"children":386},"td",{},[387],{"type":38,"value":388},"SKAN Postback",{"type":33,"tag":384,"props":390,"children":391},{},[392],{"type":38,"value":393},"AppsFlyer",{"type":33,"tag":384,"props":395,"children":396},{},[397],{"type":38,"value":398},"First 35-day conversion value + source ID",{"type":33,"tag":384,"props":400,"children":401},{},[402],{"type":38,"value":403},"95% (Apple-verified)",{"type":33,"tag":352,"props":405,"children":406},{},[407,412,417,422],{"type":33,"tag":384,"props":408,"children":409},{},[410],{"type":38,"value":411},"Modeled Conversions",{"type":33,"tag":384,"props":413,"children":414},{},[415],{"type":38,"value":416},"AppsFlyer Predictive",{"type":33,"tag":384,"props":418,"children":419},{},[420],{"type":38,"value":421},"SKAN + aggregate probabilistic attribution",{"type":33,"tag":384,"props":423,"children":424},{},[425],{"type":38,"value":426},"70–80% (geo-test calibrated)",{"type":33,"tag":352,"props":428,"children":429},{},[430,435,440,445],{"type":33,"tag":384,"props":431,"children":432},{},[433],{"type":38,"value":434},"IDFA Opt-in",{"type":33,"tag":384,"props":436,"children":437},{},[438],{"type":38,"value":439},"AppsFlyer raw data",{"type":33,"tag":384,"props":441,"children":442},{},[443],{"type":38,"value":444},"Deterministic 7% segment",{"type":33,"tag":384,"props":446,"children":447},{},[448],{"type":38,"value":449},"100% (low representativeness)",{"type":33,"tag":352,"props":451,"children":452},{},[453,458,463,468],{"type":33,"tag":384,"props":454,"children":455},{},[456],{"type":38,"value":457},"Incrementality",{"type":33,"tag":384,"props":459,"children":460},{},[461],{"type":38,"value":462},"GeoLift (Meta) + custom holdout",{"type":33,"tag":384,"props":464,"children":465},{},[466],{"type":38,"value":467},"Channel-level lift measurement",{"type":33,"tag":384,"props":469,"children":470},{},[471],{"type":38,"value":472},"90% (statistical, expensive)",{"type":33,"tag":352,"props":474,"children":475},{},[476,481,486,491],{"type":33,"tag":384,"props":477,"children":478},{},[479],{"type":38,"value":480},"LTV Projection",{"type":33,"tag":384,"props":482,"children":483},{},[484],{"type":38,"value":485},"Internal dbt + BigQuery",{"type":33,"tag":384,"props":487,"children":488},{},[489],{"type":38,"value":490},"Cohort curve fit, 90–180-day forecast",{"type":33,"tag":384,"props":492,"children":493},{},[494],{"type":38,"value":495},"60–70% (model accuracy)",{"type":33,"tag":34,"props":497,"children":498},{},[499],{"type":33,"tag":56,"props":500,"children":501},{},[502],{"type":38,"value":503},"Flow:",{"type":33,"tag":217,"props":505,"children":506},{},[507,512,517,522,527],{"type":33,"tag":124,"props":508,"children":509},{},[510],{"type":38,"value":511},"Pull SKAN postbacks daily per campaign.",{"type":33,"tag":124,"props":513,"children":514},{},[515],{"type":38,"value":516},"Fetch AppsFlyer modeled conversions, but leave ±20% confidence band in campaign-level CPA calculations.",{"type":33,"tag":124,"props":518,"children":519},{},[520],{"type":38,"value":521},"Run geo-holdout monthly (e.g., pause Meta in Spain, continue in Portugal). Calculate net lift.",{"type":33,"tag":124,"props":523,"children":524},{},[525],{"type":38,"value":526},"Quarterly: refresh cohort LTV curve. Regress first-35-day SKAN signal against 90-day revenue correlation.",{"type":33,"tag":124,"props":528,"children":529},{},[530],{"type":38,"value":531},"Allocate budget as weighted average of SKAN + modeled + incrementality.",{"type":33,"tag":34,"props":533,"children":534},{},[535],{"type":38,"value":536},"Expensive? Yes. But if iOS traffic is 60% of volume and CAC is $30+\u002Fuser, attribution error cost far exceeds testing cost.",{"type":33,"tag":41,"props":538,"children":540},{"id":539},"tradeoffs-and-counter-arguments",[541],{"type":38,"value":542},"Tradeoffs and Counter-Arguments",{"type":33,"tag":34,"props":544,"children":545},{},[546],{"type":33,"tag":56,"props":547,"children":548},{},[549],{"type":38,"value":550},"\"Modeled conversions are unreliable—why use them?\"",{"type":33,"tag":34,"props":552,"children":553},{},[554],{"type":38,"value":555},"Because the alternative is nothing. SKAN is aggregated, IDFA is 7%, no signal means flying blind. Modeled conversions are imperfect but calibrated. Once you adjust bias via holdout tests, you get 75–80% accuracy—far better than zero data.",{"type":33,"tag":34,"props":557,"children":558},{},[559],{"type":33,"tag":56,"props":560,"children":561},{},[562],{"type":38,"value":563},"\"Is SKAdNetwork 4 enough, or should we wait for 5?\"",{"type":33,"tag":34,"props":565,"children":566},{},[567],{"type":38,"value":568},"SKAdNetwork 5 (arriving iOS 18, announced mid-2024) promises finer source ID and longer lookback, but adoption is incomplete. iOS 17 user base is ~70%+, iOS 18 ~30%. Build your stack on SKAdNetwork 4 and bolt on version 5 features incrementally—pragmatic approach.",{"type":33,"tag":34,"props":570,"children":571},{},[572],{"type":33,"tag":56,"props":573,"children":574},{},[575],{"type":38,"value":576},"\"Do we need incrementality testing for every campaign?\"",{"type":33,"tag":34,"props":578,"children":579},{},[580],{"type":38,"value":581},"No. Incrementality is expensive and slow. One quarterly test per channel is sufficient (Meta Q1, TikTok Q2, Google Q3). For smaller campaigns, rely on modeled + SKAN blend; test when budget moves large.",{"type":33,"tag":583,"props":584,"children":585},"hr",{},[],{"type":33,"tag":34,"props":587,"children":588},{},[589],{"type":38,"value":590},"iOS attribution is no longer deterministic—it's probabilistic, aggregated, and test-driven. Correctly mapping SKAdNetwork 4's three-postback structure, calibrating modeled conversions against holdout tests, and projecting post-day-35 LTV via cohort fit is the 2026 standard operation. Build your stack on these three layers—SKAN, modeled, incrementality—and you'll graduate from blind flying to data-informed budget allocation on iOS.",{"title":17,"searchDepth":592,"depth":592,"links":593},3,[594,596,601,602,603,604],{"id":43,"depth":595,"text":46},2,{"id":90,"depth":595,"text":93,"children":597},[598,599,600],{"id":102,"depth":592,"text":105},{"id":161,"depth":592,"text":164},{"id":177,"depth":592,"text":180},{"id":199,"depth":595,"text":202},{"id":272,"depth":595,"text":275},{"id":334,"depth":595,"text":337},{"id":539,"depth":595,"text":542},"markdown","content:en:marketing:ios-17-post-att-attribution-stack.md","content","en\u002Fmarketing\u002Fios-17-post-att-attribution-stack.md","en\u002Fmarketing\u002Fios-17-post-att-attribution-stack","md",1782079495694]