Integrations
Google Play
The Android Publisher endpoints used, the scope and permissions required, and the limits of what the provider can do.
Google Play is the only store supported today. The adapter targets the Android Publisher v3 API.
Authentication
A service-account JSON key, exchanged for an access token on the single scope:
https://www.googleapis.com/auth/androidpublisher
The token is minted inside the credential vault, and authenticated requests execute there. The key never reaches the application runtime.
Endpoints used
| Operation | Method and path |
|---|---|
| List subscriptions | GET applications/{package}/subscriptions |
| List one-time products | GET applications/{package}/oneTimeProducts |
| List subscription offers | GET applications/{package}/subscriptions/{id}/basePlans/{id}/offers |
| List purchase-option offers | GET applications/{package}/oneTimeProducts/{id}/purchaseOptions/{id}/offers |
| Convert regional prices | POST applications/{package}/pricing:convertRegionPrices |
The vault allows exactly these shapes and nothing else. A request that does not match one is refused before it leaves the boundary, with "Google operation is not allowed." Query parameters are restricted to pageSize and pageToken.
Price conversion is a read. It asks Google what a price would convert to; it sets nothing.
Permissions
One OAuth scope covers every call above, so scope is never the cause of a permission failure. What differs is the Play Console permission granted to the service account.
This distinction produces the most common support question:
Imported, but Google's store baseline could not be read for 2 plan(s): The caller does not have permission
A read-only grant — View app information and download bulk reports — is enough to list subscriptions and one-time products. It is not enough to call the monetization pricing endpoint. So the catalogue imports correctly and only the baseline column comes back empty.
The fix is in Play Console under Users and permissions: grant the service account the monetization permission on the affected apps, wait a few minutes for propagation, then re-sync. Confirm the exact permission name against your console, as Google has renamed these.
To check independently, call pricing:convertRegionPrices directly with the same service account. Google's full error body sometimes distinguishes "The caller does not have permission" (a permission grant) from "This developer account does not own the application" (the wrong account entirely); Paywall Parity only relays the summary message.
Capabilities
| Capability | Supported |
|---|---|
| Regional price conversion | Yes |
| Regional price publishing | Yes, gated |
| Read-back verification | Yes |
Retries and failures
429 and 5xx are retried up to three times with exponential backoff. 4xx responses other than 429 are not retried — they will not succeed on a second attempt.
Response bodies are truncated and parsed for error.message before surfacing. Unstructured provider bodies are never returned to the client.
Limits to know about
- Subscription price changes apply to new customers. Existing subscribers are governed by Google's own policy and consent rules. Deployments say this explicitly rather than leaving it implied.
- Conversion is anchored on the US price. A plan not sold in the United States has no baseline.
- Region versions matter. Each conversion response carries a region version, stored with the baseline. Baselines from different region versions are not directly comparable.
- Live minimum, maximum, and billable-unit validation is not implemented. Rounding uses the market registry's increments, not Google's live constraints, so a rounded price is not yet guaranteed to be a valid store price point.