Quick Answer
Google Sign-In error 10, DEVELOPER_ERROR, means the Android app is misconfigured. If sign-in works locally but fails in a Play closed test, check that the Play installed app's signing SHA-1 and its final package name are registered in the correct Firebase or Google Cloud project, and that any serverClientId or webClientId is the Web application client ID, not the Android one. Then retest with the build installed from Google Play.
Choose your setup
Already added the SHA-1? Go to what to check next.
The scope here is one failure: native Google sign-in that breaks in the copy Google Play delivers. It separates that from other errors that look similar, then covers frameworks, other sign-in providers and what testers should report. Every Google page cited here was checked on October 16, 2026, and community reports are labelled as such. The sources are listed at the end.
On this page
Fix Google Sign-In in the Play build
Match the app your testers installed to the package name and signing SHA-1 registered for it. Work through these steps in order; the Firebase and Google Cloud routes follow.
Confirm which copy is failing
Check that the tester installed the app from your closed test on Google Play, and note the version they have. Then note the final application ID of that build. Android's build guide says your application ID is defined by the applicationId property, which can differ from your source namespace or gain a suffix in a build flavor. If the tester cannot install the app at all, that is a different problem: see why an app is not available to testers.
Open Play app signing
In Play Console, open the app and go to Protected with Play. Google moved app signing there in May 2026, and its own help names the next step two ways (table below). Either route ends at the same page.
| Route as Google writes it | Where Google uses it | What to open there |
|---|---|---|
| Protected with Play > Play Store distribution > Go to Play app signing | Where Google uses itPlay Console Help, Use Play App Signing, API registration section | What to open thereApp signing key certificate, then the SHA-1 value |
| Protected with Play > Play Store protection > Manage Play app signing | Where Google uses itGoogle Play's May 2026 update notes and another section of the same help page | What to open thereThe same page; menu labels can differ between accounts |
Copy the app signing key SHA-1
Open the App signing key certificate section, not the upload key certificate, and copy its SHA-1. If Play lists more than one signing key for your app, register each applicable fingerprint (see multiple signing certificates). Keep your existing debug and local fingerprints and add the Play ones beside them. Do not rotate your signing key to fix sign-in.
Register it where your app signs in
Use the Firebase route or the Google Cloud route, whichever your app uses, and use the same project that issued the client IDs inside your app.
Retest the installed Play build
If you only changed a registration in Firebase or Google Cloud, retry with the copy already installed from Play before you build anything; developers have reported that a registration-only fix worked without a new upload. If you changed bundled configuration, a client ID, code or a dependency, upload a new build to the same closed track and test that one. Google publishes no fixed time for a new fingerprint to take effect, so retest instead of waiting a set number of hours.
Add the Play certificate in Firebase
Select the matching Android app before you add its Play signing fingerprint. The steps follow Firebase's fingerprint help and its Google sign-in guide.
- In the Firebase console, open the project your app uses, then Project settings > General.
- Under Your apps, select the Android app whose package name matches the failing build.
- Click Add fingerprint, paste the Play app signing SHA-1 and save. Add it next to the existing fingerprints rather than replacing them.
- Under Authentication > Sign-in method, confirm that Google is enabled.
- If Firebase prompts you to download an updated
google-services.json, replace the file in your project. Firebase says the file “contains the OAuth client information required for Google sign-in,” so a changed file means a new build. Check that its project and package match the failing app.
Add a SHA-256 only where a specific Firebase service asks for one. Phone authentication, for example, uses SHA-256 for its Play Integrity path; Google Sign-In itself relies on the SHA-1.
Configure Google Cloud without Firebase
Two OAuth clients do two different jobs. The Android client registers your app; the Web client ID is the one your token request uses.
| Client type | What it holds | Where you use it |
|---|---|---|
| Android | What it holdsYour package name and the SHA-1 of the signing certificate | Where you use itRegisters the native app identity. You do not paste this client ID into serverClientId. |
| Web application | What it holdsThe Web client ID | Where you use itThe serverClientId or webClientId in your token request, and the audience your backend accepts. Google's Sign in with Google codelab describes it as acting “as the backend client for the Google Sign-in service.” |
- Select the project that issued your client IDs, then open Google Auth platform > Clients (Google Cloud help).
- Look for an existing Android client with this package name and SHA-1 before you create another.
- If it is missing, choose Create Client, set Application type to Android, enter a name, the package name and the Play app signing SHA-1, then Create. The Android form has a SHA-1 field; a SHA-256 does not go there.
- Register each package and certificate pair you need, for example debug, local release and Play.
- Leave the Web client in place for the token request, and never put a client secret inside the app.
Prove the repair
One successful sign-in does not prove the release is fixed. This checklist is our recommended acceptance test, not a Google rule; the last row matters because one developer's login passed once and still failed on the next sign-in, a session problem that a single check would miss.
| Check | Passing evidence | If it fails |
|---|---|---|
| Correct app and version | Passing evidenceThe tester confirms the intended Play installation and build | If it failsResolve release or track delivery first |
| First sign-in | Passing evidenceChoosing an account returns to a signed-in app | If it failsCapture the exact exception and use the error table below |
| Protected feature | Passing evidenceThe tester can use a feature that needs sign-in | If it failsInspect the app and backend token handling |
| Sign out and back in | Passing evidenceA second sign-in works without reinstalling | If it failsInvestigate session and provider sign-out handling |
| Previously affected device | Passing evidenceThe same tester and device now succeed | If it failsCompare certificate, OS, account and the actual build |
| Test continuity | Passing evidenceThe tester is still opted in and you recorded the fix | If it failsFix enrollment separately from sign-in |
Why does sign-in work in debug but fail in closed testing?
The app installed through Google Play can have a different signer from the APK you install locally. Google's client authentication guide notes that “Android Studio automatically signs your app with a debug certificate.” A release you build yourself uses whatever key that variant is configured with. With Play App Signing, your upload key signs the bundle you upload, and Google signs the APKs your testers receive with the app signing key.
Those keys have different roles, but they are not always different values: you can supply your own signing key, and some setups use one key for two roles. Compare the actual fingerprints rather than the key labels.
| Installed copy | Certificate to check | First action |
|---|---|---|
| Play internal, closed, open or production install with Play App Signing | Certificate to checkThe Play app signing certificate or certificates, found under Protected with Play | First actionRegister each applicable Play SHA-1 |
| Android Studio debug run | Certificate to checkThat machine's debug certificate | First actionRegister that SHA-1 for the matching application ID |
| Release APK built on your machine | Certificate to checkThe certificate configured for that release variant | First actionDo not assume “release” means Google's signer |
| Internal app sharing link | Certificate to checkInternal app sharing's own test certificate | First actionRegister it separately if testers use that route |
Internal app sharing is not internal testing
Google's internal app sharing help says “Every APK is resigned with this test certificate.” Find it under Test and release > Internal testing > Internal app sharing > Uploaders and testers > Internal test certificate. Internal testing and closed testing tracks use your Play app signing key instead.
Read the fingerprints yourself
For builds on your machine, the Gradle signing report prints the SHA-1 and SHA-256 of every variant, and keytool reads the debug keystore directly (enter the keystore password when asked):
./gradlew signingReport
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
A local signing report does not tell you what signed the Play copy. To check the failing build itself, install it from the closed test on a device, pull it with adb and print its certificates with apksigner, which Google documents as showing “information about the APK's signing certificates.” Replace the package name and use the path the first command prints:
adb shell pm path com.example.app
adb pull /data/app/.../base.apk failing-play.apk
apksigner verify --print-certs failing-play.apk
I added the SHA-1 and it still fails
Compare the failing APK's certificate, its final application ID and the client IDs before changing more settings. Work down this ladder; each row rules out one layer.
| Check | What to compare | Decision |
|---|---|---|
| 1. Installed copy and track | What to compareThe tester's actual Play install against the version you meant to test | DecisionA local signing report is not proof of the Play signer |
| 2. Certificate | What to compareThe output of apksigner verify --print-certs on the failing Play APK against what you registered |
DecisionRegister every needed signer; keep older entries that still serve installed users |
| 3. Final application ID | What to compareThe built variant's applicationId, including flavor suffixes, against the registered package | DecisionThe source namespace does not count |
| 4. Project and Web client | What to compareThe project and Web client ID your release build and backend actually use | DecisionA typo here breaks sign-in even with correct fingerprints |
| 5. Provider and clients exist | What to compareGoogle enabled as a provider, plus the Android and Web clients behind it | DecisionIf another project claims the pair, see the conflict note below |
| 6. Error family | What to compareNative code 10, a Credential Manager cancellation, a backend token rejection or a browser redirect mismatch | DecisionEach is a separate branch; see the error table |
| 7. Framework release issue | What to compareResource shrinking, the resolved library version and initialization | DecisionUse changelogs and confirmed fixes, not random upgrades or downgrades |
Row 4 is not theoretical. In an Expo case reported in September 2026, adding fingerprints changed nothing; the fix was a typo in the client ID the backend accepted.
Multiple signing certificates or upgraded keys
A single app may need more than one signing identity registered. Google's current Play App Signing help describes hybrid signing with three app signing keys and asks you to register the fingerprints of each, and an app that upgraded its signing key can still have installs signed by an older one. Register the identities your installs actually carry and do not delete older entries that still work. Key rotation is out of scope here, and it is not a sign-in fix.
Another project already owns this package and SHA-1
Firebase's conflict help says a package name and SHA-1 pair “must be unique across all Firebase and Google Cloud projects.” If the console refuses your fingerprint because another project holds it, find which project owns that OAuth client before you delete anything. Google support can help locate the conflict; do not remove active clients or projects to guess your way through it.
Is error 10 the same as 12500, 12501 or canceled?
No. Read the exact error and the library that produced it before treating every failed sign-in as one problem. Google's common status codes reference defines DEVELOPER_ERROR = 10 as “The application is misconfigured.” The other codes below come from Google's historical play-services-auth 21.6.0 SDK.
| What you see | What it means | Next step |
|---|---|---|
ApiException: 10 or DEVELOPER_ERROR |
What it meansApp configuration error | Next stepCompare signer, package, project and client IDs |
12500 |
What it meansSIGN_IN_FAILED: “A non-recoverable sign in failure occurred” |
Next stepRead the surrounding logs; do not treat it as error 10 |
12501 |
What it meansSIGN_IN_CANCELLED: “Sign in action cancelled” |
Next stepFind out whether the user cancelled and which API produced it |
Credential Manager or Flutter canceled |
What it meansA real cancellation or a configuration problem | Next stepInspect the exception details and setup; let the user start a new attempt after you diagnose |
NoCredentialException |
What it meansNo credential was returned; not a certificate diagnosis | Next stepCheck account availability and the request configuration as well as registration |
| Google token works, backend rejects it | What it meansA later stage than getting the Google credential | Next stepCheck the audience and client IDs your backend accepts |
redirect_uri_mismatch |
What it meansA browser OAuth redirect does not match an authorized URI | Next stepFix the callback configuration for that flow |
| “Item not found” on the Play link | What it meansAn installation or eligibility problem, not sign-in | Next stepFollow the app not available checks |
Legacy Google Sign-In and Credential Manager
Google's Play services release notes list the deprecation of the Google Sign-In APIs in play-services-base on April 16, 2024, and Google announced the move to Credential Manager on September 11, 2024. The APIs were then removed from play-services-auth 22.0.0 on August 26, 2026 and from play-services-base 18.11.0 on September 17, 2026, with the note “Removed the APIs related to Google Sign-in.” That is an SDK change; it does not establish a shutdown date for apps already installed. New code and upgrades should follow Google's migration guide.
The two APIs fail differently. Credential Manager has no error 10; its troubleshooting guide warns that “A high volume of "cancellations" may actually indicate a misconfiguration.” So a cancellation can be a configuration fault or a real cancellation, and NoCredentialException is a different signal again.
Flutter, React Native, Expo and Unity checks
The native identity checks above apply to every framework, but setup, initialization and build configuration differ. Use the route for your framework and the library version your app actually resolves.
| Framework | Specific checks | Do not assume |
|---|---|---|
| Flutter | Specific checksThe Android implementation, google_sign_in_android, moved to Credential Manager in 7.0.0. Pass the Web client ID as serverClientId. Its changelog for 7.2.16 “Keeps default_web_client_id resource from being stripped by resource shrinkers,” which matters for release only failures. |
Do not assumeThat every canceled result is a SHA problem, or that a downgrade is a universal fix. |
| React Native | Specific checksIdentify which API of the library you use, pass the Web client ID as webClientId, and check the real applicationId and the failing APK. The troubleshooting guide lists “Login does not work when downloading from the Play Store” and offers a config check command (below). |
Do not assumeThat a closed issue on the tracker proves a repair. |
| Expo | Specific checksNative Google sign-in needs a development or custom build; the Expo guide says “These libraries can't be used in Expo Go because they require custom native code.” Keep the EAS or local signing certificate apart from the Play app signing certificate. | Do not assumeThat Expo Go reproduces the release flow, or that rebuilding fixes a wrong backend client ID. |
| Unity | Specific checksDecide whether you use Firebase Authentication or Unity Authentication, get the Google ID token through the supported platform integration, then exchange it with that backend (Firebase's Unity guide). Google's old Unity sign-in sample was archived on April 19, 2026. | Do not assumeThat Play Games sign-in and Google account sign-in are the same integration. |
For React Native, the library maintainers provide a configuration check you can run from the project root:
npx @react-native-google-signin/config-doctor
What changes for Supabase, Facebook, Apple or Auth0?
The provider and the sign-in flow decide which certificate, client ID or callback has to match. A Google SHA-1 is the answer for native Google sign-in; for other providers it may be the wrong hash, the wrong format or irrelevant.
| Provider or flow | What must match | Where to set it |
|---|---|---|
| Native Google with Firebase | What must matchInstalled package and SHA-1, the Web client, Google enabled as a provider | Where to set itFirebase Project settings fingerprints, plus Authentication |
| Native Google with Supabase | What must matchThe native Android identity and the Web client ID; Supabase's guide says “The Web client ID is the one used in your Android app.” | Where to set itGoogle Android and Web clients, then the Supabase Google provider settings |
| Supabase browser OAuth | What must matchThe Web client, the Supabase callback and your app's return link | Where to set itAuthorized redirect URIs in Google and the Supabase redirect settings; a SHA fix does not apply |
| Facebook on Android | What must matchA Base64 key hash made from the signing certificate SHA-1 bytes, not the colon separated hex | Where to set itFacebook app settings, Android key hashes (route as documented in the Expo Facebook guide) |
| Apple web sign-in on Android | What must matchThe Services ID, domain and return URL | Where to set itApple's Sign in with Apple web configuration; not Google's DEVELOPER_ERROR mechanism |
| Apple through Firebase on Android | What must matchThe Apple setup plus the app's SHA-1 | Where to set itFirebase's Apple guide: “Specify your app's SHA-1 fingerprint if you haven't already.” |
| Auth0 on Android | What must matchAllowed callback URLs and the app scheme; app link identity where used | Where to set itAuth0 application settings; its Android SDK readme uses SHA-256 key hashes for its app link setup |
| Firebase phone authentication | What must matchSHA-256 for Play Integrity, SHA-1 for the reCAPTCHA fallback | Where to set itFirebase phone auth: a separate flow from Google sign-in |
Do not move sign-in into a WebView
Routing Google sign-in through an embedded WebView is not a workaround. Google's OAuth 2.0 policies say developers “must not direct a Google OAuth 2.0 authorization request to an embedded user-agent.”
What should testers send the developer?
A useful report identifies the failing Play build and the exact point where sign-in stops. A tester cannot repair an OAuth registration by retrying, so the job is evidence, not persistence. Copy this template and send it to your testers:
App and Play testing link:
Installed app version or build:
Installed from: Play closed test / another route
Device and Android version:
Date, time and time zone:
Exact error text or a redacted screenshot:
Where it stopped: before the account picker / after choosing an account / after returning to the app
Could another sign-in method open the app?
Retest result and version:
Ask testers to stay opted in to the test while you fix it. Never ask for passwords, OAuth tokens, private keys or Play Console access. After your change, ask the same tester to open a feature that needs sign-in, then sign out and sign in again, and to record the version and the result.
Does error 10 affect my closed test or production access?
A sign-in configuration error is separate from enrollment. Error 10 is not a Play policy rejection code, and no Google rule we found says it resets your testers' opt-in period. Google's testing requirements page encourages you to improve the app during closed testing, so keep testers opted in and ship the fix to the same closed track. That is a reading of the published rules, not a promise covering every case.
Broken sign-in still matters. Google Play's functionality policy says “We don’t allow apps that crash, force close, freeze, or otherwise function abnormally,” and a login wall stops testers from reaching the features they are meant to test. Fix it before you apply for production access, and give reviewers working sign-in details. If a review has already come back, see the Broken Functionality rejection.
For context: personal developer accounts created after November 13, 2023 need at least 12 testers continuously opted in for 14 days before they apply for production access for that app. After you apply, Google says “Review usually takes seven days or less, but can occasionally take longer.” If testers are missing from the count, check how they were invited before you touch sign-in.
Need real testers for the 14 days?
Testers cannot fix an OAuth registration, so get sign-in working first. Once it works, PrimeTestLab provides 12+ real testers who install your Play build on real Android phones and stay opted in for the full 14 days, from $19.99 (+5% service fee). If Google does not grant production access after the full test, you choose a free retest or a full refund. See how the 12-tester closed test works.
Frequently Asked Questions
Why does Google Sign-In work in debug but not closed testing?
Your debug APK and the app downloaded from Google Play can be signed with different certificates, so registering the debug fingerprint does not configure the Play build. Start with the Play app signing SHA-1, then check the release build's final package name and the client IDs the app actually uses.
Where do I find the Play App Signing SHA-1 now?
Open your app's Protected with Play page in Play Console. Google's help describes Play Store distribution, then Go to Play app signing; other current Google text calls these Play Store protection and Manage Play app signing. Open the App signing key certificate section and copy the SHA-1, checking any additional keys shown for your app.
Do I need SHA-1 or SHA-256 for Google Sign-In?
Google's Android OAuth client identifies your app by its package name and SHA-1 signing certificate fingerprint, and SHA-256 does not replace that field. Other services have their own needs: Firebase phone authentication uses SHA-256 for Play Integrity and SHA-1 for its reCAPTCHA fallback. Configure each service for the flow your app uses.
I already added the SHA-1. What should I check next?
Confirm it belongs to the app installed from Play, not your upload or debug key. Then compare the final application ID, the Firebase or Cloud project and the Web client ID. If your app has several signing certificates, check those too. A typo in the backend's accepted client ID can break sign-in even when fingerprints are right.
Do I have to upload another AAB after adding a fingerprint?
Not necessarily. Developers report that a registration-only fix in Firebase or Google Cloud worked with the app already installed. A changed client ID, configuration file, code or dependency must reach testers in a new build. Check what you changed, then verify the actual Play installation instead of rebuilding repeatedly without a diagnosis.
How long does a new fingerprint take to work?
Google publishes no fingerprint-specific propagation time, and the developer threads we reviewed did not measure one. Save the correct configuration and retry. If it still fails, verify the installed certificate and client settings rather than waiting a fixed number of hours, because waiting does not repair a mismatch.
Why does it say canceled when I did not cancel?
Some Credential Manager and framework integrations report a configuration or authorization problem as a cancellation, although a cancellation can also be real. Record the exception type and message, check your framework's troubleshooting guide, and keep the current API apart from the legacy 12501 SIGN_IN_CANCELLED status before changing settings.
Is the Android client ID the one I put in serverClientId?
No. In the documented native Google integrations, serverClientId or webClientId is the Web application OAuth client used for the token request. The Android client registers your package and signing certificate instead. Configure both, and confirm your backend accepts the intended token audience rather than swapping client IDs at random.
Does error 10 restart my 14-day closed test?
No Google rule we found says this error resets the opt-in period, and Google encourages improvements during closed testing, so keep testers enrolled and fix the existing track. That is not a sign the app is ready: a login wall can stop useful testing and leave a functionality problem you must fix before applying.
What should I ask a tester to send me?
Ask for the installed version, the Play testing link, the device and Android version, the exact error and the step where sign-in stops. A redacted screenshot or short recording helps. After your fix, ask the same tester to use a feature that needs sign-in, then sign out and back in, without sharing any credentials.
The Bottom Line
Bottom Line
Google Sign-In error 10 means the app is misconfigured, and when only the Play copy fails, the signing certificate is the first thing to check. Copy the app signing key SHA-1 from Protected with Play, register it with the build's final package name in the same Firebase or Google Cloud project your app uses, keep the Web client ID in serverClientId, and retest the build your testers installed, including a second sign-in. If it still fails, compare the installed APK's certificate, the application ID and the client IDs before changing anything else.
Sources checked October 16, 2026
Play Console and Firebase menu labels are the fastest changing facts on this page. If a route above no longer matches your console, look for Play app signing under Protected with Play, and for fingerprints under your Android app in Firebase Project settings.