Superwall

How do I extract Apple Search Ads attribution data from Superwall?

Learn how to access raw Apple Search Ads attribution data from the Superwall SDK on the client side, since ASA data is not included in webhooks or third-party integration payloads.

When the Apple Search Ads integration is enabled, Superwall automatically fetches ASA attribution data and stores it as user attributes on the device. This data is available in the Superwall dashboard (on user profiles, in charts, and in campaign filters), but it is not included in webhook payloads or third-party integration events like Mixpanel or Amplitude.

To forward raw ASA attribution data to your own backend or analytics service, you need to read it from the SDK on the client side.

How ASA data flows through the SDK

When a user opens your app, the Superwall SDK:

  1. Fetches an AdServices attribution token from Apple's AAAttribution API.
  2. Sends the token to Superwall's servers, which resolve it into attribution details (campaign name, keyword, ad group, etc.).
  3. Stores the resolved attribution data as user attributes on the device.

Because this happens automatically, you do not need to call any Apple APIs yourself. The attribution fields become available alongside your other user attributes once the process completes.

There is a delay between when a user downloads your app via a search ad and when the attribution data becomes available. The data may not be present immediately on the first app launch. Avoid reading ASA attributes during app startup without checking that they exist first.

Reading ASA data from the SDK

Swift (iOS)

Access the userAttributes property on the shared Superwall instance. ASA fields are stored with a $ prefix (e.g., $asa_campaign_name, $asa_keyword).

let attributes = Superwall.shared.userAttributes

// Check if ASA data is available
if let campaignName = attributes["$asa_campaign_name"] as? String {
    print("Campaign: \(campaignName)")

    // Forward to your backend or analytics
    MyAnalytics.track("asa_attribution", properties: [
        "campaign_name": campaignName,
        "keyword": attributes["$asa_keyword"] as? String ?? "",
        "ad_group_name": attributes["$asa_ad_group_name"] as? String ?? "",
        "campaign_id": attributes["$asa_campaign_id"] as? String ?? ""
    ])
}

You can also listen for attribute changes using the SuperwallDelegate:

class MySuperwallDelegate: SuperwallDelegate {
    func userAttributesDidChange(newAttributes: [String: Any]) {
        // Called whenever user attributes update, including when ASA data arrives
        if let campaignName = newAttributes["$asa_campaign_name"] as? String {
            // ASA data is now available, forward it
        }
    }
}

Where ASA data is and is not available

ChannelASA data available?
SDK user attributes (client-side)Yes
Superwall dashboard (user profiles)Yes
Campaign audience filtersYes
Dashboard charts (breakdowns)Yes
WebhooksNo
Third-party integrations (Mixpanel, Amplitude, etc.)No

How is this guide?

Edit on GitHub