AttributionResult
Contains information about how the user discovered and installed your app.
public struct AttributionResult: Sendable, Decodable, Equatable
Properties
A unique identifier for this attribution record.
status
public let status: AttributionStatus
The attribution status. See AttributionStatus below.
campaignId
public let campaignId: Int?
The Apple Search Ads campaign ID.
Only available when status is .attributed.
campaignName
public let campaignName: String?
The Apple Search Ads campaign name.
adGroupId
public let adGroupId: Int?
The ad group ID within the campaign.
adGroupName
public let adGroupName: String?
The ad group name.
keywordId
public let keywordId: Int?
The keyword ID that triggered the ad.
keyword
public let keyword: String?
The keyword text that the user searched for.
countryOrRegion
public let countryOrRegion: String?
The two-letter country or region code (ISO 3166-1 alpha-2).
Examples: "US", "GB", "JP", "DE"
clickDate
public let clickDate: Date?
The date and time when the user clicked the ad.
Only available when the user has opted into tracking.
conversionType
public let conversionType: String?
The type of conversion.
| Value | Description |
|---|
"Download" | New install |
"Redownload" | Reinstall |
supplyPlacement
public let supplyPlacement: String?
The ad placement where the user saw the ad.
| Value | Description |
|---|
"top_of_search" | Top position in App Store search results |
"search_results" | Other positions in search results |
Usage Example
let attribution = try await SpendOwl.attribution()
switch attribution.status {
case .attributed:
print("Campaign: \(attribution.campaignName ?? "unknown")")
print("Ad Group: \(attribution.adGroupName ?? "unknown")")
print("Keyword: \(attribution.keyword ?? "unknown")")
print("Country: \(attribution.countryOrRegion ?? "unknown")")
if let clickDate = attribution.clickDate {
print("Clicked: \(clickDate)")
}
case .organic:
print("User found the app organically")
case .unknown:
print("Attribution data not yet available")
}
AttributionStatus
The attribution status indicating how the user acquired the app.
public enum AttributionStatus: String, Sendable, Decodable
Cases
attributed
The user installed the app after clicking an Apple Search Ads advertisement.
When attributed, the AttributionResult contains campaign, ad group, and keyword data.
organic
The user found and installed the app organically (not through ads).
Organic installs don’t have campaign or keyword data.
unknown
The attribution status could not be determined.
Possible reasons:
- Attribution data is still being processed
- The device doesn’t support attribution
- An error occurred during attribution lookup
Usage Example
let attribution = try await SpendOwl.attribution()
switch attribution.status {
case .attributed:
// Paid user - show premium onboarding
showPremiumOnboarding()
case .organic:
// Organic user - show standard onboarding
showStandardOnboarding()
case .unknown:
// Can't determine - use default
showStandardOnboarding()
}
Status Comparison
| Status | Campaign Data | Keyword Data | Typical Scenario |
|---|
.attributed | Available | Available | User clicked an ad |
.organic | nil | nil | User found app in App Store |
.unknown | nil | nil | Attribution pending or unavailable |