asalyze
Apple Search Ads ROAS tracking for iOS Flutter apps — first-party AdServices attribution + StoreKit 2 revenue. No IDFA.
What this package is like to depend on
Last release 2 days ago
21 Aug 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 14 of 14 stable releases
Nothing withdrawn
no release was ever pulled
1 months old
14 releases · first in 2026
14 releases in the last 12 months
see the full history below
Release timeline
14 releases · Jul 2026 to Aug 2026Releases
latest 14-
2.1.021 Aug 2026Release notes
Open source →Installs on iOS 15 now report an install date.
AppTransactionis iOS 16+, and below it StoreKit 2 offers no app-level record at all — so those users arrived with no date and stayed permanently unclassified. Measured 2026-08-21 in production: a flat ~1.8% of installs, 539 of the last 620 undated ones, every single one on a current build. It was never a device failure; the SDK simply never asked in a way an older OS could answer.It now falls back to the legacy App Store receipt, which is what Apple's own documentation points to for this case: use the receipt when the app "needs the receipt to validate the app download because it can't use AppTransaction". The receipt is sent as Apple signed it and read on the server — a date the app could have retyped is worth less than one Apple issued. The fallback runs only below iOS 16, so its deprecation is irrelevant: those devices can never reach an OS where it might be removed.
Ad revenue now carries the country the ad was served in. eCPM is set by the viewer's country, so ad revenue without geography cannot really be read — $100 from Pakistan and $100 from the US are completely different performances. The region is read at the impression rather than taken from the install, because a user who has travelled since installing would otherwise have every impression priced against the country they signed up in.
Also sent at registration: the device OS version, and — on iOS 16+ — the whole signed AppTransaction record rather than one field pulled out of it. That record carries
originalApplicationVersion, which separates a long-standing user from a new one without needing a usable date, and it exists nowhere but on the device: no server API can be asked for it afterwards.No API changes. Nothing to update in your integration.
-
2.0.120 Aug 2026Release notes
Open source →Apple returns countryOrRegion only for installs it attributed. Measured 2026-08-20:
7,850 of 7,906 paid installs carried a country, against 14 of 66,200 organic — so
89% of users had no geography and any geo view was a paid-only view.Locale.current.region on iOS 16+, regionCode below it, which also covers the older
devices that cannot provide an AppTransaction.It is the device's own setting, not the App Store storefront, and disagrees for
someone travelling or living abroad. The backend keeps it in its own column rather
than merging it into Apple's country, so a weaker signal never overwrites a stronger.No API change.
Release notes
Open source →The SDK now reports the device's region. Apple returns a country only for installs it attributed, so organic users — the large majority — arrived with no geography at all: measured 2026-08-20, 7,850 of 7,906 paid installs carried a country against 14 of 66,200 organic.
Locale.current.regionon iOS 16+,regionCodebelow it, so it also covers the older devices that cannot provide anAppTransaction. It is the device's own setting, not the App Store storefront, and the backend keeps it separate from Apple's answer rather than merging the two.No API change. Nothing to do but update.
-
2.0.013 Aug 2026Release notes
Open source →The C# still called AsalyzeTrackPurchase, whose ObjC bridge symbol was removed in
this release, so the package would have failed to link. Both are gone now, which
means a project still calling it fails to BUILD rather than silently sending data
that cannot be deduped.Asalyze-2.0.0.unitypackage is rebuilt from the same GUIDs as 1.3.1, so importing
it upgrades the existing assets in place instead of duplicating every script.TrackAdRevenue, TrackEvent, SetUserId and InstallId are unchanged.
Release notes
Open source →Breaking:
Asalyze.trackPurchaseis removed (Swift, Dart and the Objective-C/Unity bridge).Purchases are never reported by hand. The SDK requires iOS 15, so StoreKit 2 observation always runs and every App Store purchase already arrives with Apple's own transaction id, price, currency, offer type and dates — the authoritative values. A manual call could only ever disagree with them, and did:
- no transaction id, so nothing downstream could dedupe the manual copy against Apple's;
offerdefaulted to.none, so a free trial reported this way booked at full price.
In production one app reported roughly double its real revenue, with 52 free trials counted as paid purchases. Removing the method removes the whole class of error.
Also breaking:
offeris now required ontrackSubscription(and onSubscriptionEvent.init).It defaulted to
.none, which is the same trap: forget the argument and a free trial is recorded as a paid purchase..noneis still correct for events where no offer applies — expiry, cancellation — it simply has to be stated rather than assumed. The Flutter channel now rejects an unrecognised offer instead of quietly falling back to.none.Migrating: delete your
trackPurchasecalls — nothing is lost, the SDK already has those purchases with better data than the call supplied — and passoffer:explicitly totrackSubscription.trackAdRevenueandtrackEventare unchanged; ad revenue genuinely does need reporting, since Apple knows nothing about it. -
1.3.029 Jul 2026Release notes
Open source →- Add an Objective-C–visible
AsalyzeBridgefaçade so non-Swift hosts can drive the SDK through a C-callable surface. Powers the new Unity package (native iOS bridge). No change for Swift/Flutter apps.
- Add an Objective-C–visible
-
1.2.228 Jul 2026Release notes
Open source →- Re-publish of 1.2.1 (identical code) to repair a half-completed CocoaPods trunk push whose version index never updated. No functional changes over 1.2.1.
-
1.2.128 Jul 2026Release notes
Open source →- Reliable subscription reporting. A StoreKit transaction is now marked "sent" only after the
report reaches the backend (2xx). Previously it was marked before the network call, so a transient
failure (bad network at purchase, app killed mid-flight) permanently orphaned the purchase. Now a
failed report is automatically retried from
Transaction.allon the next launch — no purchase is lost just because one network call failed. No integration changes required. - New
Asalyze.purchase(product)— a drop-in forproduct.purchase(options:)that attachesappAccountToken = installIdautomatically, so Apple echoes the install id in every server notification. This attributes a purchase (and all its renewals) even when the buyer never reopens the app — the one case on-launch retry can't recover. Optional one-line swap at your purchase call site.
- Reliable subscription reporting. A StoreKit transaction is now marked "sent" only after the
report reaches the backend (2xx). Previously it was marked before the network call, so a transient
failure (bad network at purchase, app killed mid-flight) permanently orphaned the purchase. Now a
failed report is automatically retried from
-
1.2.028 Jul 2026Release notes
Open source →- Capture the exact app version (CFBundleShortVersionString) + build, and the true install date (AppTransaction.originalPurchaseDate) at install registration. The marketing version only exists on-device — Apple never sends it server-side — so this resolves the build-number ambiguity for version-based analysis.
-
1.1.415 Jul 2026Release notes
Open source →- Environment detection now also treats any build carrying an embedded provisioning profile (development / ad-hoc / enterprise) as sandbox — so a Release-configured build installed directly on a device no longer leaks into production reports. App Store builds (profile stripped) stay production.
-
1.1.315 Jul 2026Release notes
Open source →- AdMob helper:
AsalyzeAdMob.report(_:currencyCode:precision:format:)now takes AdMob'sGADAdValue.value(anNSDecimalNumber, in currency units) directly — pass it straight through, no micro-unit conversion. A labelledreport(micros:…)overload remains for micro-unit callers.
- AdMob helper:
-
1.1.215 Jul 2026Release notes
Open source →- Redownload tracking: the SDK now detects a reinstall (the Keychain install id survived but the app's local first-run marker was wiped) and flags it, so the dashboard can distinguish first installs from returning-user reinstalls and show the reinstall date.
-
1.1.115 Jul 2026Release notes
Open source →- Environment detection now uses StoreKit 2's
AppTransaction(and each transaction's own.environment) instead of the receipt-name heuristic — so TestFlight / ad-hoc / Release-configured test builds are reliably tagged sandbox and never leak into production reports.
- Environment detection now uses StoreKit 2's
-
1.1.014 Jul 2026Release notes
Open source →- Every StoreKit transaction now reports Apple's
transactionId— the backend deduplicates it against the App Store Server API, so purchases/renewals are never double-counted across sources. - On launch the SDK sweeps
Transaction.allto backfill a user's full purchase history with real dates (so subscribers who bought before the SDK shipped still show a complete timeline).
- Every StoreKit transaction now reports Apple's
-
1.0.113 Jul 2026 -
1.0.013 Jul 2026Release notes
Open source →- Initial release.
- Apple Search Ads first-party attribution via AdServices (no IDFA, no ATT prompt).
- StoreKit 2 revenue observation (purchases, renewals, refunds) — captured natively.
- Ad revenue, custom events, and subscription lifecycle reporting.
- Self-contained: the native Asalyze iOS SDK is vendored into the plugin. iOS 15+.