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_install
  • app_launch
  • deepLink_open
  • session_start
  • paywall_decline
  • transaction_fail
  • transaction_abandon
  • survey_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 NameActionParameters
adServicesTokenRequest_completeWhen the AdServices token request finishes.["token": String]
adServicesTokenRequest_failWhen the AdServices token request fails.["error_message": String]
adServicesTokenRequest_startWhen the AdServices token request starts.None
app_closeAnytime the app leaves the foreground.Same as app_install
app_installWhen the SDK is configured for the first time.["is_superwall": true, "app_session_id": String, "using_purchase_controller": Bool]
app_launchWhen the app is launched from a cold start.Same as app_install
app_openAnytime the app enters the foreground.Same as app_install
attribution_matchWhen install attribution is resolved or fails to resolve.["provider": String, "matched": Bool, "source": String?, "confidence": String?, "match_score": Double?, "reason": String?]
config_attributesWhen the attributes affecting Superwall's configuration are set or changed.The SDK configuration options + ["using_purchase_controller": Bool, "has_delegate": Bool]
config_failWhen the Superwall configuration fails to be retrieved.["error_message": String]
config_refreshWhen the Superwall configuration is refreshed.["config_build_id": String, "retry_count": Int, "cache_status": String, "fetch_duration": Double]
confirm_all_assignmentsWhen all experiment assignments are confirmed.None
custom_placementWhen the user taps on an element in the paywall that has a custom_placement action.["name": String, "params": [String: Any], "paywallInfo": PaywallInfo]
customerInfo_didChangeWhen the user's customer info changes.["from": String, "to": String] (JSON snapshots of the entitlements before and after the change)
deepLink_openWhen 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_attributesWhen 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_completeWhen the enrichment request completes.user_<key> and device_<key> entries for each returned enrichment value
enrichment_failWhen the enrichment request fails.None
enrichment_startWhen the enrichment request starts.None
first_seenWhen the user is first seen in the app, regardless of login status.Same as app_install
freeTrial_startWhen a user completes a transaction for a subscription product with an introductory offer.Same as subscription_start
identity_aliasWhen the user's identity aliases after calling identify.None
integration_attributesWhen the integration attributes are set.The provided integration attributes
networkDecoding_failWhen a response from the network fails to decode.["request_url": String, "response": String]
nonRecurringProduct_purchaseWhen the user purchases a non-recurring product.Same as subscription_start
paywall_closeWhen 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_declineWhen a user manually dismisses a paywall.Same as paywall_close
paywall_openWhen a paywall is opened.Same as paywall_close
paywall_page_viewWhen 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?]
paywallPresentationRequestWhen 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_completeWhen paywall preloading completes.["paywall_count": Int]
paywallPreload_startWhen paywall preloading starts.["paywall_count": Int]
paywallProductsLoad_completeWhen the request to load a paywall's products completes.Same as paywallResponseLoad_start
paywallProductsLoad_failWhen the request to load a paywall's products fails.Same as paywallResponseLoad_start
paywallProductsLoad_missingProductsWhen some of the paywall's products are missing from the store.Same as paywallResponseLoad_start
paywallProductsLoad_retryWhen the request to load a paywall's products fails and is being retried.["triggeredPlacementName": String?, "paywallInfo": PaywallInfo, "attempt": Int]
paywallProductsLoad_startWhen the request to load a paywall's products starts.Same as paywallResponseLoad_start
paywallResourceLoad_failWhen a resource on the paywall's webpage fails to load (Android only).["url": String, "error": String]
paywallResponseLoad_completeWhen a paywall request to Superwall's servers completes.Same as paywallResponseLoad_start
paywallResponseLoad_failWhen a paywall request to Superwall's servers fails.Same as paywallResponseLoad_start
paywallResponseLoad_notFoundWhen a paywall request returns a 404 error.Same as paywallResponseLoad_start
paywallResponseLoad_startWhen a paywall request to Superwall's servers has started.Same as app_install + ["is_triggered_from_event": Bool]
paywallWebviewLoad_completeWhen a paywall's webpage completes loading.Same as paywall_close
paywallWebviewLoad_failWhen a paywall's webpage fails to load.Same as paywall_close
paywallWebviewLoad_fallbackWhen a paywall's webpage fails and loads a fallback version.Same as paywall_close
paywallWebviewLoad_startWhen a paywall's webpage begins to load.Same as paywall_close
paywallWebviewLoad_timeoutWhen the loading of a paywall's webpage times out.Same as paywall_close
paywallWebviewLoad_processTerminatedWhen the paywall's web view content process terminates.Same as paywall_close
permission_deniedWhen a permission is denied after being requested from a paywall.["permission_name": String, "paywall_identifier": String]
permission_grantedWhen a permission is granted after being requested from a paywall.["permission_name": String, "paywall_identifier": String]
permission_requestedWhen a permission is requested from a paywall.["permission_name": String, "paywall_identifier": String]
redemption_completeWhen the redemption of a code completes.["type": String, "code": String?]
redemption_failWhen the redemption of a code fails.["type": String, "code": String?]
redemption_startWhen the redemption of a code is initiated.["type": String, "code": String?]
resetWhen Superwall.reset() is called.None
restore_completeWhen a restore completes successfully.Same as paywall_close
restore_failWhen a restore fails.Same as paywall_close + ["error_message": String]
restore_startWhen a restore is initiated.Same as paywall_close
review_requestedWhen a review is requested from the user.["count": Int, "type": String]
session_startWhen the app is opened after at least 60 minutes since last app_close.Same as app_install
shimmerView_completeWhen the shimmer view stops showing.["paywall_id": String, "visible_duration": Double]
shimmerView_startWhen the shimmer view starts showing.["paywall_id": String]
stripeCheckout_completeWhen a Stripe checkout session completes.Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool]
stripeCheckout_failWhen a Stripe checkout session fails.Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool]
stripeCheckout_startWhen a Stripe checkout session starts.Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool]
stripeCheckout_submitWhen a Stripe checkout form is submitted.Same as paywall_close + ["store": "STRIPE", "product_identifier": String, "is_triggered_from_event": Bool]
subscription_startWhen 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_didChangeWhen a user's subscription status changes.["is_superwall": true, "app_session_id": String, "subscription_status": String]
survey_closeWhen the user chooses to close a survey instead of responding.None
survey_responseWhen 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_openWhen the test mode modal is opened.None
testModeModal_closeWhen the test mode modal is closed.["free_trial_override": String] + entitlement_<id>_state and entitlement_<id>_offer_type for each entitlement
touches_beganWhen the user touches the app's UIWindow for the first time (if tracked by a campaign).Same as app_install
transaction_abandonWhen the user cancels a transaction.Same as subscription_start
transaction_completeWhen 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_failWhen the payment sheet fails to complete a transaction (ignores user cancellation).Same as subscription_start + ["message": String]
transaction_restoreWhen the user successfully restores their purchases.Same as subscription_start
transaction_startWhen the payment sheet is displayed to the user.Same as subscription_start
transaction_timeoutWhen the transaction takes longer than 5 seconds to display the payment sheet.["paywallInfo": PaywallInfo]
trigger_fireWhen 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_attributesWhen 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?