Changelog
All notable changes to the SpendOwl iOS SDK.[1.4.0] - 2026-08-13
Changed
- Consumable coverage is now stated honestly.
Transaction.allnever was a safety net for consumables — StoreKit drops one from history as soon as the app callsfinish(), so a consumable missed live was missed permanently. Apps selling consumables should addSKIncludeConsumableInAppPurchaseHistoryto theirInfo.plist; see Consumables. - The SDK now reads that key at runtime and warns during integration when it is absent. It cannot set the key itself — Swift package resources don’t merge into the app’s
Info.plist.
Fixed
- Event queue eviction now drops the oldest confirmed-sent transaction IDs rather than arbitrary ones, so a busy app no longer loses recent dedup state.
[1.3.1] - 2026-08-13
Fixed
originalTransactionIdis now populated on the StoreKit 1 purchase path, fromSKPaymentTransaction.original, falling back to the transaction’s own ID on an initial purchase. Both paths are now joinable against server-side webhook data.- Sent purchase events are removed from the queue by ID instead of by queue position, which could remove the wrong event when the queue changed mid-send.
- A background task assertion is held while purchase events are sent, so a send in progress is no longer cut short when the app is backgrounded.
[1.3.0] - 2026-06-30
Changed
- Linkage now always runs on a stable, device-scoped anonymous SpendOwl ID.
setUserId()no longer affects how attribution and purchases are connected — the value is carried asexternalUserId, reporting metadata that makes purchases searchable by your own identifier. Calling it late, or never, no longer costs you anything.
[1.2.1] - 2026-06-08
Fixed
- Consumables missed at the moment of purchase are recovered through the launch-time
Transaction.allscan. (Superseded by 1.4.0, which documents the limits of this recovery.)
[1.2.0] - 2026-05-06
Fixed
- First-launch attribution is hardened against transient errors: the attribution token is retried with backoff, and a fetch that fails is replayed on a later launch instead of being lost.
[1.1.0] - 2026-02-23
Added
- Fully automatic purchase tracking via three complementary listeners: an
SKPaymentTransactionObserverfor StoreKit 1,Transaction.updatesfor renewals and cross-device events, and a launch-timeTransaction.allscan as a safety net. No purchase-reporting calls are needed from your app.
Changed
- Apple Search Ads renamed to Apple Ads throughout.
[1.0.0] - 2026-01-15
Initial Release
The first public release of the SpendOwl iOS SDK.Features
-
Attribution Tracking
- Apple Search Ads attribution via AdServices
- Campaign, ad group, and keyword data
- Country/region and conversion type
- Supply placement support
-
Purchase Tracking
- StoreKit transaction observation
- Subscriptions and non-consumables; consumable coverage was overstated here and corrected in 1.4.0
- Works alongside RevenueCat and Adapty
-
User Identity
setUserId()for reporting purchases under your own identifier- Anonymous ID with Keychain persistence
clearUserId()for logout
-
Configuration
- Simple one-line setup:
SpendOwl.configure(apiKey:) - Custom timeout and retry settings
- Thread-safe, Sendable API
- Simple one-line setup:
-
Debugging
- Multiple log levels (none, error, info, debug)
- Debug-build console logging
- Comprehensive error types
-
Privacy
- No IDFA required
- Privacy manifest included
- GDPR/CCPA compliant
Platforms
- iOS 15.0+
- macOS 12.0+
- Swift 5.9+
- Xcode 15.0+
Upgrading
From Beta
If you were using a beta version:- Remove the old package dependency
- Add the release version:
- Update any deprecated method calls (none in 1.0.0)
- Clean build folder (Product → Clean Build Folder)
Roadmap
Upcoming features planned for future releases:- macOS Catalyst support
- visionOS support
- Custom events — Track custom conversion events
Semantic Versioning
SpendOwl follows Semantic Versioning:- MAJOR version for incompatible API changes
- MINOR version for backwards-compatible features
- PATCH version for backwards-compatible bug fixes
Stay Updated
GitHub Releases
Watch for new releases
X
Follow for updates