Fetch Paywall Builder paywalls and their configuration in Unity SDK
After you designed the visual part for your paywall with the new Paywall Builder in the Adapty Dashboard, you can display it in your mobile app. The first step in this process is to get the paywall associated with the placement and its view configuration as described below.
The new Paywall Builder works with Unity SDK version 3.3.0 or higher. For presenting paywalls in Adapty SDK v2 designed with the legacy Paywall Builder, see Display paywalls designed with legacy Paywall Builder.
Please be aware that this topic refers to Paywall Builder-customized paywalls. If you are implementing your paywalls manually, please refer to the Fetch paywalls and products for remote config paywalls in your mobile app topic.
Want to see a real-world example of how Adapty SDK is integrated into a mobile app? Check out our sample apps, which demonstrate the full setup, including displaying paywalls, making purchases, and other basic functionality.
Before you start displaying paywalls in your mobile app (click to expand)
- Create your products in the Adapty Dashboard.
- Create a paywall and incorporate the products into it in the Adapty Dashboard.
- Create placements and incorporate your paywall into it in the Adapty Dashboard.
- Install Adapty SDK in your mobile app.
Fetch paywall designed with Paywall Builder
If you've designed a paywall using the Paywall Builder, you don't need to worry about rendering it in your mobile app code to display it to the user. Such a paywall contains both what should be shown within the paywall and how it should be shown. Nevertheless, you need to get its ID via the placement, its view configuration, and then present it in your mobile app.
To ensure optimal performance, it's crucial to retrieve the paywall and its view configuration as early as possible, allowing sufficient time for images to download before presenting them to the user.
To get a paywall, use the GetPaywall method:
Adapty.GetPaywall("YOUR_PLACEMENT_ID", "en", (paywall, error) => {
if(error != null) {
// handle the error
return;
}
// paywall - the resulting object
});
Parameters:
| Parameter | Presence | Description |
|---|---|---|
| placementId | required | The identifier of the desired Placement. This is the value you specified when creating a placement in the Adapty Dashboard. |
| locale | optional default: | The identifier of the paywall localization. This parameter is expected to be a language code composed of one or two subtags separated by the minus (-) character. The first subtag is for the language, the second one is for the region. Example: See Localizations and locale codes for more information on locale codes and how we recommend using them. |
| fetchPolicy | default: .reloadRevalidatingCacheData | By default, SDK will try to load data from the server and will return cached data in case of failure. We recommend this variant because it ensures your users always get the most up-to-date data. However, if you believe your users deal with unstable internet, consider using Note that the cache remains intact upon restarting the app and is only cleared when the app is reinstalled or through manual cleanup. Adapty SDK stores paywalls locally in two layers: regularly updated cache described above and fallback paywalls. We also use CDN to fetch paywalls faster and a stand-alone fallback server in case the CDN is unreachable. This system is designed to make sure you always get the latest version of your paywalls while ensuring reliability even in cases where internet connection is scarce. |
| loadTimeout | default: 5 sec | This value limits the timeout for this method. If the timeout is reached, cached data or local fallback will be returned. Note that in rare cases this method can timeout slightly later than specified in |
Response parameters:
| Parameter | Description |
|---|---|
| Paywall | An AdaptyPaywall object with a list of product IDs, the paywall identifier, remote config, and several other properties. |
Fetch the view configuration of paywall designed using Paywall Builder
Make sure to enable the Show on device toggle in the paywall builder. If this option isn't turned on, the view configuration won't be available to retrieve.
After fetching the paywall, check if it includes a ViewConfiguration, which indicates that it was created using Paywall Builder. This will guide you on how to display the paywall. If the ViewConfiguration is present, treat it as a Paywall Builder paywall; if not, handle it as a remote config paywall.
In Unity SDK, directly call the CreatePaywallView method without manually fetching the view configuration first.
The result of the CreatePaywallView method can only be used once. If you need to use it again, call the CreatePaywallView method anew. Calling it twice without recreating may result in the AdaptyUIError.viewAlreadyPresented error.
var parameters = new AdaptyUICreatePaywallViewParameters()
.SetPreloadProducts(preloadProducts)
.SetLoadTimeout(new TimeSpan(0, 0, 3));
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
// handle the result
});
Parameters:
| Parameter | Presence | Description |
|---|---|---|
| paywall | required | An AdaptyPaywall object to obtain a controller for the desired paywall. |
| loadTimeout | default: 5 sec | This value limits the timeout for this method. If the timeout is reached, cached data or local fallback will be returned.Note that in rare cases this method can timeout slightly later than specified in loadTimeout, since the operation may consist of different requests under the hood. |
| PreloadProducts | optional | Provide an array of AdaptyPaywallProducts to optimize the display timing of products on the screen. If nil is passed, AdaptyUI will automatically fetch the necessary products. |
| CustomTags | optional | Define a dictionary of custom tags and their resolved values. Custom tags serve as placeholders in the paywall content, dynamically replaced with specific strings for personalized content within the paywall. Refer to Custom tags in paywall builder topic for more details. |
| CustomTimers | optional | Define a dictionary of custom timers and their end dates. Custom timers allow you to display countdown timers in your paywall. |
If you are using multiple languages, learn how to add a Paywall Builder localization and how to use locale codes correctly here.
Once you have successfully loaded the paywall and its view configuration, you can present it in your mobile app.
Customize assets
To customize images and videos in your paywall, implement the custom assets.
Hero images and videos have predefined IDs: hero_image and hero_video. In a custom asset bundle, you target these elements by their IDs and customize their behavior.
For other images and videos, you need to set a custom ID in the Adapty dashboard.
For example, you can:
- Show a different image or video to some users.
- Show a local preview image while a remote main image is loading.
- Show a preview image before running a video.
To use this feature, update the Adapty Unity SDK to version 3.8.0 or higher.
Here's an example of how you can provide custom assets via a simple dictionary:
var customAssets = new Dictionary<string, AdaptyCustomAsset>
{
{ "custom_image", AdaptyCustomAsset.LocalImageFile("custom_assets/images/custom_image.png") },
{ "hero_video", AdaptyCustomAsset.LocalVideoFile("custom_assets/videos/custom_video.mp4") }
};
var parameters = new AdaptyUICreatePaywallViewParameters()
.SetCustomAssets(customAssets)
.SetLoadTimeout(new TimeSpan(0, 0, 3));
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
// handle the result
});
If an asset is not found, the paywall will fall back to its default appearance.
Set up developer-defined timers
To use custom timers in your Unity app, you can pass a dictionary of timer IDs and their end dates directly to the SetCustomTimers method. Here is an example:
var customTimers = new Dictionary<string, DateTime> {
{ "CUSTOM_TIMER_6H", DateTime.Now.AddHours(6) },
{ "CUSTOM_TIMER_NY", new DateTime(2025, 1, 1) }
};
var parameters = new AdaptyUICreatePaywallViewParameters()
.SetCustomTimers(customTimers)
.SetLoadTimeout(new TimeSpan(0, 0, 3));
AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
// handle the result
});
In this example, CUSTOM_TIMER_NY and CUSTOM_TIMER_6H are the Timer IDs of developer-defined timers you set in the Adapty Dashboard. The timer resolver ensures your app dynamically updates each timer with the correct value. For example:
CUSTOM_TIMER_NY: The time remaining until the timer's end, such as New Year's Day.CUSTOM_TIMER_6H: The time left in a 6-hour period that started when the user opened the paywall.
Speed up paywall fetching with default audience paywall
Typically, paywalls are fetched almost instantly, so you don't need to worry about speeding up this process. However, in cases where you have numerous audiences and paywalls, and your users have a weak internet connection, fetching a paywall may take longer than you'd like. In such situations, you might want to display a default paywall to ensure a smooth user experience rather than showing no paywall at all.
To address this, you can use the GetPaywallForDefaultAudience method, which fetches the paywall of the specified placement for the All Users audience. However, it's crucial to understand that the recommended approach is to fetch the paywall by the getPaywall method, as detailed in the Fetch Paywall section above.
Consider using GetPaywall instead of GetPaywallForDefaultAudience, as the latter has important limitations:
- Compatibility issues: May create problems when supporting multiple app versions, requiring either backward-compatible designs or accepting that older versions might display incorrectly.
- No personalization: Only shows content for the "All Users" audience, removing targeting based on country, attribution, or custom attributes.
If faster fetching outweighs these drawbacks for your use case, use GetPaywallForDefaultAudience as shown below. Otherwise, use GetPaywall as described above.
Adapty.GetPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", (paywall, error) => {
if(error != null) {
// handle the error
return;
}
// paywall - the resulting object
});
Parameters:
| Parameter | Presence | Description |
|---|---|---|
| placementId | required | The identifier of the desired Placement. This is the value you specified when creating a placement in the Adapty Dashboard. |
| locale | optional default: | The identifier of the paywall localization. This parameter is expected to be a language code composed of one or two subtags separated by the minus (-) character. The first subtag is for the language, the second one is for the region. Example: |
| fetchPolicy | default: .reloadRevalidatingCacheData | By default, SDK will try to load data from the server and will return cached data in case of failure. We recommend this option because it ensures your users always get the most up-to-date data. However, if you believe your users deal with unstable internet, consider using Note that the cache remains intact upon restarting the app and is only cleared when the app is reinstalled or through manual cleanup. Adapty SDK stores paywalls locally in two layers: regularly updated cache described above and fallback paywalls. We also use CDN to fetch paywalls faster and a stand-alone fallback server in case the CDN is unreachable. This system is designed to make sure you always get the latest version of your paywalls while ensuring reliability even in cases where internet connection is scarce. |