NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Official Apphud Flutter SDK is a lightweight open-source library to manage auto-renewable subscriptions and other in-app purchases in your iOS/Android app. No backend required.
Last release today
07 Oct 2026
Ships fairly regularly
a new release about every 6 weeks
Nearly every release is documented
notes for 55 of 55 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
55 releases · first in 2021
One column per quarter.
Internal improvements to request handling
Added screenName to ApphudPaywall — the visual Screen's name from the Apphud Dashboard, on both platforms
screenName to ApphudPaywall — the visual Screen's name from the Apphud Dashboard, on both platformsApphud.setScreenPresentationStyle() for iOS Rules screensscreenName to ApphudPaywall — the name of the paywall's visual Screen from the Apphud Dashboard, populated on both platforms.Apphud.setScreenPresentationStyle() to control how Rules screens are presented (sheet or fullscreen).What's New in Flutter SDK v3.3.0:
Apphud Rules — Full Rules support for Figma rule paywalls and legacy rule screens via Apphud.setRuleListener() / ApphudRuleListener (appear, purchase, dismiss, survey, and apphudRulePaywallWithoutScreen on both platforms). Also adds Apphud.checkRules(), Apphud.pendingRule(), Apphud.showPendingRuleScreen(), plus Apphud.submitPushNotificationsToken() and Apphud.handlePushNotification() for push-triggered rules. ApphudRule now exposes screenId, paywallId, and paywallIdentifier.
Rule purchase details — apphudRulePurchaseCompleted delivers the purchased subscription / nonRenewingPurchase, the transaction on [iOS] (null for StoreKit 2 purchases) and purchase on [Android]. Failed rule purchases now report a descriptive message, errorCode, and networkIssue.
Direct & deferred deep link attribution — Added Apphud.setDeeplinkHandler() (ApphudDeeplinkAttribution with attribution, kind (direct / deferred), and url) and Apphud.requestDeferredDeeplinkAttribution().
BREAKING — Removed Apphud.attributeFromDeeplink(). Use Apphud.setDeeplinkHandler() and Apphud.requestDeferredDeeplinkAttribution() instead.
iOS deep links — Direct deep links (open url, universal links via continue userActivity, launch options) are captured automatically through the Flutter app-delegate plugin. Host AppDelegate must subclass FlutterAppDelegate and call super if those lifecycle methods are overridden. Only universal links on Apphud's aphd.cc domain are reported as handled, so other deep link SDKs (Firebase Dynamic Links, OneSignal, Branch) keep receiving their own links. Set FlutterDeepLinkingEnabled to false in Info.plist unless you intentionally route the same universal links through Flutter.
Android deep links — Forward incoming links from Activity.onCreate / onNewIntent via Apphud.handleIntent(intent) (see example app).
Example app — Rules debug actions, Android FCM / iOS APNs push token submit, deep link handling samples, and rule/deeplink listener logging.
Included Native SDK Versions — [Android] ApphudSDK-Android 3.4.2, [iOS] ApphudSDK 4.4.8.
Apphud.setRuleListener() / ApphudRuleListener for screen appear, purchase, dismiss and survey events.Apphud.checkRules(), Apphud.pendingRule(), Apphud.showPendingRuleScreen().Apphud.submitPushNotificationsToken() and Apphud.handlePushNotification() for push-triggered rules.ApphudRule exposes screenId, paywallId, and paywallIdentifier on both platforms.apphudRulePaywallWithoutScreen on both iOS and Android.apphudRulePurchaseCompleted delivers the purchased subscription / nonRenewingPurchase, the transaction (iOS, when the purchase was not made via StoreKit 2) and purchase (Android).ApphudUIDelegate (auto-perform / auto-show) and ApphudUtils.checkRules().ApphudRuleCallback passed into Apphud.start() (auto-perform / auto-show).Apphud.setDeeplinkHandler() to receive deep link attribution updates (ApphudDeeplinkAttribution with attribution, kind (direct / deferred), and url).Apphud.requestDeferredDeeplinkAttribution() to trigger deferred attribution.Apphud.attributeFromDeeplink(). Use Apphud.setDeeplinkHandler() and Apphud.requestDeferredDeeplinkAttribution() instead.open url, universal links via continue userActivity, and launch options) are captured automatically through the Flutter app delegate plugin. This requires the host AppDelegate to subclass FlutterAppDelegate and to not override those lifecycle methods without calling super. Only universal links hosted on Apphud's aphd.cc domain are consumed by the plugin, so other deep link SDKs (Firebase Dynamic Links, OneSignal, Branch) keep receiving their own links.Activity's onCreate and onNewIntent to the native SDK via Apphud.handleIntent(intent) (see the updated example app).[Android] Fixed a bug that could lead to a crash while upgrading from previous SDK versions to newer.
What's New in Flutter SDK v3.2.4:
iOS ApphudError fields fix — Errors returned from purchase, purchaseProduct, purchasePromo, restorePurchases, loadFallbackPaywalls, and showPaywall now expose networkIssue and errorCode on the Flutter side (not just message). Previously these fields were always false / null on iOS, so offline/network failures could not be detected from Dart (e.g. show cached paywalls when purchase fails with no internet).
iOS fetchPlacements error forwarding — fetchPlacements now forwards native errors to Flutter via ApphudPlacements.error, matching Android behavior. Errors include networkIssue and errorCode when applicable.
Included Native SDK Versions — [Android] ApphudSDK-Android 3.2.5, [iOS] ApphudSDK 4.2.3.
ApphudError returned from purchase, purchaseProduct, purchasePromo, restorePurchases, loadFallbackPaywalls, showPaywall and fetchPlacements now exposes networkIssue and errorCode instead of only message. Previously these fields always came as false / null on iOS, making it impossible to detect offline/network failures from Flutter.fetchPlacements now forwards native errors to Flutter (matching Android behavior).What's New in Flutter SDK v3.2.3:
User-Level Remote Config & Experiment Metadata — ApphudUser (from Apphud.start() / startManually() and ApphudListener.userDidLoad) now includes remoteConfig(), remoteConfigString, experimentName, variationName, targetingName, and totalDevicesCount, so you can drive UI/logic from Mission control targeting without an app update.
Deep-Link Attribution — Added Apphud.attributeFromDeeplink() to attribute users from a recently opened deep link and receive attribution payload data when available.
Placement-First API (Paywalls API Cleanup) — SDK flow is now centered on placements/targetings. Legacy paywall-centric entry points were removed (including ApphudUser.rawPaywalls, Apphud.rawPaywalls(), Apphud.paywallsDidLoadCallback(), and ApphudListener.paywallsDidFullyLoad()). Migrate to placements APIs like Apphud.placements(), Apphud.placement(), Apphud.rawPlacements(), and ApphudListener.placementsDidFullyLoad().
Richer Placement & Product Models — ApphudPlacement adds variationName. ApphudProduct adds properties, variationIdentifier, and experimentId for more accurate experiment/targeting context in purchases and analytics.
Commitment Plan Helpers (iOS) — Added Apphud.isCommitmentPlanPreferred() and Apphud.isCommitmentPlanSupported() (iOS 26.4+; Android returns false) to check Mission control commitment-plan configuration and device support before purchase.
Custom API Host — Added Apphud.setHost(). baseUrl on start / startManually is now applied before SDK initialization on iOS and Android.
Mission control Naming — Public documentation updated from Product Hub to Mission control.
Native SDK Updates — [Android] ApphudSDK-Android 3.2.5, [iOS] ApphudSDK 4.2.3.
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
ApphudUser: added totalDevicesCount, internalId, experimentName, variationName, targetingName, remoteConfigString, and remoteConfig() helper.ApphudPlacement: added variationName.ApphudProduct: added properties, variationIdentifier, experimentId, and isCommitmentPlanPreferred().Apphud.attributeFromDeeplink() for deeplink attribution.Apphud.setHost() to override API host before SDK start.Apphud.isCommitmentPlanPreferred() and Apphud.isCommitmentPlanSupported() (iOS only; Android returns false).baseUrl / setHost) is applied before start / startManually.ApphudUser.rawPaywalls.Apphud.rawPaywalls() and Apphud.paywallsDidLoadCallback().ApphudListener.paywallsDidFullyLoad. Use placementsDidFullyLoad and read paywalls from ApphudPlacement.paywall.purchaseProduct and commitment-plan checks uses ApphudPaywallsHelper.resolveProduct (ios/Classes/common/ApphudPaywallsHelper.swift, lines 22–35).[iOS] Fixed SKProductDiscount mapping: identifier and type are now forwarded to Flutter, and priceLocale is serialized correctly (it was hardcoded as
SKProductDiscount mapping: identifier and type are now forwarded to Flutter, and priceLocale is serialized correctly (it was hardcoded as an empty map before, which also affected introductoryPrice.priceLocale).SKProductDiscountWrapper now exposes identifier (String?) and type (SKProductDiscountType enum: introductory / subscription).SKProductWrapper now exposes the full discounts list in addition to introductoryPrice. This unblocks dynamic resolution of discountID for Apphud.purchasePromo without hardcoding it on the client side.checkEligibilityForIntroductoryOffer, checkEligibilityForPromotionalOffer, checkEligibilitiesForIntroductoryOffers and checkEligibilitiesForPromotionalOffers methods were implemented (previously stubbed and not wired up).SKProductDiscount mapping: identifier and type are now forwarded to Flutter, and priceLocale is serialized correctly (it was hardcoded as an empty map before, which also affected introductoryPrice.priceLocale).SKProductDiscountWrapper now exposes identifier (String?) and type (SKProductDiscountType enum: introductory / subscription).SKProductWrapper now exposes the full discounts list in addition to introductoryPrice. This unblocks dynamic resolution of discountID for Apphud.purchasePromo without hardcoding it on the client side.checkEligibilityForIntroductoryOffer, checkEligibilityForPromotionalOffer, checkEligibilitiesForIntroductoryOffers and checkEligibilitiesForPromotionalOffers methods were implemented (previously stubbed and not wired up).Apphud.purchasePromo(productId:, discountID:). Eligibility flags (introductory / promotional) control the labels and disable offers that are not eligible.What's new in v3.1.0: Billing 8 support on Android
Fixed a bug with mapping from iOS native module of the "restorePurchases" function.
[iOS], [Android] showPaywall method has been introduced. Show Figma paywalls in one line: final result = await Apphud.showPaywall(placement.paywall!,
showPaywall method has been introduced. Show Figma paywalls in one line: final result = await Apphud.showPaywall(placement.paywall!, maxTimeout: 10, iOSAnimationStyle: IOSAnimationStyle.bottomToTop);preloadPaywall method has been introduced.fetchPlacements has new optional parameter: forceRefresh. Use this when you need to apply updated audience segmentation or A/B test assignments.isNonRenewingPurchaseConsumable method was introducted.loadFallbackPaywalls method was introduced.collectSearchAdsAttribution method updated. Changed the return type from ApphudError? to Map<String, dynamic>?, now it returns attribution data, if any.paywallClosed removed entirely.syncPurchasesInObserverMode removed entirely as it syncs automatically in Observer mode.updateUserID method now returns ApphudUser model asynchronously.[iOS], [Android] showPaywall method has been introduced. Show Figma paywalls in one line: final result = await Apphud.showPaywall(placement.paywall!,
showPaywall method has been introduced. Show Figma paywalls in one line: final result = await Apphud.showPaywall(placement.paywall!, maxTimeout: 10, iOSAnimationStyle: IOSAnimationStyle.bottomToTop);preloadPaywall method has been introduced.fetchPlacements has new optional parameter: forceRefresh. Use this when you need to apply updated audience segmentation or A/B test assignments.isNonRenewingPurchaseConsumable method was introducted.loadFallbackPaywalls method was introduced.collectSearchAdsAttribution method updated. Changed the return type from ApphudError? to Map<String, dynamic>?, now it returns attribution data, if any.paywallClosed removed entirely.syncPurchasesInObserverMode removed entirely as it syncs automatically in Observer mode.updateUserID method now returns ApphudUser model asynchronously.Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
[Android] proguard-rules.pro was improved
proguard-rules.pro was improved[Android] proguard-rules.pro was added
[Android] proguard-rules.pro was added
Dependencies of Native SDK's were updated to:
Google Billing Client updated to 7.1.1
BREAKING [iOS], [Android] addAttribution method was renamed to setAttribution
BREAKING [iOS], [Android] addAttribution method was renamed to setAttribution
Dependencies of Native SDK's were updated to:
BREAKING [Android] ApphudListener.apphudDidReceivePurchase method was introduced
BREAKING [Android] ApphudListener.apphudDidReceivePurchase method was introduced
BREAKING [iOS], [Android] paywalls method was removed
BREAKING [iOS] rawPaywalls method was removed
[Android] ApphudNonRenewingPurchase.purchaseToken property was introduced
[Android] ApphudSubscription.purchaseToken property was introduced
[Android], [iOS] deferPlacements method was introduced
[Android] refreshUserData method was introduced
[Android], [iOS] forceFlushUserProperties method was introduced
[Android] refreshUserData now returns ApphudUser?
[Android] updateUserID now returns ApphudUser?
[Android], [iOS] attributeFromWeb method was introduced
Dependencies of Native SDK's were updated to:
[iOS],[Android] ApphudAttributionProvider.facebook was added.
ApphudAttributionProvider.facebook was added.[iOS],[Android] ApphudAttributionProvider.custom was added.
ApphudAttributionProvider.custom was added.[Android] syncPurchasesInObserverMode method was deprecated. All purchases on Android are now automatically intercepted and sent to Apphud.
[Android] trackPurchase method was introduced.
[Android] syncPurchasesInObserverMode method was deprecated. All purchases on Android are now automatically intercepted and sent to Apphud.
Dependencies of Native SDK's were updated to:
[iOS], [Android] Example App was refactored
[iOS], [Android] Example App was refactored
[Android] loadFallbackPaywalls method was introduced
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
ApphudGroup's products variable was changed to List<String> productIds.Dependencies of Native SDK's were updated to:
[Android] BREAKING Future > placementsDidLoadCallback() renamed to Future fetchPlacements()
[Android] BREAKING Future<List<ApphudPlacement>> placementsDidLoadCallback() renamed
to Future<ApphudPlacements> fetchPlacements()
[Android] paywallsDidLoadCallback call result contains optional ApphudError
[Android] refreshUserData method was introduced
[Android] ApphudError now contains networkIssue, billingResponseCode and billingErrorTitle
attributes
[iOS], [Android] ApphudPaywall now contains variationName and parentPaywallIdentifier
attributes
Dependencies of Native SDK's were updated to:
[Android] fixed some build issues
[Android] fixed some build issues
Dependencies of Native SDK's were updated to:
[iOS] Fixed 'addAttribution' calling issue in some cases
[Android] Fixed 'paywalls' calling issue in some cases
Placements: Offers a strategic method to integrate paywalls throughout your app. This feature allows developers to position paywalls effectively in di
Placements: Offers a strategic method to integrate paywalls throughout your app. This feature allows developers to position paywalls effectively in different app sections, such as onboarding or settings, targeting distinct user audiences. For more comprehensive information, please refer to our Placements guide.
[iOS], [Android] BREAKING Property 'variationName' were removed from ApphudPaywall, which was confusing developers and lead to incorrect implementations.
[iOS] BREAKING Method 'didFetchProductsNotification' was removed.
[iOS], [Android] BREAKING Method 'productsDidFetchCallback' was removed.
[iOS] BREAKING Method 'refreshStoreKitProducts' was removed.
[iOS], [Android] BREAKING Method 'purchaseWithoutValidation' was removed.
[iOS] BREAKING Method 'didPurchaseFromPaywall' was removed.
[Android] BREAKING Method 'refreshEntitlements' was removed.
[iOS] BREAKING Method 'validateReceipt' was removed.
[iOS] BREAKING Method 'migratePurchasesIfNeeded' was removed.
[iOS] BREAKING Method 'appStoreReceipt' was removed.
[iOS] BREAKING Method 'fetchRawReceiptInfo' was removed.
[iOS] BREAKING Method 'isSandbox' was removed.
[Android] BREAKING Class 'AndroidAccountIdentifiersWrapper' was removed.
[Android] BREAKING Method 'syncPurchases' was renamed to 'syncPurchasesInObserverMode'. The ' paywallIdentifier' parameter was removed.
[Android] BREAKING Class 'AndroidPurchaseWrapper' was modified.
[Android], [iOS] BREAKING Class 'ApphudNonRenewingPurchase' was modified.
[Android], [iOS] BREAKING Class 'ApphudPaywall' was modified.
[Android], [iOS] BREAKING Class 'ApphudProduct' was modified.
[Android], [iOS] BREAKING Class 'ApphudSubscriptionWrapper' was modified.
[Android], [iOS] Method 'products' always returns 'ApphudProductComposite' list.
[Android], [iOS] BREAKING 'ApphudAttributionProvider.appleSearchAds', ' ApphudAttributionProvider.facebook' were modified.
[Android], [iOS] some fixes of the example app
[iOS], [Android] 'paywallsDidLoadCallback' method was introduced.
[iOS], [Android] 'placements' method was introduced.
[iOS], [Android] 'placement' method was introduced.
[iOS], [Android] 'placementsDidLoadCallback' method was introduced.
[iOS], [Android] 'rawPlacements' method was introduced.
[iOS], [Android] 'rawPaywalls' method was introduced.
[iOS], [Android] The 'start' and 'startManually' methods now return an ApphudUser object.
[iOS], [Android] The 'ApphudListener' 'placementsDidFullyLoad' method was introduced.
[iOS], [Android] BREAKING The 'ApphudListener' 'userDidLoad' method now returns an ApphudUser object.
Dependencies of Native SDK's were updated to:
[Android] Fixed restore purchase issue in some cases
Fixed purchase result parsing issue in some cases
[Android] BREAKING SkuDetailsWrapper was replaced by ProductDetailsWrapper because of the migration to Billing v5.
[Android] BREAKING SkuDetailsWrapper was replaced by ProductDetailsWrapper because of the migration to Billing v5.
Dependencies of Native SDK's were updated to:
[iOS] PUSH notifications handling was added to the example app.
[iOS] PUSH notifications handling was added to the example app.
[Android] 'optOutOfTracking' and 'collectDeviceIdentifiers' are introduced
[Android] BREAKING Method disableAdTracking is removed.
Dependencies of Native SDK's were updated to:
[Android] Fixes bug with AddAttribution for AppsFlyer provider.
Dependencies of Native SDK's were updated to:
[Android] Bug fixes
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
[Android] Bug fixes
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
[Android] Bug fixes
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
[Android] Bug fixes
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
[Android] Bug fixes
Dependencies of Native SDK's were updated to:
[Android] Internal improvements and bug fixes with syncing purchases
[Android] Internal improvements and bug fixes with syncing purchases
Dependencies of Native SDK's were updated to:
[Android] fixed incorrect ApphudListener behaviour when the ApphudPlugin instance is created twice because of Firebase.
[Android] fixed incorrect ApphudListener behaviour when the ApphudPlugin instance is created twice because of Firebase.
[Android] Internal improvements.
Dependencies of Native SDK's were updated to:
Dependencies of Native SDK's were updated to:
[Android] Fixed a bug when ApphudListener’s paywallsDidFullyLoad method wasn’t called in some cases.
[Android] Fixed a bug when ApphudListener’s paywallsDidFullyLoad method wasn’t called in some cases.
[Android] Added new method refreshEntitlements().
[iOS] hasActiveSubscription(), hasPremiumAccess() improvements and bug fixes
[iOS] Added purchasePromo() logging
[iOS] Added checkTransactions logic for force receipt sending if a new transaction was found.
Dependencies of Native SDK's were updated to:
[iOS] Payment swizzle was disabled for observer mode.
[iOS] Payment swizzle was disabled for observer mode.
[iOS] Improved interaction with Apple Search Ads attribution.
[iOS] Updated methods description and improve documentation.
Dependencies of Native SDK's were updated to:
[iOS], [Android] Method hasPremiumAccess() was implemented.
[iOS], [Android] Method hasPremiumAccess() was implemented.
[Android] The parameter paywallIdentifier was introduced for the method syncPurchases().
[iOS] The method didPurchaseFromPaywall was implemented.
Dependencies of Native SDK's were updated to:
[Android] Fixed bug that method hasActiveSubscription was false for paying users at launch before data refreshes. Now value is cached.
[Android] Fixed bug that method hasActiveSubscription was false for paying users at launch before data refreshes. Now value is cached.
[Android] Fixed internal potential crash
[iOS] Fixed 403 server error bug, when user could be blocked from sever 403 error code
[iOS] Add push token cache
[iOS] Update general cache time
[iOS] Update some Logs
Dependencies of Native SDK's were updated to:
[iOS] The optional parameter 'level' was added to the method enableDebugLogs(). Possible values are:
[iOS] The optional parameter 'level' was added to the method enableDebugLogs(). Possible values are:
[iOS], [Android] Automatic fetching of Apphud Flutter SDK version was implemented
[iOS] BREAKING Method 'disableIDFACollection()' was removed
[Android] Method 'grantPromotional()' was implemented
[Android], [iOS] Class 'ApphudListener' and method 'setListener({ApphudListener? listener})' were implemented
[Android], [iOS] BREAKING Method 'getPaywalls()' was removed. Please use ApphudListener instead.
[iOS] BREAKING Method 'paywallsDidLoadCallback()' was removed. Please use ApphudListener instead.
[Android] Method 'deviceId()' was implemented
[Andoid], [iOS] Significantly improved SDK performance and caching. Now SDK will send much less requests to Apphud server.
Dependencies of Native SDK's were updated to:
[iOS], [Android] Products list was removed from Example app because of deprecation due to Paywalls.
[iOS], [Android] Experiments were added. Run Experiments(A/B tests) to test different in-app purchases prices in order to find the best.
[iOS] Apple search Ads logic was improved. Submit Apple Attribution Token to Apphud with Apphud.addAttribution().
[iOS] Paywalls methods was improved. Paywalls are already exist after SDK initialization. Use paywalls() method.
[iOS] paywallsDidLoadCallback() method was added. This callback is called when paywalls are fully loaded with their StoreKit products.
[iOS] Promotionals were added. You can grant free promotional subscription to user with new method grantPromotional()
[iOS] Fixed important bug when User Properties sometimes may not be saved when submitted simultaneously with initialisation.
[iOS] Fixed a bug when incoming rules did not automatically mark as read.
[Android] Paywalls events methods were implemented: paywallShown(), paywallClosed()
[Android] Supporting of Google Billing library 4.0 was implemented
[iOS], [Android] Properties 'experimentName' and 'variationName' were added to ApphudPaywall.
[iOS], [Android] Bug fixing and some internal improvements.
[iOS], [Android] Products list was removed from Example app because of deprecation due to Paywalls.
BREAKING refactor [iOS], [Android]:
Dependencies of Native SDK's were updated to:
ApphudProduct was renamed to ApphudProductComposite and was marked as deprecated
Paywalls features were implemented:
Bugs were fixed:
Dependencies of Native SDK's were updated to:
BREAKING refactor [iOS], [Android]:
Methods are deprecated:
[iOS] Add method collectSearchAdsAttribution() to send search ads attribution data to Apphud.
- Update collection dependency - Correct readme.md
Upgrade the example application
[Android] Upgrade to use ApphudSDK-Android:0.8.5
First version Apphud SDK for Flutter
First version Apphud SDK for Flutter
Your coding agent can read these notes before it upgrades. Set up the MCP server →