Cannot repurchase subscription SKU — StoreKit keeps returning old expired transaction

Some users cannot repurchase a subscription SKU after it has expired. Flow:

User previously subscribed.

User canceled and the subscription fully expired.

After weeks, user reinstalls the app and taps the same SKU.

StoreKit does not create a new purchase transaction.

Instead, StoreKit always returns the old expired transaction in updatedTransactions.

Therefore, the user is permanently unable to purchase the SKU again.

We have already tried:

Adding payment observer at app launch

Calling finishTransaction for all transactions

Clearing queue at startup

SKReceiptRefreshRequest

Server-side verifyReceipt

Ensuring subscription is truly expired (not in grace/retry)

Not calling restoreCompletedTransactions

None of these resolved the issue. StoreKit still only sends the old transaction and never generates a new one.

Expected behavior: A new purchase transaction should be created when user taps the expired subscription SKU.

Actual behavior: StoreKit repeatedly pushes the old expired transaction, blocking new purchases.

We can provide: Some users cannot repurchase a subscription SKU after it has expired. Flow:

User previously subscribed.

User canceled and the subscription fully expired.

After weeks, user reinstalls the app and taps the same SKU.

StoreKit does not create a new purchase transaction.

Instead, StoreKit always returns the old expired transaction in updatedTransactions.

Therefore, the user is permanently unable to purchase the SKU again.

We have already tried:

Adding payment observer at app launch

Calling finishTransaction for all transactions

Clearing queue at startup

SKReceiptRefreshRequest

Server-side verifyReceipt

Ensuring subscription is truly expired (not in grace/retry)

Not calling restoreCompletedTransactions

None of these resolved the issue. StoreKit still only sends the old transaction and never generates a new one.

Expected behavior: A new purchase transaction should be created when user taps the expired subscription SKU.

Actual behavior: StoreKit repeatedly pushes the old expired transaction, blocking new purchases.

We can provide:

Affected user’s base64 receipt

verifyReceipt full response

Transaction logs (transactionIdentifier, original_transaction_id, productIdentifier, state)

Please help investigate why StoreKit is not allowing a new subscription purchase. Affected user’s base64 receipt

verifyReceipt full response

Transaction logs (transactionIdentifier, original_transaction_id, productIdentifier, state)

Please help investigate why StoreKit is not allowing a new subscription purchase.

Had the same problem. The problem is in unfinished transactions. They should be finished (if it make sense). We did two things to fix this issue:

  1. Call transaction.finish() for inside loop "for await transaction in Transaction.updates"
  2. Not all non-finished transactions exist in Transaction.updates. So we also finish transactions from Transaction.unfinished.

This fixed the issue.

Cannot repurchase subscription SKU — StoreKit keeps returning old expired transaction
 
 
Q