Skip to main content

Changelog

All notable changes to the SpendOwl iOS SDK.

[1.4.0] - 2026-08-13

Changed

  • Consumable coverage is now stated honestly. Transaction.all never was a safety net for consumables — StoreKit drops one from history as soon as the app calls finish(), so a consumable missed live was missed permanently. Apps selling consumables should add SKIncludeConsumableInAppPurchaseHistory to their Info.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

  • originalTransactionId is now populated on the StoreKit 1 purchase path, from SKPaymentTransaction.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 as externalUserId, 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.all scan. (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 SKPaymentTransactionObserver for StoreKit 1, Transaction.updates for renewals and cross-device events, and a launch-time Transaction.all scan 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
  • 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:
  1. Remove the old package dependency
  2. Add the release version:
  3. Update any deprecated method calls (none in 1.0.0)
  4. 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
Already shipped, previously listed here: offline event queueing (purchase events persist across launches and retry on a later session) and server-side purchase data (revenue, currency, refunds and product type come from App Store Server Notifications).

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