Skip to content

Releases: Purchasely/Purchasely-Android

5.7.4

04 May 10:45

Choose a tag to compare

Bug fixes

  • Anonymous → identified user transfer in Observer mode — purchases made before login are now correctly carried over to the user account on userLogin() when the SDK runs in PaywallObserver mode. Previously, receipts reported through synchronize() did not flag the user as having purchased, so the transfer step was skipped at next login.
  • Screen re-render crash — fixed IllegalStateException: The specified child already has a parent that could be thrown when a screen was rebuilt in rapid succession (orientation changes, repeated rendering). Children are now safely detached and released before being re-added.
  • Modal/Drawer flow crash — fixed an IllegalStateException raised when the modal or drawer from a Flowstate changed after the host fragment had been detached (e.g. fast back-press or activity teardown). The callback now no-ops instead of dereferencing a detached activity.

5.7.3

16 Mar 17:46

Choose a tag to compare

🐛 Bug Fixes

Flow system — process death survival

The flow system now correctly saves and restores its full navigation state when Android kills and restores the process. No more blank screens or lost navigation history after the OS reclaims memory in the background.

Flow system — purchase callback reliability

Fixed an issue where the display() callback could return CANCELLED instead of PURCHASED after a successful in-app purchase inside a multi-step flow.

Paywalls — plan picker race condition

Fixed an intermittent bug where plan picker labels could display the wrong plan's price (e.g. annual price on the monthly label) when Google Play products hadn't loaded yet.

WebView — crash on non-exported activities

Tapping a link inside a paywall WebView no longer crashes when a third-party app (e.g. OPay) registers a non-exported Activity for that URL scheme. The SDK now gracefully falls back to loading the URL in the WebView.

5.7.2

06 Mar 18:05

Choose a tag to compare

🛠️Improvements

Subscription check is now always performed

The SDK previously skipped fetching the user's subscription status in certain conditions (e.g. no expired subscriptions, no active tokens). It now always fetches subscription status when store products are available, ensuring up-to-date entitlement information.

Subscription sync in PaywallObserver mode

Fixed an issue where purchases made in PaywallObserver mode were not correctly updating the user's active subscriptions after validation. Subscription status is now reliably refreshed after every receipt verification.

Multi-step flow: progressive background darkening

When navigating through multi-step paywalls (flows), each new screen was adding its own background overlay, causing the background to become progressively darker with each step. Screens now share a single overlay, keeping the visual experience clean.

🐛 Bug Fixes

App crash on certain Android devices with system proxy

Some Android devices return an invalid system proxy configuration that could cause a crash at SDK startup. The SDK now handles this gracefully and initialises correctly regardless of the device's proxy settings.

Persistent data loss after OS cache cleanup

SDK data (active subscriptions, purchases, user data) was stored in the system cache directory, which Android or users can clear at any time. All persistent data has been moved to the app's files directory.

Multi-step flow: close callback not always fired

In some scenarios, the result callback passed to a flow presentation could fail to fire when the flow was closed. This has been fixed; the callback now reliably reports the correct outcome (purchased, restored, or cancelled) in all cases.

Rare crash in billing retry logic

A crash (DeadSystemRuntimeException) could occur during in-app purchase retries when the billing service was restarted by the OS. The SDK now handles this gracefully without crashing.

Duplicate close callback in flow + standard presentation combination

When a flow's close was pending, a standard presentation could incorrectly fire a second close callback. This double-fire has been eliminated.

5.7.1

02 Mar 16:23

Choose a tag to compare

New Features

  • Drawer-to-drawer fade animation: Navigating between two drawer steps in a flow
    now uses a smooth fade transition instead of the slide-up animation.
  • WebView Accept-Language header: The WebView opened via the NAVIGATE paywall
    action now sends the SDK's configured language as an Accept-Language HTTP header,
    so web pages respect the app's locale instead of defaulting to English.
  • Logcat decoupled from custom loggers: Custom PLYLogging loggers now receive all
    logs regardless of logLevel. The logLevel filter only gates Logcat output. New
    Purchasely.logcatEnabled flag allows disabling Logcat entirely while keeping custom
    loggers active.

Bug Fixes

  • General stability improvements: Crash fixes in the presentation display flow
    covering race conditions, timeouts, and edge cases around Activity lifecycle.
  • OkHttp downgraded 5.3.2 → 4.12.0: OkHttp 5.x caused a NoClassDefFoundError
    crash on every network request in React Native apps. Downgraded to 4.12.0 for
    cross-platform compatibility. Retrofit 3.x is unaffected.
  • Scrim fade on back-press dismiss: Dismissing a modal or drawer via the system
    back button now correctly fades out the scrim instead of sliding it down with
    the sheet.
  • SDK configured callback no longer crashes the host app: Exceptions thrown inside
    the PLYSdkConfigured callback are now caught and isolated.

5.7.0

13 Feb 14:20

Choose a tag to compare

What's Changed

⚠️ Breaking Changes

  • minSdk raised to 23 — As announced in the previous release (5.6.0), the minimum supported Android SDK version is now minSdk 23 (Android 6.0), following updates in AndroidX libraries.
    Please ensure your application is configured with minSdk 23 or higher.

✨ Features

📺 New Display API

  • Purchasely.display() method — New async API for fetching and displaying presentations in a single call, an alternative to the two-step fetch-then-display pattern
  • Transition type and height support in openPlacement — The openPlacement action now supports custom transition types and height ratios

🔗 Sequential Actions

  • Sequential action processing — Paywall actions are now processed sequentially, preventing race conditions and ensuring thread-safe execution
  • Bypass interceptor for programmatic closecloseAllScreens() now bypasses the paywall action interceptor when triggered programmatically

🎨 Flow & Presentation Enhancements

  • Non-dismissible flow modals and drawers — Flows now support non-dismissible modal and drawer transitions, blocking swipe-to-dismiss and back navigation when configured

💳 Billing

  • Google Play Billing version detection and timeout — The SDK now detects the app's Google Play Billing Library version, warns on potential v7+ conflicts, and applies a 30-second timeout to prevent indefinite blocking on version mismatches

⚡ Performance

  • Paywall rendering optimized (~25% faster) — Rendering engine improvements resulting in approximately 25% faster paywall display

📦 Version Bumps & Upgrades

  • minSdk 23
  • Kotlin 2.2.21 with K2 compiler
  • OkHttp 5.3.2, Retrofit 3.0.0
  • Coil 3.3.0
  • Media3 / ExoPlayer 1.9.0

5.6.0

04 Dec 11:06

Choose a tag to compare

🚧 Upcoming minSDK requirement

We will soon raise the minimum supported Android SDK version of Purchasely to minSdk 23 (Android 6.0), following updates in AndroidX libraries and Google Play Billing, which now also require minSdk 23.
Please ensure your application is already configured with minSdk 23, as this change will be mandatory to integrate future versions of the Purchasely SDK.
The current release still supports minSdk 21.

🚀 New Features

🧩 Bring Your Own Screen (BYOS)

Purchasely now allows you to fully design and render your own paywall or subscription screens while still benefiting from the power of the Purchasely platform.

With Bring Your Own Screen (BYOS), you can:

  • Use your own UI, your own components, and your own branding with complete freedom.
  • Keep Purchasely’s purchase handling, eligibility checks, analytics, and event tracking fully intact.
  • Seamlessly integrate your custom screen using a simple configuration and lightweight rendering contract.
  • Access all pricing information, introductory offer eligibility, and localized content to display them exactly as you want.

This feature unlocks full creative control while maintaining a robust and reliable purchase flow powered by Purchasely.

More information in our documentation

🎛️ Advanced Conditional Blocks

You now have full control over when and how UI components appear inside your Purchasely-powered screens.

With Advanced Conditional Blocks, you can dynamically display or hide components based on:

  • Introductory Offer eligibility (eligible / not eligible)
  • Audience membership (e.g., churned users, new users, high-value customers…)
  • Custom user attributes (country, language, subscription state, feature flags…)
  • User interactions with other components such as:
    • pickers
    • tabs
    • switches
    • buttons
    • and more

This allows you to build truly personalized, context-aware, and reactive screens directly from the Purchasely Console still no-code.

🛠 New Debug Screen for Developers

A brand-new Debug Screen is now available to help developers understand exactly what Purchasely is doing behind the scenes, making troubleshooting faster and integrations smoother.

You can activate it in two ways:

  • Scan the Preview Mode QR Code from the Purchasely Console
    or

  • Enable it directly in your app with:

    Purchasely.debugMode = true

Once enabled, you’ll see a powerful information overlay on top of any Purchasely screen, including:

  • Screen ID
  • Placement ID
  • Audience
  • A/B test assignment
  • SDK version
  • Anonymous user ID
  • And more to come…

This initial release lays the groundwork — future versions will expand visibility, provide richer context, and make it easier to share diagnostics with Purchasely support.

🐛 Bug Fixes

  • Fixed an issue where displaying multiple Purchasely screens simultaneously could lead to incorrect event data or inconsistent user interactions.
  • Corrected bottom content padding on devices running SDK ≥ 35 for proper UI layout.
  • Resolved inaccurate promotional offer data when using the paywall action interceptor.

📦 Dependency Updates

  • Android Gradle Plugin : 8.13.0 → 8.13.1
  • Android Library Plugin : 8.13.0 → 8.13.1
  • ZXing Core : 3.5.3 → 3.5.4

5.5.1

13 Nov 10:50

Choose a tag to compare

What's Changed

  • Resolved a visibility issue affecting web-checkout-related parameters in PLYPaywallActionParameters.
  • Performance improvements and refinements to ensure smoother integration and runtime stability.

5.5.0

07 Nov 09:33
a761530

Choose a tag to compare

What's Changed

⚠️ Important: Kotlin 2.0 Minimum

  • To compile Purchasely SDK you must use Kotlin 2.0 or higher.
  • The SDK now uses Kotlin 2.1, and we plan to upgrade to 2.2 in Q1 2026 to stay aligned with Kotlin’s frequent releases and dependency updates.

💳 Web Checkout with Stripe Support

📅 Event Tracking Enhancements

  • Improved reliability and consistency across all event tracking, especially for PRESENTATION_VIEWED.
  • Enhanced purchase event tracking with better context preservation.
  • Optimized event batching and retry logic to ensure all events are sent, even in cases of network loss or server unavailability.

⚙️ Dependency & Build Updates

  • Kotlin: 2.1.21
  • Coroutines: 1.10.2
  • Serialization: 1.8.1
  • Coil: 3.2.0
  • Media3: 1.8.0

Reference: https://docs.purchasely.com/changelog/55#/

5.4.0

19 Sep 15:57

Choose a tag to compare

What's Changed

📱 Target SDK

  • The SDK now targets API 35, ensuring compliance with the latest Google rules and guidelines.

💳 Google Billing v8 Compatibility

  • While the SDK continues to use Google Billing v7.1.1, it is now fully compatible with version 8.

🔐 GDPR & Privacy Levels

  • The SDK now offers built-in support for handling privacy levels.
  • This enables developers to adapt their user experience to different GDPR requirements and to better manage user consent directly within Purchasely.

📐 Safe Areas Handling

  • You can now choose whether Purchasely screens should respect the system’s safe areas (e.g. status bar, navigation bar).
  • This provides greater flexibility for developers who want tighter control over screen layout and presentation.

↩️ Introducing PLYCloseReason

  • When intercepting a close action, you can now identify whether it was triggered by the close button or a system back gesture.

🛠 Fixes & Improvements

  • Fixed a bug where cached presentations with placement IDs were not being properly invalidated.
  • Enhanced deeplinks handling and presentations display.
  • Fixed an Out of Memory issue in the DiagnosticManager.
  • Minor performance improvements and codebase refinements to ensure smoother integration and runtime stability.

5.3.4

13 Aug 09:51

Choose a tag to compare

Improvements

  • Invalidate presentation cache when fetching again
  • Remove deep link from queue right away when opened with the SDK
  • Start new session from background only if SDK is already started