StoreKit sandbox consumable purchase returns restored on second purchase instead of completing a new purchase

I am testing a consumable in-app purchase in the StoreKit sandbox and I am seeing behavior that does not seem correct on repeat purchase attempts.

Product details

Product ID: album.credit.v2

Type: Consumable

Test environment: iOS device + StoreKit sandbox

Purchase flow triggered from my Flutter app using Apple IAP

What happens

First purchase attempt works

My backend receives the confirmation

The album is granted correctly

On the second purchase attempt of the same consumable, I do not get a normal new purchase flow

Instead, StoreKit returns the product as restored

My app then cancels the attempt because a restored transaction arrived during checkout

Expected behavior Because this product is a consumable, each purchase attempt should behave like a new purchase and allow the user to buy it again.

Actual behavior On the second attempt, the transaction update comes back as restored instead of a new successful consumable purchase.

Relevant logs First successful purchase:

[ProPurchasePage] ✅ Pay tapped. starting=false iap=true albumProd=album.credit.v2 proProd=pro.monthly [IAP] update: id=album.credit.v2 status=PurchaseStatus.restored pendingComplete=false err=null [IAP] expected=album.credit.v2 starting=true appleFlow=true [ProPurchasePage] album credit success status=PurchaseStatus.restored receiptLen=5334 [AppleIapService] Sending Apple IAP confirmation for albumId=ariie_west_pretty_girl_summer, buyerUid=PYjgu9TMCieCVDLIdTuawY5k4Ay2 [AppleIapService] appleIapConfirm response status: 200 [AppleIapService] appleIapConfirm applied for albumId=ariie_west_pretty_girl_summer buyerUid=PYjgu9TMCieCVDLIdTuawY5k4Ay2

After that, the purchase is written correctly on my side:

"libraryAlbums": [ { "AlbumId": "ariie_west_pretty_girl_summer", "paid": true, "Quantity": 1 } ]

Second and later attempts:

[ProPurchasePage] ✅ Pay tapped. starting=false iap=true albumProd=album.credit.v2 proProd=pro.monthly [ProPurchasePage] buyConsumable (album.credit.v2) returned: true [IAP] update: id=album.credit.v2 status=PurchaseStatus.restored pendingComplete=false err=null [IAP] expected=album.credit.v2 starting=true appleFlow=true [IAP] restored arrived during album checkout — cancelling attempt

Question Is this expected StoreKit sandbox behavior for a consumable, or does this suggest:

a StoreKit sandbox issue,

a problem with how the product is configured in App Store Connect,

or a transaction-handling issue in the app/plugin layer?

Also, is there any Apple-recommended handling for repeated consumable purchases when sandbox keeps surfacing a restored status?

StoreKit sandbox consumable purchase returns restored on second purchase instead of completing a new purchase
 
 
Q