Purchase error codes
Find which Voidhash SDK a product, purchase, restore, transaction-report or store action error code comes from.
These codes come from buying, restoring, syncing and reporting purchases and from store actions in the client SDKs. Codes from other areas are in SDK error codes. The Web SDK doesn't sell products; Stripe reports checkout errors.
A purchase the person cancels and one waiting for approval, such as Ask to Buy, aren't errors: the
purchase call returns them as cancelled and pending results.
| Code | Platforms | Meaning |
|---|---|---|
FAILED_TO_GET_PRODUCTS | Swift, Kotlin, React Native | The store returned no product details, for example offline. |
INVALID_PRODUCT_ID | Swift | The product isn't loaded from the App Store. |
SKU_NOT_FOUND | Kotlin | Google Play doesn't sell the product, or its details weren't loaded. |
PURCHASE_IN_PROGRESS | Swift, Kotlin, React Native | Another purchase, from your code or a paywall, is still running. Nothing was bought. |
INVALID_ARGUMENT | Swift, Kotlin, React Native | A quantity other than 1 for anything but an App Store consumable, or a Google Play plan change (replacing) that names no other subscription. Nothing was bought. |
OFFER_UNAVAILABLE | Swift, Kotlin, React Native | The selected offer isn't one of the product's offers, the store doesn't offer it to the person, or Voidhash couldn't be reached to sign an App Store promotional offer. Nothing was bought; it never falls back to the regular price. |
PURCHASE_FAILED | Swift, Kotlin | The store failed the purchase, or a Google Play subscription has no base plan offer. |
BILLING_ERROR | Kotlin | Play Billing failed while buying, for a reason the other codes don't name. Its reason is INELIGIBLE_FOR_OFFER or PAYMENT_DECLINED when Google Play said why. |
FAILED_TO_PURCHASE | React Native | The purchase failed; nothing was bought. Its reason is ineligibleForOffer or, on Android, paymentDeclined when the store said why. Otherwise the native code is in the message. |
PURCHASE_UNKNOWN_RESULT | Swift, Kotlin | The store returned a purchase result the SDK doesn't know. |
PURCHASE_EMPTY | Kotlin | Google Play reported success but returned no purchase. |
ITEM_ALREADY_OWNED | Kotlin | Google Play says the person already owns the product. The SDK then delivers and finishes what it owns. |
REPLACED_SUBSCRIPTION_NOT_OWNED | Kotlin, React Native | The Google Play account doesn't own the subscription the purchase was to replace. Nothing was bought. |
SUBSCRIPTION_REPLACEMENT_REFUSED | Kotlin, React Native | Google Play refused a subscription replacement before its sheet opened. Nothing was bought. |
TRANSACTION_VERIFICATION_FAILED | Swift | StoreKit couldn't verify the transaction, or Voidhash rejected it. |
TRANSACTION_NOT_FOUND | Swift | Voidhash accepted the transaction, but the SDK no longer held it to finish with StoreKit. |
WINDOW_SCENE_NOT_FOUND | Swift | No active window scene to show the App Store sheet from. |
PAYWALL_PRESENTER_NOT_AVAILABLE | Swift | A development-mode purchase ran without UIKit, such as on macOS. |
GOOGLE_BILLING_NOT_INITIALIZED | Kotlin | Google Play services are missing, or Play Billing setup didn't finish. |
CURRENT_ACTIVITY_NULL | Kotlin | No activity was available to launch the sheet from. |
CONNECTION_ENDED | Kotlin | The billing connection closed during the purchase. |
USER_CANCELLED | Swift | The person dismissed the App Store sign-in during a restore, or StoreKit reported a cancel by throwing. |
FAILED_TO_RESTORE_PURCHASES | Swift, React Native | The store couldn't be reached, or a receipt isn't confirmed yet. |
BILLING_CONNECTION_FAILED | Kotlin | Play Billing didn't connect: Google Play services are missing or updating. |
STORE_UNAVAILABLE | Kotlin | Google Play couldn't be reached to buy, or couldn't list owned purchases. |
FAILED_TO_SYNC_PURCHASES | React Native | The store couldn't be read. |
RECONCILE_TRANSACTIONS_FAILED | Swift, Kotlin | A restore or sync couldn't deliver a purchase to Voidhash. The SDK keeps it and retries. |
INVALID_TRANSACTION | Swift, Kotlin | reportTransaction got an empty transaction ID or purchase token. |
FAILED_TO_REPORT_TRANSACTION | React Native | reportTransaction got an invalid input. |
TRANSACTION_NOT_DURABLE | Kotlin | The device couldn't store the report, for example with a full disk or before its first unlock. |
FAILED_TO_SHOW_MANAGE_SUBSCRIPTIONS | Swift, React Native | The store's subscription management couldn't open. |
FAILED_TO_PRESENT_CODE_REDEMPTION | Swift, React Native | The offer code sheet couldn't open. |
REFUND_REQUEST_FAILED | Swift | appStore.beginRefundRequest couldn't open the sheet or send the request. |
FAILED_TO_GET_SUBSCRIPTION_STATUS, FAILED_TO_GET_APP_TRANSACTION | Swift, React Native | An appStore read failed. |
UNSUPPORTED_PLATFORM | React Native | An appStore method on Android, or a googlePlay method on iOS. |
FAILED_TO_GET_STOREFRONT, FAILED_TO_CHECK_CAN_MAKE_PAYMENTS | React Native | getStorefront() or canMakePayments() couldn't read the store; its code is in the message. |
FAILED_TO_BEGIN_REFUND_REQUEST, FAILED_TO_GET_CURRENT_ENTITLEMENTS | React Native | iOS. The appStore method of that name failed; the App Store's code is in the message. |
FAILED_TO_SHOW_IN_APP_MESSAGES, FAILED_TO_QUERY_PURCHASES, FAILED_TO_CHECK_FEATURE_SUPPORT | React Native | Android. The googlePlay method of that name failed; Google Play's code is in the message. |
Details: Swift, Kotlin and React Native.
Next steps
- SDK error codes for configuration, paywalls, identity and network.
- Plan changes and refunds.
- Troubleshooting: causes by symptom.
Something wrong or missing on this page? Tell us by email or on Discord.