---
title: "What does StoreKitError.systemError mean?"
description: "StoreKitError.systemError means the system failed a StoreKit 2 call, and it wraps the underlying error. How to read it, what to retry and how the SDK maps it."
url: https://revenuedot.app/docs/errors/storekit-error-system-error
---

# What does StoreKitError.systemError mean?

StoreKitError.systemError means the operating system reported a failure during a StoreKit 2 call and passes the underlying error along.

## Quick facts

| | |
|---|---|
| Error | `StoreKitError.systemError(Error)` |
| Where | StoreKit 2, Swift (`StoreKitError`) |
| Available since | iOS 15.0, iPadOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, visionOS 1.0 |
| What the vendor says | A system error occurred. |

## Cause

- The system, not your app's request, failed the operation. The case carries the underlying `Error`, which is the only place the detail lives.
- Apple does not list what triggers it. Treat it as a failure outside your code that may be temporary.
- Because the cause is not documented, do not assume a product or configuration problem until the underlying error shows one.

## Fix

1. Log `underlying.localizedDescription` and its `NSError` domain and code, so you can group repeated failures.
2. Retry once after a short pause. If it keeps failing, check that the device has an App Store account signed in and that the App Store app works.
3. Test on a second device or account to separate a device problem from a setup problem.
4. Keep the paywall open and tell the person the store had a problem. Do not unlock content.

## Example

```swift
import StoreKit

// The underlying error is the only detail StoreKit gives you, so log it before you show a generic message.
func refreshProducts(ids: [String]) async {
    do {
        let products = try await Product.products(for: ids)
        print("Loaded \(products.count) products")
    } catch StoreKitError.systemError(let underlying) {
        let ns = underlying as NSError
        print("StoreKit system error: domain \(ns.domain), code \(ns.code), \(ns.localizedDescription)")
    } catch {
        print("Other error: \(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 `StoreKitError.systemError` to `ErrorCode.storeProblemError` (code 2) and keeps the system error as the underlying error. Retrying once is reasonable; see [what storeProblemError means](https://revenuedot.app/docs/errors/sdk-store-problem-error.md).

## Related

- [What does storeProblemError (code 2) mean in the purchases SDK?](https://revenuedot.app/docs/errors/sdk-store-problem-error.md)
- [What does StoreKitError.unknown mean?](https://revenuedot.app/docs/errors/storekit-error-unknown.md)
- [What does StoreKitError.networkError mean?](https://revenuedot.app/docs/errors/storekit-error-network-error.md)

## Source

- [Apple: StoreKitError.systemError(_:)](https://developer.apple.com/documentation/storekit/storekiterror/systemerror%28_:%29)
- [Apple: StoreKitError](https://developer.apple.com/documentation/storekit/storekiterror)
- [RevenueDot purchases-ios: StoreKitError+Extensions.swift (how the SDK maps StoreKit 2 errors)](https://github.com/revenuedot/purchases-ios/blob/revenuedot/main-patches/Sources/Error%20Handling/StoreKitError%2BExtensions.swift)

Checked: 2026-10-03
