Fixed
- Recover missed consumables. The startup recovery scan now uses
Transaction.allinstead ofTransaction.currentEntitlements, so consumable purchases that the live listeners missed (app killed mid-flow, a failed send) are recovered on the next launch for already-attributed users — bringing consumables to the same reliability as non-consumables and subscriptions. - Durable purchase dedup. Transactions are marked as sent only after a confirmed network send, and the in-memory pending set is seeded from the persisted queue at launch. An event dropped from the bounded retry queue before sending is now recovered on a later launch instead of being lost, and is never enqueued as a duplicate.
Revenue totals are unaffected; this improves the paid/organic attribution split for consumables going forward. No public API changes.