NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4643 most downloaded on pub.dev
Track events and revenue with Apple Search Ads attribution for Flutter apps. Supports iOS 15.0+ and Android 5.0+.
Last release 15 days ago
22 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 44 of 44 stable releases
5 versions withdrawn
withdrawn after publishing
1 years old
51 releases · first in 2025
Updated the vendored iOS XCFramework and exact Swift Package Manager dependency to Appstack iOS SDK 4.7.2 . No Dart API change is required.
4.7.2. No Dart API change is required.enableAppleAdsAttribution() call with the same event ID.Updated the Appstack Android SDK dependency to 1.11.0 . No Dart API or integration change is required.
1.11.0. No Dart API or integration change is required.
configure() call made from an Activity no longer retains that Activity for the life of the process. The supplied Context is normalised to the application context before use.One column per month.
Added AppstackPlugin.deleteUserData() on iOS and Android for GDPR/privacy deletion requests. The future completes only after the native deletion reque
AppstackPlugin.deleteUserData() on iOS and Android for GDPR/privacy deletion requests. The future completes only after the native deletion request finishes and throws when native deletion fails.1.10.0.4.7.1, which fixes Swift 6 build errors when referencing AppstackAttributionSdk.shared or AppstackASAAttribution.shared.Added AppstackPlugin.handleUniversalLink(Uri, {allowedHosts}) for parsing branded-domain Appstack standard links delivered by the app's existing Flutt
AppstackPlugin.handleUniversalLink(Uri, {allowedHosts}) for parsing branded-domain Appstack standard links delivered by the app's existing Flutter link handler. It is safe before configure() and returns null for unsupported links. The result's deeplinkId is nullable, matching both native SDKs. allowedHosts is optional hardening; omitting it parses any host except the shared Appstack ones.4.7.0 and Android 1.9.0.Updated the Appstack iOS SDK to 4.6.0
sendEvent() parameters are encrypted on the device before being sent. Parameter keys not in the backend's plaintext allowlist are sealed with RFC 9180 HPKE. The allowlist is served in remote config; no app or configure() change is required, and with no config block both SDKs send plaintext as before. transaction_details, deeplink user data, identifiers and other top-level event fields are not encrypted, and revenue is extracted before encryption, so revenue reporting is unchanged. A value that cannot be sealed is omitted and the event still sends. Requires iOS 17+; on iOS 15–16 values are encrypted server-side as before. Applies at Android's API 21 floor. No new dependency on either platform; the Android AAR grows ~36 KB.All three are iOS SDK 4.6.0 fixes; Android is unchanged.
null in sendEvent()'s parameters no longer drops the event on iOS. Nulls are omitted from the payload; nulls inside lists are kept. This matches Android's existing behaviour.sendEvent() no longer crashes on iOS when a parameter value cannot be JSON-serialized. The key is dropped and logged natively; the event sends with the rest. From Dart this covers double.nan, double.infinity and typed-data lists (Uint8List, Int32List, Int64List, Float64List). DateTime, Uri, Set and arbitrary objects are unaffected — they throw ArgumentError at the platform channel and never reach the SDK.null in the attribution match response no longer discards the whole response on iOS. One null query parameter could previously cost an install its attribution data.No Dart API changed. sendEvent()'s doc comment now describes null handling, the parameter value types that cross the platform channel, and the encryption.
AppstackPlugin.setCustomerUserId(customerUserId) — sets or clears the customer user ID after configure() , bridging the native iOS/Android setter of t
AppstackPlugin.setCustomerUserId(customerUserId) — sets or clears the customer user ID after configure(), bridging the native iOS/Android setter of the same name. Use it when a login reveals the ID; calling configure() a second time does not work, as a repeat configure() is a no-op and ignores its customerUserId. Clear it on logout so the previous user's ID stops being attached to later events. Passing null (or a blank string) clears the stored ID — unlike configure(), which treats a blank value as "not provided" because it never clears. Safe to call at any time; last write wins.getAttributionParams() no longer comes back empty: the map now always carries an appstack_match_status key reporting the attribution outcome (matched, matched_no_params, organic, skipped, failed or not_configured). Only failed is worth re-reading later; the rest are settled answers. The Dart signature is unchanged — the result is still nullable, so existing null checks keep working — but code that read an empty result as "not attributed" should switch to the status key. Treat the key as iOS-only for now: Android 1.7.0 does not add it, so an empty map still means "nothing yet" there. Also fixed on iOS: a setCustomerUserId() call made immediately after configure() is no longer overwritten by the customerUserId passed to configure(), and a blank customer user ID is treated as absent rather than sent as an empty string.setCustomerUserId setter that AppstackPlugin.setCustomerUserId() bridges on Android. No new permission is required.Updated the Appstack iOS SDK to 4.4.1 — attribution matching now includes additional network context to improve match diagnostics.
EventType.install is no longer sent when passed to sendEvent() — both native SDKs already track the install automatically, so sending it by hand previously double-counted installs. Such calls are now logged and discarded natively; the Dart call still succeeds.enabled=false suppressed only the event POSTs, and a fresh install still called /attribution/match. A disabled app now makes no attribution network calls at all.Updated the Appstack iOS SDK to 4.4.0
Package.swift) and the CocoaPods podspec.Moving 'Publish - dry run' after 'Update version in files' broke publishing: flutter pub publish --dry-run fails on warnings (exit 65) and treats the
Moving 'Publish - dry run' after 'Update version in files' broke publishing:
flutter pub publish --dry-run fails on warnings (exit 65) and treats the
dirty git tree left by the sed version edits as a warning ('checked-in files
are modified in git'). The dry-run must run on the clean checkout; the real
publish uses -f to force past the version-file edits. This restores the order
that worked for 2.1.0-2.3.0.
Update Android and iOS plugin configurations to remove deprecated parameters
isDebug and endpointBaseUrl parameters from the public configure API, now handled internally.ci_android_integration.sh) to maintain shell state.Update CHANGELOG for version 2.2.2 and upgrade Appstack iOS SDK to 4.3.1
Update CHANGELOG for version 2.2.2 and upgrade Appstack iOS SDK to 4.3.1
Update CHANGELOG for version 2.2.2 and upgrade Appstack iOS SDK to 4.…
Update CHANGELOG for version 2.2.2 and upgrade Appstack iOS SDK to 4.…
Update CHANGELOG for version 2.2.1 and upgrade Appstack Android SDK t…
Update CHANGELOG for version 2.2.1 and upgrade Appstack Android SDK t…
Fix tests suites in the sample app
Fix tests suites in the sample app
Synced iOS native implementation across all integration paths (CocoaPods and SPM): the SPM source copies of AppstackPlugin.swift were stale and missin
AppstackPlugin.swift were stale and missing customerUserId, wrapperVersion, and the attribution event channel, causing an undefined symbol error at build time.wrapperVersion is now automatically passed to the native iOS and Android SDKs on configure, identifying the Flutter wrapper version (e.g. flutter-2.1.
wrapperVersion is now automatically passed to the native iOS and Android SDKs on configure, identifying the Flutter wrapper version (e.g. flutter-2.1.0). This is handled internally and not exposed to the public API.Updated the Appstack iOS SDK to 4.0.5
New getAttributionParamsWithCallback() method — retrieves attribution parameters via a push-style stream backed by a native background thread (Swift T
getAttributionParamsWithCallback() method — retrieves attribution parameters via a push-style stream backed by a native background thread (Swift Task.detached on iOS, Thread on Android). The stream emits one value then closes. Use this as an alternative to getAttributionParams() when attribution retrieval time may vary.Updated the Appstack iOS SDK to 4.0.4
Updated the Appstack iOS SDK to 4.0.2
Updated the supported version of flutter
### Added - Updated the iOS SDK to 4.0.1
### Added - Updated the iOS SDK to 4.0.0
### Added - Updated the iOS SDK to 3.6.2
### Added - Updated the iOS SDK to 3.6.1
### Added - Updated the iOS SDK to 3.6.0
Updated the Android SDK to 1.3.1
Updated the Android SDK to 1.3.0
Fix some bugs linked to Apple Search Ads attribution (upgrade to iOS 3.3.1)
Rollback some buggy modifications of 3.2.0 (upgrade to 3.3.0)
New matching method on Android (upgrade to 1.2.2)
New getAttributionParams() method to retrieve attribution parameters from the SDK
getAttributionParams() method to retrieve attribution parameters from the SDKUpdated the iOS SDK dependencies (SPM & Pods static files) to 3.0.2.
Updated the way we are handling the methods on iOS to ensure we are avoiding crashes & threads hanging
Updated SPM plugin code to use parameters map instead of deprecated revenue parameter in sendEvent method
parameters map instead of deprecated revenue parameter in sendEvent methodFixed iOS SDK version reference to use 3.0.0 instead of 2.5.0, resolving compilation errors with sendEvent parameters and isSdkDisabled method
sendEvent parameters and isSdkDisabled methodBREAKING CHANGE: Modified sendEvent() method to accept parameters map instead of revenue parameter
sendEvent() method to accept parameters map instead of revenue parameter// Old API (deprecated)
await AppstackPlugin.sendEvent(EventType.purchase, revenue: 29.99);
// New API (current)
await AppstackPlugin.sendEvent(EventType.purchase, parameters: {'revenue': 29.99, 'currency': 'USD'});
Modified configure() method to return Future instead of Future
configure() method to return Future<void> instead of Future<bool>isSdkDisabled() to see the value configured in the iOS or the Android SDKNew getAppstackId() method to retrieve the unique Appstack ID for the current user
getAppstackId() method to retrieve the unique Appstack ID for the current usergetAppstackId() functionalitygetAppstackId() from AppstackSDKgetAppstackId() from AppstackSDK…to SPM usage to have a much cleaner repository (deprecation on flutter's side of cocoapods)
Update the documentation to reference the SPM setup needed to make works the SDK
Update the changelog for 0.0.9 and 0.0.10 to avoid having a reduced score on pub.dev
Update the iOS SDK reference to 2.5.0 (use the new automatic releases for iOS)
Clean the bundling of the iOS Appstack SDK (using SPM / GitHub refs)
Fixed some bugs due to the cleanup
Fixed some bugs due to the cleanup
Did some cleanup to do easier maintenances on the SDK
Match in a better way what is expected for Swift Package Manager handling
Example documentation necessary for pub.dev points completion
Automatic release CD for the appstack_plugin
Initial release of Appstack Flutter Plugin
sendEvent() methodYour coding agent can read these notes before it upgrades. Set up the MCP server →