How to test SKAdNetwork: step-by-step instructions
Since we’ve announced our first-to-market support for SKAdNetwork and released our open-source code for its implementation, we’ve been collaborating with many advertisers, publishers, ad networks, and MMPs to integrate with SKAdNetwork and start testing it.
We’ve received many questions and ideas in our Mobile Attribution Privacy (MAP) slack group, but one of the most common questions that I’ve personally been getting is how to test the framework and see actual postbacks from it – a task that many have been struggling with. Some have even started to suspect if it’s even working at all yet…
We can assure you that SKAdNetwork indeed works, and we’ve seen the live postbacks signed by Apple before our very eyes. And although it may be challenging to figure out on your own, it’s definitely possible once you understand the details. So we wanted to share those tips for all to help expedite the SKAdNetwork adoption and push the industry forward.
Note: if you’re an advertiser, then you don’t have to worry about any of this – we’ve got you covered. You simply need to upgrade to our latest SDK that we released as part of Singular’s SKAdNetwork solution, and we’ll make sure that SKAdNetwork works behind the scenes.
To start, here’s a quick recap of the documented steps to get a postback, as summarized by Apple here:
- The Ad Network registers to SKAdNetwork and provides a signed ad to the publisher app
- The publisher app displays the ad by calling the loadProduct(withParameters:completionBlock:) method. It also must have the ad network ID in its Info.plist.
- The advertiser app calls registerAppForAdNetworkAttribution() and optionally updates a conversion value using updateConversionValue(_:)
- Once the 24-48hr timer expires, a postback should be sent directly from the device to the registered SKAdNetwork endpoint
The problem starts when you don’t get the postback – you click the ad, download the app and launch it, and wait for those long 48 hours to pass… and nothing. No error logs, no debugging tools, no way to know what went wrong. Try to repeat that process more than a few times, and it may drive you crazy. We went through some hair-tearing moments ourselves, to be honest.
But after running it again and again and using some intensive research tools, we’ve figured out all the necessary steps and summarized them all in the following definitive guide for how to get a live SKAdNetwork postback.
How to get a live SKAdNetwork postback
Step 1: Check your SKAdNetwork server endpoints
You need two endpoints to run an end-to-end test with SKAdNetwork:
- Ad Server – which generates the ad signatures and provides all the details to the publisher app
- Postback Server – which receives the signed postbacks from the device
The critical piece to note here regards the Ad Server endpoint – your implementation should follow Apple’s steps for generating your signature very carefully since any small mistake or compatibility issue will cause the postback not to send.
A good practice here is to simulate how Apple would validate your signature – you can log the ad details just before displaying them, reconstruct the message, and validate its signature using your public key. We’ve noticed that when the generated signature was compatible with OpenSSL (by running the command-line below), that’s when we’ve passed that step successfully:
❯❯❯ openssl dgst -sha256 -verify public.pem -signature signature.bin message.bin
Step 2: Get a live Advertiser app in the App Store
This is probably intuitive since you have to provide an AppStore ID of a specific advertised app when calling loadProduct in the publisher app – you have to actually download the advertiser app from the production App Store to get an attributed postback.
Step 3: Get a live Publisher app in the App Store
Downloading the publisher app from the production App Store is a critical step too (and may not be as intuitive), and Apple requires it to make the attribution decision.
So if you’re using a test publisher app that isn’t live in the App Store or the user didn’t actually download it from the production App Store, it may seem like everything is working, but you will not get the postback.
Update: As noted by Shiv@Vungle, you can use a test app (compiled on iOS14) with the App Store ID and bundle ID of an existing publisher app in the App Store, and still get the postback.
Step 4: Get a physical test device with a new iTunes user
You will need a physical device to test SKAdNetwork since the iOS simulator doesn’t have access to the App Store.
Now, an important point worth highlighting is that SKAdNetwork is supported since iOS11.3, but support for redownloads has only been added in Version 2.0, which is only available for apps that are compiled with the iOS14 SDK and signed by the App Store:
You may realize now that nobody can actually test apps that are compiled with iOS14 SDK and signed by the App Store, since Apple won’t approve submitting beta versions of iOS14 apps – so apparently we would all have to wait with testing SKAdNetwork 2.0 until the official GA version of iOS 14 and XCode 12 will be released.
Until that happens, the only way to get a live signed mobile attribution postback is to rely on SKAdNetwork v1.0, which requires the advertiser app to be downloaded for the first time by this specific iTunes user. In other words, if your iTunes user has ever downloaded the advertiser app before in any device, you can’t get an attribution postback for it.
So our best recommendation is to run the test using a new iTunes user who has never downloaded the advertiser app before.
The Ultimate SKAdNetwork Troubleshooting Guide
To summarize, here are some troubleshooting tips that may be useful to save you some debugging time:
- First, double-check the Info.plist file in your publisher app, and make sure you have the ad network ID listed there exactly as Apple describes here.
- Make sure that the loadProduct parameters are exactly what you’ve generated and signed in the Ad Server, since it can easily break if any of the parameters changed on their way. A good test would be to log the parameters just before displaying the ad and simulate Apple’s validation logic using your public key.
- Assuming you’re testing SKAdNetwork v1.0, make sure this is the first time that this iTunes user has ever downloaded the advertised app. If not, you won’t be able to get its postback.
- Keep in mind that it can take up to 48 hours to receive a postback from the device starting from the registerAppForAdNetworkAttribution() call or last updateConversionValue(_:) call. So patience is key if you’re sure that you did everything right.
- Remember that the postback should always be sent from the device, but it will only include the conversion value and publisher ID in Version 2.0 if the parameters meet Apple’s privacy thresholds (which are currently undocumented).
Any questions or other recommendations? Send us feedback in our MAP Slack group, and we’ll update this post with new learnings!
Looks a bit daunting? Don’t worry! If you’re an advertiser, then it’s our job as an MMP to provide you a full solution using a simple SDK upgrade. Click here to schedule a call with our product team.
And if you’re an ad network, check our latest post on how to support the Secure SKAdNetwork solution with almost no effort!