Signal engineering is the work of making sure Meta, Google and TikTok get clean, deduplicated, correctly valued events from your app, your backend and your subscription system, and that the numbers coming back can be reconciled against real revenue. It will not give you back user level attribution on iOS. Nothing will. It fixes the part of the problem that is yours, and it is the first thing I do on every account.
This page is for a team whose value optimization stopped working, whose dashboards disagree, or whose iOS conversions arrive as counts with no value on them. It says what usually breaks, what gets fixed, what cannot be fixed after ATT, and the $606K test that settled which signal predicts D28 ROAS.
Platform facts on this page were checked against Apple, Meta, Google, TikTok, AppsFlyer and RevenueCat documentation on 29 September 2026.
You are probably here because
None of these are media buying problems. They are signal problems, and most of them are fixable.
- Meta reports one ROAS, RevenueCat reports half of it, and finance believes neither. They will never agree, and nobody on the team can say why.
- Your SKAN conversion values come back empty on most campaigns and nobody knows why.
- Meta scales fine. Google and TikTok stall on the same creative.
- You switched to value optimization and it got worse.
- Trial starts are cheap and paid conversions never follow.
- Three SDKs are in the app. Nobody can say which one owns the conversion value.
What signal engineering fixes
Five layers, in the order I build them.
- The event layer. One canonical event taxonomy for your app, mapped explicitly to Meta standard events, Google conversion events, TikTok events and your MMP. Trial start, first payment, renewal, cancellation, refund. Each with a value, a currency and an ID.
- Server side delivery. Meta's Conversions API for app events, TikTok's Events API and Google's app conversion setup through your MMP or Firebase, wired to your subscription backend so renewals, refunds and trial conversions reach the platforms even when the app is closed. Deduplicated by event ID so nothing counts twice.
- The iOS conversion value schema. The small value Apple lets you send back is the only post install signal you get for users who declined tracking. I design it around your funnel and your volume, so campaigns clear Apple's privacy thresholds instead of returning nothing. One SDK owns it. When two SDKs write it, the last call wins, and right now that is usually an accident.
- Value signals for bidding. Purchase value, margin or predicted LTV, sent to every platform, not only Meta, and only once I have checked that the value actually correlates with what users go on to pay. A bad value teaches the algorithm to buy the wrong users faster.
- The reconciliation view. One monthly comparison of platform, MMP, RevenueCat and store payout numbers with the expected gaps written down, so the next time the numbers disagree you know in five minutes whether it is structural or a bug.
What it cannot fix after ATT, and why I say so
Since iOS 14.5, users who decline App Tracking Transparency cannot be attributed at the user level. Apple's SKAdNetwork and AdAttributionKit return delayed, aggregated postbacks with no device identifier, and they withhold detail on low volume campaigns on purpose. No Conversions API integration, no MMP feature and no attribution recovery tool changes that. Meta routes those events through Aggregated Event Measurement. Google models them. TikTok models them.
So I do not promise deterministic attribution. I promise that the signals you can control are right, that the platforms get the best possible input to optimize on, and that you will know which discrepancies are normal. Platform ROAS and subscription revenue will still disagree after the work is done. They will disagree for reasons you can explain. If a vendor tells you otherwise, ask them where the user ID comes from.
Which system reports what on iOS?
Five systems count installs and conversions from the same iOS campaigns, and when they disagree none of them is necessarily wrong. They count different things, over different windows, on different delays. I built the table from each vendor's own documentation, checked on 29 September 2026.
Google's iOS picture takes work on your side. For Integrated Conversion Measurement, Google lists an active iOS App campaign for installs, your MMP's first_open and post install events imported into Google Ads, on device measurement with event data, and a current MMP SDK. On device measurement with event data needs iOS 12 or later, the Google Analytics for Firebase SDK from version 11.14.0, and the Analytics property linked to Google Ads, and Google says it "will be inactive" for users in the EEA, the UK and Switzerland. So Google Ads, the MMP and SKAN disagree by design, and Google's own guidance is to read the ICM view if you implemented it, and Google Ads or SKAN if you did not. The ICM setup for each integration route and how I reconcile Google Ads, the MMP and SKAN each have their own article.
Some gaps have nothing to do with definitions. On one Google account I ran, the revenue event sent $1 instead of $0 when a conversion had no value, which inflated Google's reported ROAS across the board and most on iOS. It is the account behind my bid strategy test, and this is the kind of bug the reconciliation view exists to catch.
| System | What it counts | Delay | Window | Regional limits | Source |
|---|---|---|---|---|---|
| SKAdNetwork and AdAttributionKit (Apple) | Installs credited to the one winning ad across every network. Up to three postbacks, each with a conversion value the app writes on the device: a fine value from 0 to 63 only in the first, a coarse low, medium or high after that, and no value for the smallest crowds. | A random 24 to 48 hours after the first window (days 0 to 2) closes, and 24 to 144 hours after the second (days 3 to 7) and third (days 8 to 35). | In AdAttributionKit, 30 days for clicks and 1 day for views by default; an app can set 1 to 30 and 1 to 7. | Available in the EEA, the UK and Switzerland. A country code comes back only when that country's crowd reaches Apple's top tier. | Apple, conversion windows; Apple, attribution rules; Google, iOS reporting |
| Meta Aggregated Event Measurement | Installs and app events from iOS 14.5 and later that Meta credits to its own ads, for events that pass Meta's eligibility check. Since 9 October 2024 Meta also sends this reporting to MMPs. | Near real time, per Meta. | 1 day click when the ad set optimizes for installs; 1 or 7 day click for app events or value; in an Advantage+ app campaign, 1 day click, plus 1 day view for installs. | None named on Meta's attribution pages. | Meta, attribution methods; Meta, AEM and SKAdNetwork reporting |
| Google Ads modeled conversions | Modeled, event level conversions from iOS App campaigns for installs, built from IDFA, on device measurement (ODM) and SKAdNetwork, in the Campaigns and Ad groups tables. Clicks and engaged views, no view through. | Up to 5 days. | 30 days for clicks and 2 days for engaged views by default, both configurable. | Covers all users, including the EEA, the UK and Switzerland. | Google, iOS reporting |
| Google ICM claims in the MMP | Probabilistic installs credited to Google iOS App campaigns for installs, informed by IDFA and ODM event data. They appear in the MMP, not in Google Ads reporting, which shows its own modeled installs instead. Clicks and engaged views, no view through. | Closer to real time, apart from MMP delays in some regions, per Google. | The install lookback set in the MMP, 6 hours to 30 days per Google, which lists AppsFlyer as an exception; AppsFlyer's own default for Google is 30 days. | Inactive for iOS users in the EEA, the UK and Switzerland, because the ODM event data it needs is inactive there. | Google, iOS reporting; Google, ICM; Google, ODM; AppsFlyer, Google discrepancies |
| App Store Connect | First time downloads, redownloads, sales, proceeds and subscription events, each credited to the source recorded when the user tapped to download: App Store search or browse, an app or web referrer, or a campaign link. It sees the referring app or site, not your ad campaign, unless the link carried your campaign token. Usage data comes only from users who agreed to share it. | A day's data is complete two days after that day, per Apple's reports documentation. | No attribution window. The source stays with the user until they manually redownload the app. | Filterable by territory. Metrics appear only above Apple's privacy minimums, such as five first time downloads. | Apple, acquisition; Apple, metric definitions; Apple, analytics reports |
How do SKAN 4 and AdAttributionKit work for Meta campaigns on iOS?
Apple decides what comes back: up to three delayed postbacks per winning ad, each with a conversion value your app writes on the device, and less detail the smaller the campaign. On Meta, each iOS app promotion ad set uses either that SKAdNetwork attribution or Meta's own Aggregated Event Measurement, depending on which one your optimization event is eligible for.
SKAN 4 and AdAttributionKit both return three postback windows, and only the first can carry a fine value. Apple drops to coarse or to nothing when a campaign is too small to protect the crowd. A 7 day trial's first payment lands on day 7 or 8, in the second or third window, as a coarse value, days later. That is why the schema has to be designed around your funnel and your volume, not copied from a template, and why too many geo and creative splits push every campaign under the threshold at once. Which window each trial length lands in, and who writes the value, is in whether SKAN can measure the payment after a free trial.
| Window | Days after install | Value it can carry |
|---|---|---|
| First | 0 to 2 | A fine value from 0 to 63, or a coarse low, medium or high |
| Second | 3 to 7 | Coarse values only |
| Third | 8 to 35 | Coarse values only |
Who can fix CAPI and event mapping for Meta?
Someone who owns the whole event path, from the app SDK and the MMP to the subscription backend and Events Manager, because most Meta signal bugs sit where two of those meet. On a retainer that is me, with an attribution engineer from my network for the SDK and server work and one developer on your side who can ship changes.
The Conversions API for app events sends the same events from your server that the SDK or the MMP sends from the device, and Meta deduplicates them by event ID. Its job is completeness and value: renewals, refunds and conversions that happen when the app is closed, each with a value and a currency. It does not restore attribution for users who declined tracking; those events still flow through Aggregated Event Measurement. Worth doing, not a workaround. When an event reaches Meta and is still marked ineligible for AEM, the checks for each route are in why trial and purchase events are ineligible for Meta AEM.
pLTV and value optimization
A model predicts each new user's value from the first day or two of behavior. That number goes to the platform as the purchase value, or on iOS is compressed into the conversion value. The platform then bids for users who look like your high value predictions. Which event and which bidding mode fit which app is written up from $1.2M of Meta spend.
On Videa that layer, a custom CAPI purchase signal and predicted LTV in bidding, is what took D0 ROAS from 20% to a 43% record week. A $606K test settled that day zero value predicts D28 ROAS better than cost per purchase does.
Which event should you optimize on?
These are the three questions I ask, in order, before an account moves deeper. The full ladder, from install upward, is in which event a subscription app should optimize for.
- Do paid events clear the platform's learning threshold at your volume? Meta's guidance is about 50 results per ad set in the week after its last significant edit. If they do not, optimize on trial start plus an activation event. If they do, go to question 2.
- Is trial to paid healthy? If not, stay on trial start plus an activation event. Both conditions have to hold before you move. If it is, move to purchase and go to question 3.
- Does the value you would send correlate with what users go on to pay? If it does not, stay on purchase. If it does, send the value. Predicted LTV needs three more things: the prediction is calibrated against cohorts that have actually matured, there is enough volume, and the platform gets it before the attribution window closes. Switched on early, it optimizes toward the wrong users with great confidence.
Reconciling platform ROAS with subscription revenue, across countries
Platforms count attributed and modeled conversions inside their own window, at gross price, on the click date. RevenueCat counts receipts on the transaction date, net of refunds, in one currency. Store payouts arrive on a fiscal calendar, net of commission and local tax. Those are structural gaps, and they are expected. A gap that changes size from one month to the next usually has a bug behind it: a duplicated purchase event, a currency mismatch, a value that reaches one platform and not the other.
Multi country ROAS adds cohort maturity. A country whose users pay annually looks worse at day 7 and better at day 90 than one that sells monthly, so I compare cohorts at equal age, in one currency, net of commission, before deciding which country gets budget. The $383K audit is what that looks like on a real account, and how many purchases a ROAS needs before it means anything sets the floor for each cut.
How the work runs
Signal engineering is part of the retainer, and it comes first. The read starts with the growth audit: what every platform currently receives, what it is optimizing toward, and the four way comparison with the expected variance written down. After the read, some teams implement the fixes themselves from the prioritized list, with the engineering effort estimated per item. Some ask me to run the accounts. Both are fine.
For SDK work and anything that runs on your servers I bring an attribution engineer from my network. I design and own the layer; the engineering hands are specialists. You need one developer who can ship changes during the engagement, and read access to Events Manager, the MMP, RevenueCat or your subscription backend, and the ad accounts.
If you are earlier than a retainer and want the diagnosis without the engagement, a paid 90 minute session covers your setup and what to fix in which order. It is booked through the same calendar as the intro call.
Who it is for
- Subscription apps and mobile games with paid UA on at least two of Meta, Google, TikTok and Apple Search Ads
- Teams reconciling Meta, RevenueCat and the MMP by hand every month
- Apps that lean on iOS, where SKAN postbacks carry counts but no value
- Any account about to scale spend on a signal that has not been checked
What you get
- An audit of every event your app and backend send to every platform, with duplicates, missing values, wrong currencies and test events flagged
- A mapping matrix from canonical event to Meta, Google, TikTok and MMP events
- An iOS conversion value schema designed for your funnel and volume, with the postback timing you should expect
- A recommendation of which event each platform should optimize on at your volume, and when to move deeper
- A reconciliation between platform, subscription backend, MMP and store payouts that you can rerun
- A prioritized fix list with the engineering effort estimated per item
Questions people ask
Does CAPI fix ATT?
No. CAPI is a server side delivery path. It makes your events more complete and lets you send richer values. For users who declined tracking, Meta still processes those events through aggregated measurement. It is worth doing. It is not a workaround.
Does SKAN replace our MMP?
No. SKAN is one aggregated feed per network. The MMP collects it across networks, deduplicates installs claimed by two networks, maps the conversion values, adds cost, and handles consented users and channels SKAN does not cover. If you run more than one network you still need one. How much of your iOS organic is actually paid shows what the MMP alone misses.
Does Google ICM replace SKAN?
No. ICM gives your MMP probabilistic install claims for Google's iOS App campaigns for installs, from clicks and engaged views only, and Google says that data is not in Google Ads reporting today. SKAdNetwork stays Apple's own feed across every network: it includes view through installs, it covers the EEA, the UK and Switzerland, where ICM is inactive, and Google Ads reports its installs in a dedicated SKAdNetwork report. Google's conversion modeling also uses only fine SKAN values and does not support SKAN 4 coarse values, so the event you bid on still has to fit the first window. Google's pages, checked 29 September 2026: iOS measurement and reporting and the SKAdNetwork conversion value schema.
Can RevenueCat write SKAN conversion values?
No. RevenueCat's Meta integration docs say it does not configure SKAN or AEM and does not update SKAN conversion values, and its Singular docs say its server events cannot modify them. Apple documents conversion value updates as calls the app makes during each conversion window, so the writer is your own code or an SDK inside the app, such as the Meta SDK or the MMP's. RevenueCat's advice is one updater, so values do not conflict. Checked 29 September 2026.
Why is my iOS event not eligible for Meta AEM?
Meta's troubleshooting page names the usual causes: the event arrives through a different integration from your install event, or through several integrations at once; the integration sends IP addresses inconsistently or not at all; there were not enough signals in the last 30 days; or the Facebook SDK for iOS is older than 16.0.0, or the MMP SDK is out of date. AppsFlyer adds that for server to server events Meta needs both the IP address and the IDFV in the payload; whether you send them for users who declined tracking is a privacy decision for your team. After you pick a different integration in Events Manager, Meta can take up to 7 days to recheck. A delivery that RevenueCat or an MMP reports as successful means Meta accepted the event, not that it is eligible. Checked 29 September 2026.
Why does our platform ROAS not match RevenueCat?
Because they measure different things. Platforms count attributed and modeled conversions inside their own window, at gross price, on the click date. RevenueCat counts receipts on the transaction date, net of refunds. Store payouts arrive on a fiscal calendar, net of commission and tax. The three comparisons worth running, and what each one answers, are written up.
How does pLTV bidding work?
A model predicts each new user's value from the first day or two of behavior. That number goes to the platform as the purchase value, or on iOS is compressed into the conversion value, and the platform bids for users who look like your high value predictions. It only helps if the prediction is calibrated, there is enough volume, and the platform gets it before the attribution window closes.
Should we optimize for trial start or purchase?
It depends on volume and trial to paid rate. At low volume, purchase events are too sparse and delayed, so trial start plus an activation event is usually right. Once paid events clear the platform's learning threshold and trial to paid is healthy, move to purchase or value. Most apps stay on trial start longer than they should. ROAS or purchase optimization on Meta covers the bidding side.
iOS attribution looks broken. Is it?
Probably not. Delayed postbacks, empty values on small campaigns and platform versus MMP mismatch are all expected. The real bugs are usually a second SDK overwriting the conversion value, a schema that does not match the MMP, or too many geo and creative splits pushing every campaign under the privacy threshold.
Is signal engineering the same as setting up the MMP?
No. The MMP records what happened. Signal engineering decides what the ad platforms are told, and in what shape, so they optimize toward payers. Most accounts have the MMP installed and the signal wrong.
How long does signal engineering take?
The audit takes days. The fixes start feeding the algorithms within weeks, which is faster than any creative verdict, and it is why this comes first. The growth audit is where it starts, and it can be booked on its own at any spend level.
Does signal engineering need engineering from my side?
Some, for SDK changes and anything that runs on your servers, and I bring an attribution engineer from my network to do them with your team. You need one developer who can ship changes during the engagement. The design and the ownership of the layer stay with me.
Is there a minimum spend?
Retainers are built for apps already spending around $100K a month or more on paid UA, or funded to get there. Below that, the growth audit is available at any spend level, and a paid 90 minute session covers the diagnosis on its own. Very small campaigns will not clear Apple's privacy thresholds no matter how clean the signal is, and I will say so on the call.
Sources
- App Tracking Transparency Apple Developer Documentation. Checked 29 September 2026.
- AdAttributionKit Apple Developer Documentation. Checked 29 September 2026.
- Receiving postbacks in multiple conversion windows Apple Developer Documentation, SKAdNetwork. The three windows and the coarse and fine values. Checked 29 September 2026.
- Receiving postbacks in multiple conversion windows (AdAttributionKit) Apple Developer Documentation. Windows, random postback delays, postback data tiers and the country code. Checked 29 September 2026.
- Configuring attribution rules for your app Apple Developer Documentation. Default and configurable click and view windows. Checked 29 September 2026.
- App ad attribution overview Apple Ads Help. Apple Ads registered with AdAttributionKit on 10 April 2025. Checked 29 September 2026.
- Acquisition App Store Connect Analytics Help. Source types and how downloads, sales and subscriptions are credited to them. Checked 29 September 2026.
- Metric definitions App Store Connect Analytics Help. Download metrics and their minimums. Checked 29 September 2026.
- Analytics Reports API App Store Connect Analytics Help. Data completeness and privacy thresholds. Checked 29 September 2026.
- Conversions API for App Events Meta for Developers. Checked 29 September 2026.
- Key concepts for Meta's Aggregated Event Measurement and Apple's SKAdNetwork Meta Business Help Center. Checked 29 September 2026.
- About campaign attribution methods Meta Business Help Center. AEM attribution windows for iOS 14+ app promotion campaigns. Checked 29 September 2026.
- Ads Manager reporting differences between Meta's Aggregated Event Measurement and Apple's SKAdNetwork Meta Business Help Center. Reporting delays, and AEM reporting sent to MMPs from 9 October 2024. Checked 29 September 2026.
- Troubleshoot issues with app eligibility for Aggregated Event Measurement Meta Business Help Center. Checked 29 September 2026.
- Set up mobile app conversion tracking Google Ads Help. Checked 29 September 2026.
- About bidding in App campaigns Google Ads Help. Target ROAS uses conversion values from in app events. Checked 29 September 2026.
- Understanding iOS App campaign measurement and reporting Google Ads Help. Modeled conversions, ICM and SKAdNetwork compared. Checked 29 September 2026.
- About Integrated Conversion Measurement for App Campaigns Google Ads Help. iOS eligibility requirements. Checked 29 September 2026.
- About on-device conversion measurement for iOS App campaigns Google Ads Help. Requirements, and inactive for users in the EEA, the UK and Switzerland. Checked 29 September 2026.
- Set up your SKAdNetwork conversion value schema Google Ads Help. Google's modeling uses fine values only. Checked 29 September 2026.
- About App Event Optimization TikTok Ads Manager Help Center, updated May 2025. Checked 29 September 2026.
- Events API TikTok Business Help Center, updated April 2025. Server side events across web, app and offline. Checked 29 September 2026.
- Google Ads (AdWords): FAQ and discrepancies AppsFlyer Help Center, edited 16 March 2026. Google Ads shows its own modeled installs, AppsFlyer shows ICM claims. Checked 29 September 2026.
- Meta Ads Aggregate Event Measurement (AEM) for iOS AppsFlyer Help Center, edited 25 May 2026. IP address and IDFV required on server to server events. Checked 29 September 2026.
- SKAN modeled data AppsFlyer Help Center. An MMP describing how it models the values Apple withholds; the accuracy of that modeling is the vendor’s claim. Checked 29 September 2026.
- Meta Ads integration RevenueCat documentation. Does not configure SKAN or AEM or update SKAN conversion values. Checked 29 September 2026.
- Singular integration RevenueCat documentation. Server events cannot modify SKAdNetwork conversion values. Checked 29 September 2026.