What does Play Billing SERVICE_TIMEOUT (-3) mean?
Play Billing SERVICE_TIMEOUT (-3) means a request reached its maximum timeout before Google Play could answer.
Quick facts#
| Error | BillingClient.BillingResponseCode.SERVICE_TIMEOUT (-3) |
| Where | Google Play Billing Library (BillingResult.responseCode) |
| What the vendor says | The request has reached the maximum timeout before Google Play responds. |
Cause#
- Google gives an example: a delay in executing the action that the Billing Library call asked for.
- Only Billing Library 5.2.0 and earlier return it. From 6.0.0
SERVICE_UNAVAILABLEis returned for the same problem andSERVICE_TIMEOUTis deprecated. - Unlike
SERVICE_DISCONNECTED, the connection to the billing service is still up.
Fix#
- Retry the same Billing Library call. Use a simple retry for something the person waits on, and exponential backoff for background work.
- Do not call
startConnection()again, because the connection is not severed. - Upgrade the Billing Library. Version 8 is required for new apps and updates from 2026-08-31, and it never returns this code.
- Treat
SERVICE_UNAVAILABLEthe same way, so one handler covers both.
Example#
Kotlin
import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.BillingResult
import kotlinx.coroutines.delay
// Retry the same call on a timeout; the connection is fine (Google's guidance for code -3).
suspend fun <T> retryOnTimeout(maxTries: Int = 3, call: suspend () -> Pair<BillingResult, T>): Pair<BillingResult, T> {
var result = call()
var tries = 1
while (result.first.responseCode == BillingClient.BillingResponseCode.SERVICE_TIMEOUT && tries < maxTries) {
delay(2_000L * tries)
result = call()
tries++
}
return result
}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 SERVICE_TIMEOUT to PurchasesErrorCode.StoreProblemError (code 2) and, inside its own billing code, treats it as ServiceUnavailable. See what storeProblemError means.
Related#
- What does Play Billing SERVICE_UNAVAILABLE (2) mean?
- What does Play Billing SERVICE_DISCONNECTED (-1) mean?
- What does storeProblemError (code 2) mean in the purchases SDK?
Source#
- Google: BillingResponseCode.SERVICE_TIMEOUT
- Google: Handle BillingResult response codes
- RevenueDot purchases-android: google/errors.kt (how the SDK maps response codes)
- RevenueDot purchases-android: google/BillingResponse.kt
Checked: 2026-10-03