# StoreKit configuration and purchase copy

Bundle: com.gallaxgames.smallworlds. All five products are non-consumable, bought once and restorable with the same Apple Account. Proposed UK prices below are local test values; the production interface always uses Apple's current localized displayPrice. Family Sharing is disabled in the local configuration. No subscriptions, paid random rewards, premium currency, advertising SDK or ad-removal purchase exists.

| Product suffix | Display name | Exact benefit | Proposed GBP |
|---|---|---|---:|
| amber | Amber field coat | Permanent warm amber explorer appearance; no gameplay multiplier. | 1.99 |
| indigo | Indigo field coat | Permanent indigo explorer appearance; no gameplay multiplier. | 1.99 |
| garden | Living camp garden | Original planted camp border artwork at every camp stage; cosmetic. | 1.99 |
| lanterns | Paper lantern camp | Original warm lantern-string artwork at every camp stage; cosmetic. | 1.99 |
| archive | Deep field archive | Offline journeys credited up to 32 hours per absence, compared with the free 8-hour starting hold and up to 24-hour earned hold. Does not unlock exclusive encounters or paths. | 2.99 |

Prefix every suffix with `com.gallaxgames.smallworlds.` to obtain the exact product ID. The title and description in Configuration/SmallWorlds.storekit are the proposed en-GB/en-US purchase copy. All purchases survive study publication, new field seasons and local camp recovery when their records are readable. Only one outfit and one camp decoration are active at a time; the original coat/camp are always available. Buying a cosmetic does not automatically select it; Use this keepsake applies it. Refunded entitlements stop providing their visual or hold benefit.

## Actual local implementation and verification

StoreKit 2 requests all products, uses Apple's purchase sheet, verifies transactions, saves delivery before finishing, deduplicates transaction IDs and listens for transaction updates. Pending approval delivers only after confirmation. Cancelled or unavailable purchases grant nothing. Save failure leaves an unfinished transaction available for retry. Restore explicitly calls AppStore.sync. Verified refunds revoke ownership; unavailable receipts never silently discard cached ownership merely because product metadata can load.

Tests/AppTests/PurchaseTests.swift runs SKTestSession against the bundled test configuration. It verifies all five non-consumables, exactly-once delivery, saved ownership, study/season preservation, restore, approval-pending, interrupted delivery, unavailable storage retry, refund, offline catalogue, cancellation and unavailable product failure. The local UI also displays each test product and its price. These tests use Apple's Xcode StoreKit environment. No real money was charged.

## Live configuration still required

The .storekit file does not create App Store Connect products. The release application contains no local product catalogue, fake store, fixture save or unlock button. Create the separate app record and these five matching product IDs in the owner's App Store Connect account, set actual territories/prices/tax category, add localized copy and the supplied IAP review screenshots, and attach the initial products to the app version for review. Confirm Paid Apps agreements, tax/banking and any required business details. Test on a signed physical device with Apple's sandbox and then TestFlight. Production receipt and real payment verification are not claimed here.

Public purchase copy should say “Optional permanent keepsakes. The whole field survey is free.” Never describe these as creature packs or imply that rare research requires spending.

Apple references: [StoreKit testing environments](https://developer.apple.com/documentation/storekit/testing-at-all-stages-of-development-with-xcode-and-the-sandbox), [Xcode local StoreKit setup](https://developer.apple.com/documentation/xcode/setting-up-storekit-testing-in-xcode/), [In-App Purchase configuration](https://developer.apple.com/help/app-store-connect/configure-in-app-purchase-settings/overview-for-configuring-in-app-purchases).
