Superwall Events
The SDK automatically tracks some events, which power the charts in the dashboard.
We encourage you to track them in your own analytics as described in 3rd Party Analytics.
The following Superwall events can be used as placements to present paywalls:
app_installapp_launchdeepLink_opensession_startpaywall_declinetransaction_failtransaction_abandonsurvey_response
For more info about how to use these, check out how to add them using a Placement.
The full list of events is as follows:
| Event Name | Action | Parameters |
|---|---|---|
adServicesTokenRequest_complete | When the AdServices token request finishes. | ["token": String] |
adServicesTokenRequest_fail | When the AdServices token request fails. | ["error_message": String] |
adServicesTokenRequest_start | When the AdServices token request starts. | None |
app_close | Anytime the app leaves the foreground. | Same as app_install |
app_install | When the SDK is configured for the first time. | ["is_superwall": true, "app_session_id": String, "using_purchase_controller": Bool] |
app_launch | When the app is launched from a cold start. | Same as app_install |
app_open | Anytime the app enters the foreground. | Same as app_install |
attribution_match | When install attribution is resolved or fails to resolve. | ["provider": String, "matched": Bool, "source": String?, "confidence": String?, "match_score": Double?, "reason": String?] |
config_attributes | When the attributes affecting Superwall's configuration are set or changed. | The SDK configuration options + ["using_purchase_controller": Bool, "has_delegate": Bool] |
config_fail | When the Superwall configuration fails to be retrieved. | ["error_message": String] |
config_refresh | When the Superwall configuration is refreshed. | ["config_build_id": String, "retry_count": Int, "cache_status": String, "fetch_duration": Double] |
confirm_all_assignments | When all experiment assignments are confirmed. | None |
custom_placement | When the user taps on an element in the paywall that has a custom_placement action. | ["name": String, "params": [String: Any], "paywallInfo": PaywallInfo] |
customerInfo_didChange | When the user's customer info changes. | ["from": String, "to": String] (JSON snapshots of the entitlements before and after the change) |
deepLink_open | When a user opens the app via a deep link. | ["url": String, "path": String", "pathExtension": String, "lastPathComponent": String, "host": String, "query": String, "fragment": String] + any query parameters in the deep link URL |
device_attributes | When device attributes are sent to the backend every session. | Includes app_session_id, app_version, os_version, device_model, device_locale, and various hardware/software details. |
enrichment_complete | When the enrichment request completes. | user_<key> and device_<key> entries for each returned enrichment value |
enrichment_fail | When the enrichment request fails. | None |
enrichment_start | When the enrichment request starts. | None |
first_seen | When the user is first seen in the app, regardless of login status. | Same as app_install |
freeTrial_start | When a user completes a transaction for a subscription product with an introductory offer. | Same as subscription_start |
identity_alias | When the user's identity aliases after calling identify. | None |
integration_attributes | When the integration attributes are set. | The provided integration attributes |
networkDecoding_fail | When a response from the network fails to decode. | ["request_url": String, "response": String] |
nonRecurringProduct_purchase | When the user purchases a non-recurring product. | Same as subscription_start |
paywall_close | When a paywall is closed (either manually or after a transaction succeeds). | [“paywall_webview_load_complete_time”: String?, “paywall_url”: String, “paywall_response_load_start_time”: String?, “paywall_products_load_fail_time”: String?, “secondary_product_id”: String, “feature_gating”: Int, “paywall_response_load_complete_time”: String?, “is_free_trial_available”: Bool, “is_superwall”: true, “presented_by”: String, “paywall_name”: String, “paywall_response_load_duration”: String?, “paywall_identifier”: String, “paywall_webview_load_start_time”: String?, “paywall_webview_load_duration”: String?, “paywall_products_load_complete_time”: String?, “paywall_products_load_duration”: String?, “paywall_product_ids”: String, “tertiary_product_id”: String, “paywall_id”: String, “app_session_id”: String, “paywall_products_load_start_time”: String?, “primary_product_id”: String, “survey_attached”: Bool, “survey_presentation”: String?, “presentation_id”: String?, “close_reason”: String, “cache_key”: String, “build_id”: String, “is_scroll_enabled”: Bool, “intro_offer_eligibility”: String, “shimmerView_load_start_time”: String, “shimmerView_load_complete_time”: String] |
paywall_decline | When a user manually dismisses a paywall. | Same as paywall_close |
paywall_open | When a paywall is opened. | Same as paywall_close |
paywall_page_view | When a user views a page in a multi-page paywall (including the first page). | Same as paywall_close + ["page_node_id": String, "flow_position": Int, "page_name": String, "navigation_node_id": String, "navigation_type": String, "previous_page_node_id": String?, "previous_flow_position": Int?, "time_on_previous_page_ms": Int?] |
paywallPresentationRequest | When something happened during the paywall presentation, whether a success or failure. | [“source_event_name”: String, “status”: String, “is_superwall”: true, “app_session_id”: String, “pipeline_type”: String, “status_reason”: String] |
paywallPreload_complete | When paywall preloading completes. | ["paywall_count": Int] |
paywallPreload_start | When paywall preloading starts. | ["paywall_count": Int] |
paywallProductsLoad_complete | When the request to load a paywall's products completes. | Same as paywallResponseLoad_start |
paywallProductsLoad_fail | When the request to load a paywall's products fails. | Same as paywallResponseLoad_start |
paywallProductsLoad_missingProducts | When some of the paywall's products are missing from the store. | Same as paywallResponseLoad_start |
paywallProductsLoad_retry | When the request to load a paywall's products fails and is being retried. | ["triggeredPlacementName": String?, "paywallInfo": PaywallInfo, "attempt": Int] |
paywallProductsLoad_start | When the request to load a paywall's products starts. | Same as paywallResponseLoad_start |
paywallResourceLoad_fail | When a resource on the paywall's webpage fails to load (Android only). | ["url": String, "error": String] |
paywallResponseLoad_complete | When a paywall request to Superwall's servers completes. | Same as paywallResponseLoad_start |
paywallResponseLoad_fail | When a paywall request to Superwall's servers fails. | Same as paywallResponseLoad_start |
paywallResponseLoad_notFound | When a paywall request returns a 404 error. | Same as paywallResponseLoad_start |
paywallResponseLoad_start | When a paywall request to Superwall's servers has started. | Same as app_install + ["is_triggered_from_event": Bool] |
paywallWebviewLoad_complete | When a paywall's webpage completes loading. | Same as paywall_close |
paywallWebviewLoad_fail | When a paywall's webpage fails to load. | Same as paywall_close |
paywallWebviewLoad_fallback | When a paywall's webpage fails and loads a fallback version. | Same as paywall_close |
paywallWebviewLoad_start | When a paywall's webpage begins to load. | Same as paywall_close |
paywallWebviewLoad_timeout | When the loading of a paywall's webpage times out. | Same as paywall_close |
paywallWebviewLoad_processTerminated | When the paywall's web view content process terminates. | Same as paywall_close |
permission_denied | When a permission is denied after being requested from a paywall. | ["permission_name": String, "paywall_identifier": String] |
permission_granted | When a permission is granted after being requested from a paywall. | ["permission_name": String, "paywall_identifier": String] |
permission_requested | When a permission is requested from a paywall. | ["permission_name": String, "paywall_identifier": String] |
redemption_complete | When the redemption of a code completes. | ["type": String, "code": String?] |
redemption_fail | When the redemption of a code fails. | ["type": String, "code": String?] |
redemption_start | When the redemption of a code is initiated. | ["type": String, "code": String?] |
reset | When Superwall.reset() is called. | None |
restore_complete | When a restore completes successfully. | Same as paywall_close |
restore_fail | When a restore fails. | Same as paywall_close + ["error_message": String] |
restore_start | When a restore is initiated. | Same as paywall_close |
review_requested | When a review is requested from the user. | ["count": Int, "type": String] |
session_start | When the app is opened after at least 60 minutes since last app_close. | Same as app_install |
shimmerView_complete | When the shimmer view stops showing. | ["paywall_id": String, "visible_duration": Double] |
shimmerView_start | When the shimmer view starts showing. | ["paywall_id": String] |
stripeCheckout_complete | When a Stripe checkout session completes. | Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool] |
stripeCheckout_fail | When a Stripe checkout session fails. | Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool] |
stripeCheckout_start | When a Stripe checkout session starts. | Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool] |
stripeCheckout_submit | When a Stripe checkout form is submitted. | Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool] |
subscription_start | When a user completes a transaction for a subscription product without an introductory offer. | [“product_period_days”: String, “product_price”: String, “presentation_source_type”: String?, “paywall_response_load_complete_time”: String?, “product_language_code”: String, “product_trial_period_monthly_price”: String, “paywall_products_load_duration”: String?, “product_currency_symbol”: String, “is_superwall”: true, “app_session_id”: String, “product_period_months”: String, “presented_by_event_id”: String?, “product_id”: String, “trigger_session_id”: String, “paywall_webview_load_complete_time”: String?, “paywall_response_load_start_time”: String?, “product_raw_trial_period_price”: String, “feature_gating”: Int, “paywall_id”: String, “product_trial_period_daily_price”: String, “product_period_years”: String, “presented_by”: String, “product_period”: String, “paywall_url”: String, “paywall_name”: String, “paywall_identifier”: String, “paywall_products_load_start_time”: String?, “product_trial_period_months”: String, “product_currency_code”: String, “product_period_weeks”: String, “product_periodly”: String, “product_trial_period_text”: String, “paywall_webview_load_start_time”: String?, “paywall_products_load_complete_time”: String?, “primary_product_id”: String, “product_trial_period_yearly_price”: String, “paywalljs_version”: String?, “product_trial_period_years”: String, “tertiary_product_id”: String, “paywall_products_load_fail_time”: String?, “product_trial_period_end_date”: String, “product_weekly_price”: String, “variant_id”: String, “presented_by_event_timestamp”: String?, “paywall_response_load_duration”: String?, “secondary_product_id”: String, “product_trial_period_days”: String, “product_monthly_price”: String, “paywall_product_ids”: String, “product_locale”: String, “product_daily_price”: String, “product_raw_price”: String, “product_yearly_price”: String, “product_trial_period_price”: String, “product_localized_period”: String, “product_identifier”: String, “experiment_id”: String, “is_free_trial_available”: Bool, “product_trial_period_weeks”: String, “paywall_webview_load_duration”: String?, “product_period_alt”: String, “product_trial_period_weekly_price”: String, “presented_by_event_name”: String?] |
subscriptionStatus_didChange | When a user's subscription status changes. | ["is_superwall": true, "app_session_id": String, "subscription_status": String] |
survey_close | When the user chooses to close a survey instead of responding. | None |
survey_response | When a user responds to a paywall survey. | ["survey_selected_option_title": String, "survey_custom_response": String, "survey_id": String, "survey_assignment_key": String, "survey_selected_option_id": String] |
testModeModal_open | When the test mode modal is opened. | None |
testModeModal_close | When the test mode modal is closed. | ["free_trial_override": String] + entitlement_<id>_state and entitlement_<id>_offer_type for each entitlement |
touches_began | When the user touches the app's UIWindow for the first time (if tracked by a campaign). | Same as app_install |
transaction_abandon | When the user cancels a transaction. | Same as subscription_start |
transaction_complete | When the user completes checkout and any product is purchased. | Same as subscription_start + [“web_order_line_item_id”: String, “app_bundle_id”: String, “config_request_id”: String, “state”: String, “subscription_group_id”: String, “is_upgraded”: String, “expiration_date”: String, “trigger_session_id”: String, “original_transaction_identifier”: String, “id”: String, “transaction_date”: String, “is_superwall”: true, “store_transaction_id”: String, “original_transaction_date”: String, “app_session_id”: String] |
transaction_fail | When the payment sheet fails to complete a transaction (ignores user cancellation). | Same as subscription_start + ["message": String] |
transaction_restore | When the user successfully restores their purchases. | Same as subscription_start |
transaction_start | When the payment sheet is displayed to the user. | Same as subscription_start |
transaction_timeout | When the transaction takes longer than 5 seconds to display the payment sheet. | ["paywallInfo": PaywallInfo] |
trigger_fire | When a registered placement triggers a paywall. | [“trigger_name”: String, “trigger_session_id”: String, “variant_id”: String?, “experiment_id”: String?, “paywall_identifier”: String?, “result”: String, “unmatched_rule_<id>”: “<outcome>”]. unmatched_rule_<id> indicates why a rule (with a specfiic experiment id) didn’t match. It will only exist if the result is no_rule_match. Its outcome will either be OCCURRENCE, referring to the limit applied to a rule, or EXPRESSION. |
user_attributes | When the user attributes are set. | [“aliasId”: String, “seed”: Int, “app_session_id”: String, “applicationInstalledAt”: String, “is_superwall”: true, “application_installed_at”: String] + provided attributes |
How is this guide?
3rd Party Analytics
Previous Page
Cohorting in 3rd Party Tools
To easily view Superwall cohorts in 3rd party tools, we recommend you set user attributes based on the experiments that users are included in. You can also use custom placements for creating analytics events for actions such as interacting with an element on a paywall.