fix(kit): clarify ios subscription identity#214
Conversation
Expose originalTransactionId on iOS subscription rows while keeping purchaseToken as the backwards-compatible stable identity. Document that subscription list responses do not return raw StoreKit JWS values.
|
Warning Review limit reached
Next review available in: 24 seconds Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces changes to expose the originalTransactionId field for iOS subscription rows. Specifically, it updates the subscriptionShape schema and the shapeSubscriptionRow function in packages/kit/convex/subscriptions/query.ts to map the purchaseToken to originalTransactionId when the platform is iOS. It also adds corresponding unit tests in query.test.ts and updates the API documentation in api.tsx to describe subscription identity fields. There are no review comments, so I have no feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
## Summary - Publish OpenIAP Spec **2.1.0** in this PR and target **openiap-google 2.3.0** for the CI-promoted stable package. - Upgrade the Google implementation to Play Billing **9.1.0** with `BILLING_CHOICE`, developer-rendered choice metadata/dialog/reporting, `originalExternalTransactionId`, and `showInAppMessagesAndroid`. - Wire the complete Android surface through React Native/Nitro, Expo, Flutter, Godot, KMP, and MAUI, including hooks, listeners, generated types, examples, and store-specific unsupported behavior. - Consolidate the upcoming stable release notes by platform package, IAPKit, and framework library; update Android/API docs and durable parity/release workflow rules. - Clarify IAPKit purchases as verification snapshots and update examples to verify, finish, then reverify the same token. ## Versioning - OpenIAP Spec: **2.1.0** (directly bumped here) - openiap-google stable target: **2.3.0** (source remains `2.3.0-rc.1` until CI promotion) - openiap-apple stable target: **2.2.5** (source remains `2.2.5-rc.1` until CI promotion) - Framework stable targets in release notes: react-native-iap 15.4.0, expo-iap 4.4.0, flutter_inapp_purchase 9.4.0, godot-iap 2.4.0, kmp-iap 2.4.0, OpenIap.Maui 1.2.1 ## Related - Closes #221 - Addresses the verification lifecycle concern in #209 - Includes #214 in the consolidated stable release notes - Applies the package/framework changelog grouping requested in #206 ## Verification - GQL generation and platform sync, including `yarn specs` for Nitro - `bun audit:parity`, `bun audit:docs`, and staged diff checks, repeated after a five-minute no-change interval - Google Play/Horizon/Amazon compile and unit-test matrix - Apple `swift build` and 104 Swift tests - React Native 345 tests plus Android example build across Kotlin/C++ ABIs - Expo 303 library tests plus 76 config-plugin tests - Flutter analyze plus 281 tests - KMP Play/Amazon/Horizon compiles and tests - Godot Android/iOS artifact and example checks - MAUI shared and Play/Amazon/Horizon builds - IAPKit lint, 572 tests, production build, compiled-server smoke probes - Docs typecheck, formatting, audit, and production build ## Connected-device E2E - **Google Play / Pixel:** exercised Billing Choice availability and `showInAppMessagesAndroid`; the test account returned program-unavailable and `no-action-needed`, both handled correctly. - **Fire OS:** reran app launch/catalog fetch and purchase-state reads; the earlier branch matrix covered React Native, Expo, Flutter, and MAUI purchase/fulfill/cancel paths. - **Vega:** reran React Native and Expo launches; the earlier Expo flow completed approved purchase and fulfillment. - **Apple:** physical iPhone on iOS 26.5.2 passes build/install/launch. Purchase UI automation is still blocked because Maestro hangs after detecting the physical device. - **Meta Horizon:** package/framework Horizon builds pass, but connected purchase E2E is blocked because the Quest remains `adb unauthorized`; the headset must accept the USB debugging prompt. ## Preview The visible changes are API/reference documentation and native SDK examples. Documentation production build and connected example-app launch checks cover those surfaces.
Summary
originalTransactionIdon iOS subscription rows while keepingpurchaseTokenbackward-compatibleRefs #213
Test plan
bun audit:docsbun run --filter @hyodotdev/openiap-kit lintbun run --filter @hyodotdev/openiap-kit format:checkbun run --filter @hyodotdev/openiap-kit testbun run --filter @hyodotdev/openiap-kit smoke:serverPreview
No separate recording attached: this is a narrow API response/docs clarification.
smoke:serverbuilt the docs app and browser-probed the mounted page successfully.