Skip to content

Commit 2b0d7fb

Browse files
committed
Merge branch 'release/iOS-3.15.1' into develop
# Conflicts: # versioned_docs/version-3.0/adapty-user-acquisition.md # versioned_docs/version-3.0/android-present-paywall-builder-paywalls-in-observer-mode.md # versioned_docs/version-3.0/android-web-paywall.md # versioned_docs/version-3.0/sdk-installation-react-native-expo.md # versioned_docs/version-3.0/sdk-installation-react-native-pure.md # versioned_docs/version-3.0/user-acquisition.md # versioned_docs/version-3.0/web-paywall.md
2 parents 254c2d1 + d3511ef commit 2b0d7fb

26 files changed

Lines changed: 269 additions & 91 deletions

versioned_docs/version-3.0/adapty-ads-manager-get-started.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ In this guide, you will learn how to start working with Apple Ads Manager in two
1313
1. Install the Adapty SDK and let it track your purchase data.
1414
2. Connect Apple Ads Manager to your Apple Ads account to import your historical data and start tracking real-time updates.
1515

16+
:::note
17+
Apple Ads Manager does not use the [Apple Ads integration](apple-search-ads.md) from **App settings**.
18+
19+
To use Apple Ads Manager, you only need to complete the setup described in this guide.
20+
:::
21+
1622
## 1. Install the Adapty SDK
1723

1824
:::important

versioned_docs/version-3.0/adapty-user-acquisition.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: "User Acquisition (Adapty UA)"
3-
description: "Eliminate the need of MMPs and calculate the whole app economy in one place."
3+
description: "Eliminate the need for MMPs and calculate the whole app economy in one place."
44
metadataTitle: "Using Adapty User Acquisition | Adapty Docs"
55
keywords: ['adapty ua', 'user acquisition']
66
---
@@ -9,11 +9,12 @@ import ZoomImage from '@site/src/components/ZoomImage';
99

1010
<CustomDocCardList ids={['user-acquisition', 'ua-analytics', 'ua-integrations', 'ua-tracking-links', 'ua-deferred-data']} />
1111

12-
Adapty User Acquisition is a web-to-app attribution solution that connects ad campaigns with app installs and subscription revenue by combining data from ad platforms, tracking links, and your app.
12+
Adapty User Acquisition is an attribution solution that connects ad campaigns with app installs and subscription revenue by combining data from ad platforms, tracking links, and your app. It provides a unified marketing analytics dashboard that consolidates all your acquisition data in one place.
1313

1414
- Calculate ROAS (return on ad spend) across all your channels
1515
- See your entire app economy in one place
1616
- Get accurate attribution data for better decisions
17+
- Analyze cohort performance and user behavior over time
1718

1819
:::tip
1920
Want to learn more about the way Adapty User Acquisition might be useful to you? [Book a call](https://calendly.com/tnurutdinov-adapty/30min) with us.
@@ -23,7 +24,7 @@ Want to learn more about the way Adapty User Acquisition might be useful to you?
2324

2425
Measuring user acquisition performance is challenging. Data is often scattered across platforms, attribution becomes difficult due to privacy changes, and building custom solutions takes significant time.
2526

26-
Adapty UA provides built-in attribution and unified analytics. You can focus on growing your app instead of managing data systems.
27+
Adapty UA provides built-in attribution and unified analytics in a single marketing dashboard. All your acquisition metrics—from ad spend to installs to subscription revenue—are automatically consolidated and updated in real-time. No more reconciling data across spreadsheets or switching between multiple tools. You can focus on growing your app instead of managing data systems.
2728

2829
## How it works
2930

@@ -48,7 +49,7 @@ The attribution flow works as follows:
4849

4950
5. **Ad spend and revenue are connected.** Adapty pulls ad spend data from supported ad platforms (currently – Meta Ads and TikTok for Business) and links subscription and purchase events to the attributed installs.
5051

51-
As a result, Adapty provides campaign-level metrics such as installs, revenue, LTV, and ROAS in a single dashboard.
52+
As a result, Adapty provides campaign-level metrics such as installs, revenue, LTV, and ROAS in a unified analytics dashboard. You can analyze cohorts, track performance over time, and make data-driven optimization decisions—all without manually reconciling data from different sources.
5253

5354
:::tip
5455
Tracking links can also include custom parameters, allowing your app to handle [deferred deep links](ua-deferred-data.md) and react to campaign data when processing the install event.

versioned_docs/version-3.0/ads-manager.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import ZoomImage from '@site/src/components/ZoomImage';
88
import CustomDocCardList from '@site/src/components/CustomDocCardList';
99

1010
:::important
11-
Before you start using the Ads Manager, ensure you have completed the steps from [this guide](ads-manager.md).
11+
Before you start using the Ads Manager, ensure you have completed the steps from [this guide](adapty-ads-manager-get-started.md).
1212
:::
1313

1414
Apple Ads Manager lets you do three important things in one place:

versioned_docs/version-3.0/android-present-paywall-builder-paywalls-in-observer-mode.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,12 @@ The `onPurchaseInitiated` event will inform you that the user has initiated a pu
137137

138138
Remember to invoke the following callbacks to notify AdaptyUI about the purchase or restore process. This is necessary for proper paywall behavior, such as showing the loader:
139139

140-
| Callback | Description |
141-
| :----------------- | :-------------------------------------------------------------------------------- |
142-
| onStartPurchase() | The callback should be invoked to notify AdaptyUI that the purchase is started. |
143-
| onFinishPurchase() | The callback should be invoked to notify AdaptyUI that the purchase is finished. |
144-
| onStartRestore() | The callback should be invoked to notify AdaptyUI that the restore is started. |
145-
| onFinishRestore() | The callback should be invoked to notify AdaptyUI that the restore is finished. |
140+
| Callback | Description |
141+
| :----------------- |:---------------------------------------------------------------------------------------|
142+
| onStartPurchase() | The callback should be invoked to notify AdaptyUI that the purchase is started. |
143+
| onFinishPurchase() | The callback should be invoked to notify AdaptyUI that the purchase is finished. |
144+
| onStartRestore() | Optional. The callback can be invoked to notify AdaptyUI that the restore is started. |
145+
| onFinishRestore() | Optional. The callback can be invoked to notify AdaptyUI that the restore is finished. |
146146

147147
2. In order to display the visual paywall on the device screen, you must first configure it.
148148

versioned_docs/version-3.0/android-web-paywall.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ Adapty.openWebPaywall(
3333
// the web paywall was opened successfully
3434
} else {
3535
// handle the error
36-
val adaptyError = error
3736
}
3837
}
3938
```

versioned_docs/version-3.0/apple-search-ads.md

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
---
2-
title: "Apple Search Ads (ASA)"
3-
description: "Integrate Apple Search Ads with Adapty to optimize subscription conversions."
4-
metadataTitle: "Apple Search Ads Integration | Adapty Docs"
5-
keywords: ['apple ads', 'asa', 'apple search ads']
2+
title: "Apple Ads"
3+
description: "Integrate Apple Ads with Adapty to optimize subscription conversions."
4+
metadataTitle: "Apple Ads Integration | Adapty Docs"
5+
keywords: ['apple ads', 'asa', 'Apple Ads']
66
---
77

88
import Zoom from 'react-medium-image-zoom';
99
import 'react-medium-image-zoom/dist/styles.css';
1010

11-
Adapty can help you get attribution data from Apple Search Ads and analyze your metrics with campaign and keyword segmentation. Adapty collects the attribution data for Apple Search Ads automatically through its SDK and AdServices Framework.
11+
:::important
12+
The Apple Ads integration in **App settings** is used only for basic analytics and for SplitMetrics Acquire and Asapty integrations.
1213

13-
Once you've set up the Apple Search Ads integration, Adapty will start receiving attribution data from Apple Search Ads. You can easily access and view this data on the profiles page.
14+
[Apple Ads Manager](adapty-ads-manager.md) uses a separate connection. Connect your Apple Ads account in the [Apple Ads Manager settings](adapty-ads-manager-get-started.md).
15+
:::
16+
17+
18+
Adapty can help you get attribution data from Apple Ads and analyze your metrics with campaign and keyword segmentation. Adapty collects the attribution data for Apple Ads automatically through its SDK and AdServices Framework.
19+
20+
Once you've set up the Apple Ads integration, Adapty will start receiving attribution data from Apple Ads. You can easily access and view this data on the profiles page.
1421

1522

1623
<Zoom>
@@ -32,15 +39,15 @@ There are two ways to get attribution: with the old iAd framework and the modern
3239

3340
## AdServices framework
3441

35-
Apple Search Ads via [AdServices](https://developer.apple.com/documentation/ad_services) does require some configuration in Adapty Dashboard, and you will also need to enable it on the app side. To set up Apple Search Ads using the AdServices framework through Adapty, follow these steps:
42+
Apple Ads via [AdServices](https://developer.apple.com/documentation/ad_services) does require some configuration in Adapty Dashboard, and you will also need to enable it on the app side. To set up Apple Ads using the AdServices framework through Adapty, follow these steps:
3643

3744
### Step 1: Configure Info.plist
3845

3946
Add `AdaptyAppleSearchAdsAttributionCollectionEnabled` to the app’s `Info.plist` file and set it to `YES` (boolean value).
4047

4148
### Step 2: Obtain Public Key
4249

43-
In the Adapty Dashboard, navigate to [Settings -> Apple Search Ads.](https://app.adapty.io/settings/apple-search-ads)
50+
In the Adapty Dashboard, navigate to [Settings -> Apple Ads.](https://app.adapty.io/settings/apple-search-ads)
4451
Locate the pre-generated public key (Adapty provides a key pair for you) and copy it.
4552

4653
<Zoom>
@@ -55,12 +62,12 @@ Locate the pre-generated public key (Adapty provides a key pair for you) and cop
5562
</Zoom>
5663

5764
:::note
58-
If you're using an alternative service or your own solution for Apple Search Ads attribution, you can upload your own private key.
65+
If you're using an alternative service or your own solution for Apple Ads attribution, you can upload your own private key.
5966
:::
6067

61-
### Step 3: Configure User Management on Apple Search Ads
68+
### Step 3: Configure User Management on Apple Ads
6269

63-
In your [Apple Search Ads account](https://searchads.apple.com/) go to Settings > User Management page. In order for Adapty to fetch attribution data you need to invite another Apple ID account and grant it API Account Manager access.
70+
In your [Apple Ads account](https://searchads.apple.com/) go to **Settings > User Management** page. In order for Adapty to fetch attribution data you need to invite another Apple ID account and grant it API Account Manager access. You can use any account you have access to or create a new one just for this purpose. The important thing is that you must be able to log into Apple Ads using this Apple ID.
6471

6572
<Zoom>
6673
<img src={require('./img/ec183b2-kdjsfldsfjkdsfdfd.webp').default}
@@ -75,11 +82,11 @@ In your [Apple Search Ads account](https://searchads.apple.com/) go to Settings
7582

7683
### Step 4: Generate API Credentials
7784

78-
As a next step, log in to the newly added account in Apple Search Ads. Navigate to Settings -> API in the Apple Search Ads interface. Paste the previously copied public key into the designated field. Generate new API credentials.
85+
As a next step, log in to the newly added account in Apple Ads. Navigate to Settings -> API in the Apple Ads interface. Paste the previously copied public key into the designated field. Generate new API credentials.
7986

80-
### Step 5: Configure Adapty with Apple Search Ads Credentials
87+
### Step 5: Configure Adapty with Apple Ads Credentials
8188

82-
Copy the Client ID, Team ID, and Key ID fields from the Apple Search Ads settings. In the Adapty Dashboard, paste these credentials into the corresponding fields.
89+
Copy the Client ID, Team ID, and Key ID fields from the Apple Ads settings. In the Adapty Dashboard, paste these credentials into the corresponding fields.
8390

8491
<Zoom>
8592
<img src={require('./img/7356113-CleanShot_2023-08-21_at_15.08.512x.webp').default}
@@ -97,7 +104,7 @@ Copy the Client ID, Team ID, and Key ID fields from the Apple Search Ads setting
97104
:::note
98105
Optional
99106

100-
These steps are not required for Apple Search Ads attribution, only for working with other services like Asapty or your own solution.
107+
These steps are not required for Apple Ads attribution, only for working with other services like Asapty or your own solution.
101108
:::
102109

103110
You can use your own public-private key pair if you are using other services or own solution for ASA attribution.
@@ -110,7 +117,7 @@ Generate private key in Terminal
110117
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
111118
```
112119

113-
Upload it in Adapty Settings -> Apple Search Ads (Upload private key button)
120+
Upload it in Adapty Settings -> Apple Ads (Upload private key button)
114121

115122
### Step 2
116123

@@ -120,15 +127,15 @@ Generate public key in Terminal
120127
openssl ec -in private-key.pem -pubout -out public-key.pem
121128
```
122129

123-
You can use this public key in your Apple Search Ads settings of account with API Account Manager role. So you can use generated Client ID, Team ID, and Key ID values for Adapty and other services.
130+
You can use this public key in your Apple Ads settings of account with API Account Manager role. So you can use generated Client ID, Team ID, and Key ID values for Adapty and other services.
124131

125-
## Disabling Apple Search Ads attribution
132+
## Disabling Apple Ads attribution
126133

127134
Adapty can use attribution data in analytics from only one source at a time. If multiple attribution sources are enabled, the system will decide which attribution to use for each device based on the source that provides more fields.
128135

129-
For iOS devices, this means non-organic Apple Search Ads attribution will always take priority if it's enabled.
136+
For iOS devices, this means non-organic Apple Ads attribution will always take priority if it's enabled.
130137

131-
You can disable Apple Search Ads attribution receiving by toggling off the **Receive Apple Search Ads attribution in Adapty** in the [**App Settings** -> **Apple Search Ads** tab](https://app.adapty.io/settings/apple-search-ads).
138+
You can disable Apple Ads attribution receiving by toggling off the **Receive Apple Ads attribution in Adapty** in the [**App Settings** -> **Apple Ads** tab](https://app.adapty.io/settings/apple-search-ads).
132139

133140
<Zoom>
134141
<img src={require('./img/asa-disable.webp').default}

versioned_docs/version-3.0/flutter-identifying-users.md

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,63 @@ try {
6868
}
6969
```
7070

71-
You can then login the user using `.identify()` method.
71+
You can then login the user using `.identify()` method.
72+
73+
## Assign `appAccountToken` (iOS)
74+
75+
[`appAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)) is a **UUID** that lets you link App Store transactions to your internal user identity.
76+
StoreKit associates this token with every transaction, so your backend can match App Store data to your users.
77+
78+
Use a stable UUID generated per user and reuse it for the same account across devices.
79+
This ensures that purchases and App Store notifications stay correctly linked.
80+
81+
You can set the token in two ways – during the SDK activation or when identifying the user.
82+
83+
:::important
84+
You must always pass `appAccountToken` together with `customerUserId`.
85+
If you pass only the token, it will not be included in the transaction.
86+
:::
87+
88+
```dart showLineNumbers
89+
// During configuration:
90+
try {
91+
await Adapty().activate(
92+
configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
93+
..withCustomerUserId(YOUR_CUSTOMER_USER_ID, iosAppAccountToken: "YOUR_APP_ACCOUNT_TOKEN")
94+
);
95+
} catch (e) {
96+
// handle the error
97+
}
98+
// Or when identifying users
99+
try {
100+
await Adapty().identify(customerUserId, iosAppAccountToken: "YOUR_APP_ACCOUNT_TOKEN");
101+
} on AdaptyError catch (adaptyError) {
102+
// handle the error
103+
} catch (e) {
104+
}
105+
```
106+
107+
### Set obfuscated account IDs (Android)
108+
109+
Google Play requires obfuscated account IDs for certain use cases to enhance user privacy and security. These IDs help Google Play identify purchases while keeping user information anonymous, which is particularly important for fraud prevention and analytics.
110+
111+
You may need to set these IDs if your app handles sensitive user data or if you're required to comply with specific privacy regulations. The obfuscated IDs allow Google Play to track purchases without exposing actual user identifiers.
112+
113+
```dart showLineNumbers
114+
// During configuration:
115+
try {
116+
await Adapty().activate(
117+
configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
118+
..withCustomerUserId(YOUR_CUSTOMER_USER_ID, androidObfuscatedAccountId: "OBFUSCATED_ACCOUNT_ID")
119+
);
120+
} catch (e) {
121+
// handle the error
122+
}
123+
// Or when identifying users
124+
try {
125+
await Adapty().identify(customerUserId, androidObfuscatedAccountId: "OBFUSCATED_ACCOUNT_ID");
126+
} on AdaptyError catch (adaptyError) {
127+
// handle the error
128+
} catch (e) {
129+
}
130+
```

versioned_docs/version-3.0/flutter-making-purchases.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ Make sure you've [done the initial configuration](quickstart) without skipping a
3333
In paywalls built with [Paywall Builder](adapty-paywall-builder) purchases are processed automatically with no additional code. If that's your case — you can skip this step.
3434
:::
3535

36-
This snippet is valid for v.2.0 or later.
37-
3836
```dart showLineNumbers
3937
try {
4038
final purchaseResult = await Adapty().makePurchase(product: product);
@@ -133,4 +131,15 @@ Based on our observations, the Offer Code Redemption sheet in some apps may not
133131

134132
In order to do this, you need to open the url of the following format:
135133
`https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}`
136-
:::
134+
:::
135+
136+
### Manage prepaid plans (Android)
137+
138+
If your app users can purchase [prepaid plans](https://developer.android.com/google/play/billing/subscriptions#prepaid-plans) (e.g., buy a non-renewable subscription for several months), you can enable [pending transactions](https://developer.android.com/google/play/billing/subscriptions#pending) for prepaid plans.
139+
140+
```dart showLineNumbers title="main.dart"
141+
await Adapty().activate(
142+
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
143+
..withGoogleEnablePendingPrepaidPlans(true),
144+
);
145+
```

0 commit comments

Comments
 (0)