---
title: "What does Play Billing DEVELOPER_ERROR (5) mean?"
description: "DEVELOPER_ERROR (5) means the app used the Play Billing API wrongly: bad arguments, an unsigned app or missing permissions. Read the debug message and fix the call."
url: https://revenuedot.app/docs/errors/play-billing-developer-error
---

# What does Play Billing DEVELOPER_ERROR (5) mean?

Play Billing DEVELOPER_ERROR (5) means the app called the Play Billing API incorrectly.

## Quick facts

| | |
|---|---|
| Error | `BillingClient.BillingResponseCode.DEVELOPER_ERROR` (5) |
| Where | Google Play Billing Library (`BillingResult.responseCode`) |
| What the vendor says | The error comes from incorrect use of the API. |

## Cause

- Google's examples: invalid arguments such as an empty product list where one is required, or a misconfigured app, such as one that is not signed or lacks the permissions it needs in its manifest.
- Google also says that wrong parameters passed to `launchBillingFlow` can cause it, and that the debug message gives more detail.
- It is a fatal error for that call, so a retry with the same arguments fails again.

## Fix

1. Read `billingResult.debugMessage` and log it first; it usually names the problem.
2. Check the arguments of the failing call: a non-empty product list, product details from the same `BillingClient`, valid billing flow params.
3. Install a signed build: Google names an app that is not signed as one cause.
4. Check that the manifest has the permissions Google's integration guide requires, then rebuild.

## Example

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

// DEVELOPER_ERROR is a bug in how the app calls the API: the debug message is the fastest clue.
fun onBillingResult(result: BillingResult) {
    if (result.responseCode == BillingClient.BillingResponseCode.DEVELOPER_ERROR) {
        println("DEVELOPER_ERROR: ${result.debugMessage}")
    }
}
```

*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 `DEVELOPER_ERROR` to `PurchasesErrorCode.PurchaseInvalidError` (code 4). See [what purchaseInvalidError means](https://revenuedot.app/docs/errors/sdk-purchase-invalid-error.md).

## Related

- [What does purchaseInvalidError (code 4) mean in the purchases SDK?](https://revenuedot.app/docs/errors/sdk-purchase-invalid-error.md)
- [What does Play Billing ITEM_UNAVAILABLE (4) mean?](https://revenuedot.app/docs/errors/play-billing-item-unavailable.md)
- [What does configurationError (code 23) mean in the purchases SDK?](https://revenuedot.app/docs/errors/sdk-configuration-error.md)

## Source

- [Google: BillingResponseCode.DEVELOPER_ERROR](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
