---
title: "What does configurationError (code 23) mean in the purchases SDK?"
description: "configurationError (code 23) means your setup does not line up: no offering product could be fetched from the store, or the backend said the platform is invalid (7000)."
url: https://revenuedot.app/docs/errors/sdk-configuration-error
---

# What does configurationError (code 23) mean in the purchases SDK?

The purchases SDK raises configurationError (code 23) when its setup does not match the store or the server.

## Quick facts

| | |
|---|---|
| Error | `ErrorCode.configurationError` (iOS), `PurchasesErrorCode.ConfigurationError` (Android), code 23 |
| Where | Purchases SDK (iOS, Android and the hybrid SDKs built on them) |
| What the vendor says | There is an issue with your configuration. Check the underlying error for more details. |

## Cause

- iOS: none of the products in your offerings could be fetched from App Store Connect, or from the StoreKit configuration file when one is in use.
- An offering exists but has no products for this app's store, or the API key belongs to a store with no products registered.
- The backend answered 7000 (invalid platform), 7255 (could not create alias) or 8077; Android also maps 7230 (invalid package name) here.

## Fix

1. Compare product IDs: the ID in the offering must equal the store's product ID exactly, and each product must be approved and ready to sell.
2. Use the iOS app's key in the iOS build and the Android app's key in the Android build.
3. Mark an offering as current and add this app's products to its packages.
4. Read the SDK's message with debug logs; it says which case applies.

## Example

```swift
// The purchases SDK throws `ErrorCode` values; match the one you handle and let the rest fall through.
func handle(_ error: Error) {
    guard let code = error as? ErrorCode else {
        print("Not a purchases SDK error: \(error)")
        return
    }
    switch code {
    case .configurationError:
        // A setup problem: do not retry. Alert yourself and show a neutral message.
        print("The SDK configuration does not match the store")
    default:
        print("Other purchases error: \(code.description)")
    }
}
```

*Compile-checked: `npm run check:snippets` type-checks this snippet with `swiftc` together with the `ErrorCode.swift` file of the RevenueDot `purchases-ios` fork (checked 2026-10-03).*

## How the RevenueDot SDK reports it

Deep dive: [revenuedot.app/errors/configuration-error](https://revenuedot.app/errors/configuration-error). See [common problems](https://revenuedot.app/docs/help/troubleshooting.md).

## Related

- [What does invalidCredentialsError (code 11) mean in the purchases SDK?](https://revenuedot.app/docs/errors/sdk-invalid-credentials-error.md)
- [What does productNotAvailableForPurchaseError (code 5) mean in the purchases SDK?](https://revenuedot.app/docs/errors/sdk-product-not-available-for-purchase-error.md)
- [What does Play Billing DEVELOPER_ERROR (5) mean?](https://revenuedot.app/docs/errors/play-billing-developer-error.md)
- [What RevenueDot's API errors mean (server codes)](https://revenuedot.app/docs/api/errors.md)

## Source

- [RevenueDot purchases-ios: ErrorCode.swift (the iOS ErrorCode enum)](https://github.com/revenuedot/purchases-ios/blob/revenuedot/main-patches/Sources/Generated/ErrorCode.swift)
- [RevenueDot purchases-android: PurchasesErrorCode.kt (the Android enum)](https://github.com/revenuedot/purchases-android/blob/revenuedot/main-patches/purchases/src/main/kotlin/generated/com/revenuecat/purchases/PurchasesErrorCode.kt)
- [RevenueDot purchases-ios: BackendErrorCode.swift (backend code mapping)](https://github.com/revenuedot/purchases-ios/blob/revenuedot/main-patches/Sources/Error%20Handling/BackendErrorCode.swift)
- [RevenueDot purchases-android: common/errors.kt (backend code mapping)](https://github.com/revenuedot/purchases-android/blob/revenuedot/main-patches/purchases/src/main/kotlin/com/revenuecat/purchases/common/errors.kt)

Checked: 2026-10-03
