# Changelog

Release notes for the Superwall Expo SDK

Changelog [#changelog]

1.1.3 [#113]

Patch Changes [#patch-changes]

* a8ba5af: Add localResources resolving for expo

1.1.2 [#112]

Patch Changes [#patch-changes-1]

* a03889a: Ensure register callbacks resolve properly in all cases
* 09f7538: Bump Android & iOS versions

1.1.1 [#111]

Patch Changes [#patch-changes-2]

* b136375: Update Android version, resolve ANR when used without provider

1.1.0 [#110]

Minor Changes [#minor-changes]

* 0c3396d: Bump native SDKs and expose new APIs.

  **iOS — SuperwallKit 4.14.1 → 4.15.1**

  * New `paywallPageView` event for multi-page paywall navigation tracking (with `PageViewData` payload).
  * `PaywallInfo.presentationId` is now bridged so events within a single presentation can be correlated.
  * Custom store products are fully bridged: `Product` now carries `store` (`APP_STORE` | `STRIPE` | `PADDLE` | `PLAY_STORE` | `SUPERWALL` | `CUSTOM` | `OTHER`) plus per-store identifier objects (`appStoreProduct`, `stripeProduct`, `paddleProduct`, `customProduct`). `onPurchase` also receives `store` so JS can route `CUSTOM` products to its own purchase logic instead of StoreKit.

  **Android — Superwall-Android 2.7.11 → 2.7.12**

  * Bridges the new `customerInfo` field on `PaywallInfo` (subscriptions, non-subscriptions, entitlements, userId).
  * Picks up new intro-offer eligibility logic for Stripe/Paddle products and bottom-sheet dismiss fix on newer Samsung devices.

1.0.11 [#1011]

Patch Changes [#patch-changes-3]

* 975de31: Add android 'consume' method
* 2204ee8: Bump Android version

1.0.10 [#1010]

Patch Changes [#patch-changes-4]

* 9d23138: Replace any in getPresentation result, improve chaining on delegate

1.0.9 [#109]

Patch Changes [#patch-changes-5]

* 836249d: Fix `useSuperwallEvents` so non-interactive Superwall callbacks are not dropped on first app launch before React listeners mount.

1.0.8 [#108]

Patch Changes [#patch-changes-6]

* d0f5d72: Bump Android SDK version
* 9c51c45: Bump iOS SDK to 4.14.1

1.0.7 [#107]

Patch Changes [#patch-changes-7]

* 6a8fea6: Fix compat event decoding for `paywallPreloadStart`.

1.0.6 [#106]

Patch Changes [#patch-changes-8]

* a343340: Prevent `configure()` from settling its Expo promise more than once during
  native setup on iOS and Android. This avoids crashes such as
  `PromiseAlreadySettledException` if the native SDK completion handler is
  invoked more than once.

1.0.5 [#105]

Patch Changes [#patch-changes-9]

* 49ef4ff: Add `appstackId` integration attribute to `setIntegrationAttributes()` for Appstack integration support.
* 49ef4ff: Fix `setUserAttributes` silently failing when JavaScript attribute values are
  `null` by making the bridge value types nullable on iOS and Android, and update
  TypeScript signatures to explicitly allow nullable user attribute values.
* 7c53e77: Update Android, add appstack integration id

1.0.4 [#104]

Patch Changes [#patch-changes-10]

* Update Android & iOS SDK, add TestMode support, fix undefined in attributes

1.0.3 [#103]

Patch Changes [#patch-changes-11]

* Update Android & iOS SDKs, add Custom callbacks
* Update Android to 2.7.2, fixing experimental properties option

1.0.2 [#102]

Patch Changes [#patch-changes-12]

* Bump SuperwallKit iOS to 4.12.9
* Bump Superwall Android SDK to 2.6.8
* Add `introOfferToken` property to `StoreProduct`.
* Add missing SuperwallEvents: `paywallWebviewProcessTerminated`, `paywallProductsLoadMissingProducts`, `networkDecodingFail`, `customerInfoDidChange`, `integrationAttributes`, `reviewRequested`, `permissionRequested`, `permissionGranted`, `permissionDenied`, `paywallPreloadStart`, `paywallPreloadComplete`.

1.0.1 [#101]

Patch Changes [#patch-changes-13]

* a165d76: Bump superwall-android to 2.6.7
* a165d76: Bump SuperwallKit iOS to 4.12.3
* d96b449: Bridged android back button reroute handler

1.0.0 [#100]

Major Changes [#major-changes]

* 197c0c8: Add missing SDK configuration options from native iOS and Android SDKs:

  * `shouldObservePurchases` (iOS & Android): Observe purchases made outside of Superwall
  * `shouldBypassAppTransactionCheck` (iOS only): Disables app transaction check on SDK launch
  * `maxConfigRetryCount` (iOS only): Number of retry attempts for config fetch (default: 6)
  * `useMockReviews` (Android only): Enable mock review functionality

  Also fixes `enableExperimentalDeviceVariables` not being passed to the Android native SDK.

  **Breaking change**: Removed deprecated `collectAdServicesAttribution` option (AdServices attribution is now collected automatically by the native iOS SDK).

0.8.1 [#081]

Patch Changes [#patch-changes-14]

* ec326e8: bump ios to 4.10.6

0.8.0 [#080]

Minor Changes [#minor-changes-1]

* 0fcbf57: hotfix web2app redemption by disabling shouldShowWebPurchaseConfirmationAlert per default

Patch Changes [#patch-changes-15]

* 5768d51: expose shouldShowWebPurchaseConfirmationAlert option

0.7.2 [#072]

Patch Changes [#patch-changes-16]

* 5e2491a: improve event listens to always subscribe no matter what

0.7.1 [#071]

Patch Changes [#patch-changes-17]

* bab902d: fix compat android serialziaiton

0.7.0 [#070]

Minor Changes [#minor-changes-2]

* 183a7d2: feat: comprehensive error handling for SDK configuration failures

  Added robust error handling to prevent apps from hanging indefinitely when SDK configuration fails (e.g., during offline scenarios). This introduces three new ways for developers to handle configuration errors:

  **New Features:**

  * Added `configurationError` state to store for programmatic error access
  * Added `onConfigurationError` callback prop to `SuperwallProvider` for error tracking/analytics
  * Added `SuperwallError` component for declarative error UI rendering
  * Listen to native `configFail` events to capture configuration failures
  * Improved `SuperwallLoading` and `SuperwallLoaded` to respect error states

  **Breaking Changes:** None - all changes are backward compatible

  **Fixes:**

  * Fixed app hanging in loading state when offline or configuration fails
  * Fixed unhandled promise rejections in deep link initialization
  * Fixed loading state not resetting on configuration failure

  Developers can now gracefully handle offline scenarios and provide better UX when SDK initialization fails.

Patch Changes [#patch-changes-18]

* 4e246c9: fix: resolve Android handleDeepLink promise consistently with iOS

  Fixed Android crash on app launch caused by "Not a superwall link" error. The Android implementation now resolves the handleDeepLink promise with a boolean value (matching iOS behavior) instead of rejecting it for non-Superwall links. This prevents unhandled promise rejections that were causing production app crashes.

  Additionally added error handling in TypeScript as a safety net for any future edge cases.

* 4e246c9: fix: filter our expo specific deeplinks

0.6.11 [#0611]

Patch Changes [#patch-changes-19]

* ed77ab7: fix: filter our expo specific deeplinks

0.6.10 [#0610]

Patch Changes [#patch-changes-20]

* 2e2fc96: fix: compat products when empty crashing

0.6.9 [#069]

Patch Changes [#patch-changes-21]

* 7f28aa0: bump kotlin to 2.6.4
* ec246be: Added integration attributes support for third-party platforms

0.6.8 [#068]

Patch Changes [#patch-changes-22]

* f70ebe4: Fix undefined being returned for PaywallResult

0.6.7 [#067]

Patch Changes [#patch-changes-23]

* 02a9d2d: add missing productIdentifier to RedmeptionPaywallInfo

0.6.6 [#066]

Patch Changes [#patch-changes-24]

* 9c5a9a5: bump ios to 4.10.1

0.6.5 [#065]

Patch Changes [#patch-changes-25]

* e4c6aec: add getEntitlements to useUser hook

0.6.4 [#064]

Patch Changes [#patch-changes-26]

* fedde41: fix: compat superwall options on android

0.6.3 [#063]

Patch Changes [#patch-changes-27]

* 0278ad4: bump ios to 4.10.0. This fixes missing localization for app2web restore flow

0.6.2 [#062]

Patch Changes [#patch-changes-28]

* 72519cd: remove unused expo plugin

0.6.1 [#061]

Patch Changes [#patch-changes-29]

* 7920773: fix(android): handle nullable properties in RedemptionResult JSON serialization

  Fixed a Kotlin compilation error where nullable properties (`variantId`, `experimentId`, `productIdentifier`) were being assigned directly to a Map\<String, Any>. Now using the null-safe let operator to conditionally add these properties only when they have values.

0.6.0 [#060]

Minor Changes [#minor-changes-3]

* b816292: # Custom Purchase Controller API Improvement

  Changed `CustomPurchaseControllerContext` return types from `Promise<PurchaseResult | undefined>` to `Promise<PurchaseResult | void>` for cleaner success handling.

  Now you can simply not return anything for success instead of `return undefined`:

  ```tsx
  import Purchases, { PURCHASES_ERROR_CODE } from "react-native-purchases";

  <CustomPurchaseControllerProvider
    controller={{
      onPurchase: async (params) => {
        try {
          const products = await Purchases.getProducts([params.productId]);
          const product = products[0];

          if (!product) {
            return { type: "failed", error: "Product not found" };
          }

          await Purchases.purchaseStoreProduct(product);
          // Success - no return needed ✨
        } catch (error: any) {
          if (error.code === PURCHASES_ERROR_CODE.PURCHASE_CANCELLED_ERROR) {
            return { type: "cancelled" };
          }
          return { type: "failed", error: error.message };
        }
      },

      onPurchaseRestore: async () => {
        try {
          await Purchases.restorePurchases();
          // Success - no return needed ✨
        } catch (error: any) {
          return { type: "failed", error: error.message };
        }
      },
    }}
  >
    {/* Your app */}
  </CustomPurchaseControllerProvider>;
  ```

Patch Changes [#patch-changes-30]

* acb9956: feature: add StoreProduct Type to exports

0.5.1 [#051]

Patch Changes [#patch-changes-31]

* 889aaf7: fix: improve custom purchase type handling
* 56a72c9: Bump Android version to 2.6.3
* 465a215: Exposes Product identifier in Redemption Info

0.5.0 [#050]

Minor Changes [#minor-changes-4]

* 8c2c14f: User identification and attribute operations are now non-blocking async calls, preventing UI freezes while ensuring proper state synchronization

  Thanks to @gursheyss for the PR #90

0.4.1 [#041]

Patch Changes [#patch-changes-32]

* 86a3b28: Update Android version to 2.6.1 adding app2web support
* 6df6cc4: Adds paddle store identifiers

0.4.0 [#040]

Minor Changes [#minor-changes-5]

* 6d3e625: bump ios to fix critical webview bug

0.3.2 [#032]

Patch Changes [#patch-changes-33]

* 5555e8e: make error handling more defensive

0.3.1 [#031]

Patch Changes [#patch-changes-34]

* 4a3f540: fix: compat typeissues

0.3.0 [#030]

Minor Changes [#minor-changes-6]

* 9ed73eb: feat: improve error handling of Custom Purchase Controller

0.2.9 [#029]

Patch Changes [#patch-changes-35]

* bd460a7: Expose signature in android StoreTransaction
* e9eeff8: Expose appAcounttoken and purchaseToken on Android StoreTransaction

0.2.8 [#028]

Patch Changes [#patch-changes-36]

* e0b57bc: fix(compat): none nullable access
* 314be3c: bump deps

0.2.7 [#027]

Patch Changes [#patch-changes-37]

* adccfe4: Update Android SDK to 2.5.4 and iOS to 4.8.2

0.2.6 [#026]

Patch Changes [#patch-changes-38]

* 10bb039: force release?

0.2.5 [#025]

Patch Changes [#patch-changes-39]

* 95636a6: Bump internal android sdk to 2.5.1

0.2.4 [#024]

Patch Changes [#patch-changes-40]

* c274e6a: Add typed SuperwallOptions and fix mispelled option name

0.2.3 [#023]

Patch Changes [#patch-changes-41]

* f9372f1: Exposes StoreTransaction in /compat

0.2.2 [#022]

Patch Changes [#patch-changes-42]

* 3f832c7: Updates Android SDK to 2.3.2

0.2.1 [#021]

Patch Changes [#patch-changes-43]

* 4327c59: expose internal types

0.2.0 [#020]

Minor Changes [#minor-changes-7]

* 3b58ea4: Updates Android SDK to 2.3.1 (with Google Play Billing library 7)

0.1.3 [#013]

Patch Changes [#patch-changes-44]

* d273d2a: bump expo module

0.1.2 [#012]

Patch Changes [#patch-changes-45]

* f243226: fix: type issues

0.1.1 [#011]

Patch Changes [#patch-changes-46]

* 707e513: temp fix swift types

0.1.0 [#010]

Minor Changes [#minor-changes-8]

* b39e98e: feat: Remove the export of the internal SuperwallExpoModule Class,
  this class should have not been used since it's an internal class and could break the state of the internal SuperwallStore.
  If you have used in prior for a usecase that the current SDK doesn't support, please open an issue.

Patch Changes [#patch-changes-47]

* 32112a6: feat: handle deeplink automatically, no need for manual handling

0.0.18 [#0018]

Patch Changes [#patch-changes-48]

* 3a93b2b: feat: fix inital loading state

0.0.17 [#0017]

Patch Changes [#patch-changes-49]

* db980b6: fix missing types on native

0.0.16 [#0016]

Patch Changes [#patch-changes-50]

* e19e626: require Expo 53+

0.0.15 [#0015]

Patch Changes [#patch-changes-51]

* 020c22a: fix: old exports

0.0.14 [#0014]

Patch Changes [#patch-changes-52]

* 6153163: mark things as internal
* 6fbaa94: add types to TransactionProductIdentifier

0.0.13 [#0013]

Patch Changes [#patch-changes-53]

* 2ead245: feat: add getDeviceAttributes
* efbd9d5: feat: add getDeviceAttributes to ios

0.0.12 [#0012]

Patch Changes [#patch-changes-54]

* 4751b75: Fixes issues with identify on Android, updates Android SDK to 2.2.3

0.0.11 [#0011]

Patch Changes [#patch-changes-55]

* 9c053b3: feat: add experimentalDeviceVariables for ios

0.0.10 [#0010]

Patch Changes [#patch-changes-56]

* d5beb70: fix(compat): subscription event emitter not firing

0.0.9 [#009]

Patch Changes [#patch-changes-57]

* 67edd16: feat: export internal SuperwallExpoModule for advance usage

0.0.8 [#008]

Patch Changes [#patch-changes-58]

* 0175478: feat: set subscription status to UNKNOWN on startup
* d8390ab: feat: bump ios SDK version

0.0.7 [#007]

Patch Changes [#patch-changes-59]

* f5a1d9a: fix: signout state changes
* 4df7557: fix: ios getSubscriptionStatus

0.0.6 [#006]

Patch Changes [#patch-changes-60]

* fc22062: fix: android getSubscriptionStatus returning undefined

0.0.5 [#005]

Patch Changes [#patch-changes-61]

* 8f4d758: fix compat subscriptionStatus access failing
* 9d98a30: fix: android sdk version not being passed correctly

0.0.4 [#004]

Patch Changes [#patch-changes-62]

* eb98aeb: feat: add ability to use CustomPurchaseController

  Just wrap your app with CustomPurchaseControllerProvider and pass your own handler functions to it.
  It will await the result of these handler functions to continue the purchase/restore flow.

  ```tsx
  <CustomPurchaseControllerProvider
    controller={{
      onPurchase: async (params) => {
        // Set stuff in ur system here
        if (params.platform === "ios") {
          console.log("onPurchase", params);
        } else {
          console.log("onPurchase", params.productId);
        }
        return;
      },
      onPurchaseRestore: async () => {
        console.log("onPurchaseRestore");
        // Set stuff in ur system here
        return;
      },
    }}
  >
    <SuperwallProvider apiKeys={{ ios: API_KEY }}>
      <SuperwallLoading>
        <ActivityIndicator style={{ flex: 1 }} />
      </SuperwallLoading>
      <SuperwallLoaded>
        <ScreenContent />
      </SuperwallLoaded>
    </SuperwallProvider>
  </CustomPurchaseControllerProvider>
  ```

0.0.3 [#003]

Patch Changes [#patch-changes-63]

* 72d9879: fix: adding ability to let superwall manage subscriptions

0.0.2 [#002]

Patch Changes [#patch-changes-64]

* 8914f05: Initialize new experimental Hook based SDK.

0.0.1 [#001]

Patch Changes [#patch-changes-65]

* 0cd5243: Inital Release
* 0cd5243: Change Delegate class to normal class from abstract

Unpublished [#unpublished]

🛠 Breaking changes [#-breaking-changes]

🎉 New features [#-new-features]

🐛 Bug fixes [#-bug-fixes]

💡 Others [#-others]