SKAN 4 CV reset bug: No Singular SDK update needed
You’ve just been hit by the SKAN 4 CV reset bug.
In the fast-paced world of mobile app marketing, precise measurement of user engagement and app installations is paramount. SKAdNetwork is a promising solution for privacy, but as with any complex system, bugs can emerge unexpectedly, causing havoc among advertisers and app developers.
That’s exactly what’s happened with the SKAN 4 CV reset bug, which has triggered a chain of consequences that forced conversion values in SKAN 4 postbacks to plummet to zero.
SKAN 4 and the unexpected CV reset
This rapid adoption, however, has revealed an issue. As SKAN 4 started to gain traction with partners, Singular discovered a perplexing anomaly: conversion values were mysteriously being reset to zero.
After extensive investigation, we saw that the root cause of this issue lay in the Apple AdServices framework.
The function at the center of this enigma is AAAttribution.attributionToken, a crucial component for fetching the Apple Search Ads attribution token that is used by MMPs as well as others to collect attribution information for Apple Search Ads. Instead of merely fulfilling its intended purpose, however, this function has been resetting both of SKAN 4’s conversion values (coarse and fine).
Thanks to this bug, fine conversion values are being set to zero, and coarse conversion values are being set to “none.”
What’s very odd about this bug is that Apple Search Ads, the presumed consumer and/or beneficiary of the attributionToken function, doesn’t even support SKAdNetwork, which raises questions about why the attributionToken function is impacting SKAN 4 values at all. (Speculation: Apple may have planned some level of integration between SKAN and Apple Search Ads at some point, and this function could be a part of that development).
As we have known for some time, SKAN 4 conversion values can both increase and decrease: a change from SKAN 3 where they could only increase. That means that it’s possible the bug has been lurking in SKAN 3 all along, but only became apparent when SKAN 4 was released.
We have submitted a bug report to Apple about the issue, and hope a fix will be included in their next OS version updates.
SDK collision and race conditions: verify your SDKs!
Since Singular’s SDK only fetches the AdServices attribution in the first app launch before updating any conversion values, any apps only using Singular remain immune to the bug’s effects. Consequently, Singular customers have been (mostly) spared the nightmare of grappling with zeroed-out CVs.
However, not all apps are safe.
Some apps have multiple SDKs inadvertently calling the relevant AdServices function at different times. This collision creates a race condition where the final SDK to execute the function overrides all previous SKAN updates.
Basically, it’s a digital tug-of-war, with the bug emerging victorious.
One example we’ve found is a case where a subscription app was calling the AdServices API on every app open. The result is that this app keeps resetting the CV every single time a user opens the app. Predictably, that causes a massive drop in post-install events when running SKAN 4 campaigns.
To avoid falling victim to this bug, app developers and advertisers need to scrutinize their SDKs. Thoroughly examine their compatibility and ensure they interact seamlessly without conflicts. A harmonious SDK environment is paramount to steer clear of unwanted CV resets and, of course, to maintain a smooth mobile app experience.
The Singular SDK is safe, but if you have additional SDKs that might be calling this function, you could still be impacted.
Wondering if you have been impacted? Talk to your Singular customer service representative, who can give you more details.
Check your own code, too
Finally, it’s possible to be affected by this bug but not be the victim of any particular SDK.
If your own app calls the AAAttribution.attributionToken function for any reason, you could very well be impacted. We’ve seen this in some apps thanks to legacy code from when they self-attributed Apple Search Ads campaigns in the past.
If you do check for this in your code, make sure you specifically look for the AAAttribution.attributionToken function – there are multiple versions for ASA, and the older versions don’t trigger the issue.
Important: you do not need to be intentionally running SKAN 4 campaigns to be affected
It’s important to note that you do not need to be intentionally running SKAN 4 campaigns or to have set up a SKAN 4 conversion model to be affected.
The SKAdNetwork version is set by your ad networks, and if your ad networks are sending SKAN 4 postbacks, even when you read and interpret them as SKAN 3 postbacks, they will have lost their conversion values.
(Check our SKAN 4 adoption dashboard to see if your ad networks are running SKAN 4 postbacks yet.)
Also important: if the above is happening, you might have noticed a slight decrease in iOS campaign effectiveness lately. It’s entirely possible that some of your ad partners have been experimenting with their SKAN 4 implementations, that you were susceptible to this bug, and that this is the cause of what you thought was an efficiency drop.
The complex web of the SKAN 4 CV reset bug unraveled
The bug causing zero CVs in SKAdNetwork is a multifaceted challenge originating in the iOS operating system, unleashed by the newly bidirectional changeability of conversion value updates in SKAN 4.
Singular’s SDK is unaffected, but collisions between multiple SDKs have added a layer of complexity and vulnerability.
This is yet another reminder: mobile app marketing is a complex and fast-evolving space. Vigilance and meticulousness are our most potent tools against such bugs. By carefully examining our SDKs and striving for compatibility, we can prevent the recurrence of enigmatic bugs like this and ensure a thriving ecosystem for app developers and advertisers alike.
The ultimate solution likely depends on an iOS update from Apple. But Singular customers are able to avoid the impact of the SKAN 4 CV reset bug thanks to how we’ve implemented conversion value setting.