Android, iOS and Web differences
Actual Kotlin/Flutter 0.2.1 and Web 0.2.0 support for identity, cache, stores, recovery and delivery.
A Flutter facade method is not proof of implementation on every backend. This matrix targets released Flutter/Kotlin 0.2.1 and JS 0.2.0. Inspect source and locks for other versions.
| Capability | Kotlin / Flutter Android | Flutter iOS | Flutter Web | Direct JavaScript |
|---|---|---|---|---|
| Session owner | Native Kotlin | Dart GoV2 + Keychain | JS provider through bridge | JS client |
| Payments | Direct, Bazaar, Myket | Direct | Web checkout | Web checkout |
| Customer-ID logIn | Yes | Yes | No | No; Ticket/OTP |
| Ticket and OTP | No | No | Yes | Yes |
| Current / placement / exact offering | Yes | Yes | Yes; exact via collection helper | Yes |
| Combined attribute/offering sync | Yes; five/60 | Yes; five/60 | No | Yes; five/60 |
| Four CustomerInfo policies | Yes | Yes | Inputs not forwarded | Yes |
| CustomerInfo default | cachedOrFetched | cachedOrFetched | Provider FETCH_CURRENT | FETCH_CURRENT |
| Correlated history/purchaseUpdates | Yes | No | No | No |
| Store sync/restore | Yes | Direct delivery only; no StoreKit | No | No |
| Delivery handler | Yes | No | No | Yes, distinct JS API |
| Consumable sync/confirm | Yes | Manual Direct | No | Direct |
| Public checkout status/return polling | No | No | Yes | Yes |
| isPaymentUrlAllowed / setNetworkEnabled | Yes | Yes | No | Separate Web policy/options |
| Reserved $ip writes | Yes | Validator rejects | No | No |
Choose the correct architecture
On Android, Kotlin owns purchases, caches and automatic recovery; Flutter does not create a second pipeline. iOS runs Direct in Dart; store parameters don't add StoreKit. On Web, JS owns tokens/browser storage; editing Flutter snapshots or creating another client is not a supported workaround for unsupportedOperation.
Cache distinctions
Android freshness is five minutes foreground/25 hours background; current iOS uses five minutes. JS uses five minutes visible/25 hours hidden, but Flutter Web doesn't forward those policies. Native verified customer caches persist; JS customer snapshots are memory-only even with persisted IndexedDB refresh tokens.
Purchase-attempt distinctions
Android 0.2.1 has encrypted history and correlated results by idempotencyKey across restart, including new Direct tracking with compatible services. iOS has no history API and doesn't send its Direct key to the server. Web uses checkout ID/status. Do not conflate these guarantees.