---
title: "What does Play Billing BILLING_UNAVAILABLE (3) mean?"
description: "BILLING_UNAVAILABLE (3) means Google Play cannot bill this user: an old Play Store, an unsupported country, a blocked account or a declined payment method."
url: https://revenuedot.app/docs/errors/play-billing-billing-unavailable
---

# What does Play Billing BILLING_UNAVAILABLE (3) mean?

Play Billing BILLING_UNAVAILABLE (3) means a billing problem on the user's side stopped the purchase.

## Quick facts

| | |
|---|---|
| Error | `BillingClient.BillingResponseCode.BILLING_UNAVAILABLE` (3) |
| Where | Google Play Billing Library (`BillingResult.responseCode`) |
| What the vendor says | A user billing error occurred during processing. |

## Cause

- Google lists these examples: the Play Store app on the device is out of date, the user is in an unsupported country, an enterprise administrator has turned purchases off, or Google Play cannot charge the user's payment method (for example an expired card).
- Google also names a Play Store that the system blocks, for instance in an OEM kids mode, where the `BillingResult` debug message says the Play Store is blocked.
- These are conditions on the device or the account, so an automatic retry does not fix them.

## Fix

1. Do not retry automatically. A manual retry works only after the user fixes the condition, for example by updating the Play Store.
2. Show a short message and a **Try again** button; Google notes the user probably saw the reason in the Play purchase screen.
3. Read `debugMessage` and log it, because it can name the cause, such as a blocked Play Store.
4. Do not unlock content.

## Example

```kotlin
import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.BillingResult

// No automatic retry: tell the person, and let them try again after they fix the account or update the Play Store.
fun onPurchaseResult(result: BillingResult, showMessage: (String) -> Unit) {
    if (result.responseCode == BillingClient.BillingResponseCode.BILLING_UNAVAILABLE) {
        println("BILLING_UNAVAILABLE: ${result.debugMessage}")
        showMessage("Google Play cannot complete purchases right now. Check the Play Store and your payment method, then try again.")
    }
}
```

*Not compiled: this Kotlin snippet was not built here because the docs repo has no Kotlin or Android toolchain. Check it against your Play Billing Library or SDK version before you ship it.*

## How the RevenueDot SDK reports it

The RevenueDot `purchases-android` fork maps `BILLING_UNAVAILABLE` to `PurchasesErrorCode.PurchaseNotAllowedError` (code 3), the same code as `ITEM_NOT_OWNED` and `FEATURE_NOT_SUPPORTED`. See [what purchaseNotAllowedError means](https://revenuedot.app/docs/errors/sdk-purchase-not-allowed-error.md).

## Related

- [What does Product.PurchaseError.purchaseNotAllowed mean?](https://revenuedot.app/docs/errors/storekit-purchase-error-purchase-not-allowed.md)
- [What does purchaseNotAllowedError (code 3) mean in the purchases SDK?](https://revenuedot.app/docs/errors/sdk-purchase-not-allowed-error.md)
- [What does Play Billing ITEM_UNAVAILABLE (4) mean?](https://revenuedot.app/docs/errors/play-billing-item-unavailable.md)

## Source

- [Google: BillingResponseCode.BILLING_UNAVAILABLE](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode)
- [Google: Handle BillingResult response codes](https://developer.android.com/google/play/billing/errors)
- [RevenueDot purchases-android: google/errors.kt (how the SDK maps response codes)](https://github.com/revenuedot/purchases-android/blob/revenuedot/main-patches/purchases/src/main/kotlin/com/revenuecat/purchases/google/errors.kt)

Checked: 2026-10-03
