What does Product.PurchaseError.paymentMethodBindingConfigurationRequired mean?

Product.PurchaseError.paymentMethodBindingConfigurationRequired means the customer has no payment method on their Apple Account, so they must add one before the purchase can go through.

Quick facts#

Error Product.PurchaseError.paymentMethodBindingConfigurationRequired
Where StoreKit 2, Swift (Product.purchase(options:))
Available since iOS 26.5, iPadOS 26.5, macOS 26.5, tvOS 26.5, watchOS 26.5, visionOS 26.5
What the vendor says The customer needs to add a payment method to their Apple Account before making a purchase; use PaymentMethodBinding to prompt the customer and bind the payment method.

Cause#

  • Apple says the customer has no usable payment method on their Apple Account at the time of the purchase.
  • PaymentMethodBinding is available only to eligible apps with server entitlements. Its initializer throws if the app lacks the entitlement or the person is not eligible (PaymentMethodBinding).
  • The error exists from iOS 26.5, so older systems never throw it.

Fix#

  1. Catch the error and start the binding flow: your server asks Apple for an in-app binding identifier, the app creates PaymentMethodBinding(id:) with it and calls bind().
  2. bind() shows the system prompt where the customer confirms the new payment method as their primary one. Retry the purchase when it returns.
  3. If the initializer throws, the app or the customer is not eligible. Show a message that points to Settings and the Apple Account payment methods instead.
  4. Guard the code with an availability check for iOS 26.5 and keep a generic error path for earlier versions.

Example#

Swift
import StoreKit

// When the customer has no payment method, bind one with the identifier your server got from Apple, then buy again.
@available(iOS 26.5, *)
func buy(_ product: Product, bindingID: () async -> String?) async {
    do {
        _ = try await product.purchase()
    } catch Product.PurchaseError.paymentMethodBindingConfigurationRequired {
        guard let id = await bindingID() else { return }
        do {
            let binding = try await PaymentMethodBinding(id: id)
            try await binding.bind()
            print("Payment method bound; buy again")
        } catch {
            print("Binding failed: \(error)")
        }
    } catch {
        print("Purchase failed: \(error)")
    }
}

Compile-checked: npm run check:snippets type-checks this snippet with swiftc against the Apple SDK (macOS target, checked 2026-10-03).

How the RevenueDot SDK reports it#

The RevenueDot purchases-ios fork maps Product.PurchaseError.paymentMethodBindingConfigurationRequired to ErrorCode.storeProblemError (code 2). The branch is compiled only with Xcode 26.5 or newer. The SDK does not start the binding flow for you.

Source#

Checked: 2026-10-03

Edit this page on GitHub ↗ View as Markdown Last updated