Quick Answer
If a TWA is full screen when you install your own build but shows a browser bar when installed from Google Play, first check whether your website lists Play's signing certificate. In Play Console, open Play app signing under Protected with Play and copy the SHA-256 of the app signing key certificate. Add it to the sha256_cert_fingerprints array in https://your-domain/.well-known/assetlinks.json, serve that file over HTTPS with a direct HTTP 200, no redirects and application/json, then test again with a build installed from a Play testing track. If the fingerprint already matches, check for navigation off the verified origin, redirects and the browser in use.
Fix it in this order
Then test the version installed from Google Play, not a build you installed yourself.
This guide covers one repair: the association between your website and the build Google Play delivers. It does not cover building the TWA itself or Play's review of the app, which have their own guides linked below. Every Google page cited here was checked on October 16, 2026, and the sources are listed at the end.
In this guide
Why the browser bar appears only on the Play install
Chrome verifies a TWA by comparing the certificate that signed the installed app with the fingerprints your website publishes. When that check fails, Chrome's TWA quick start says the browser falls back to showing your site as a Custom Tab. That fallback is the address bar you see.
With Play App Signing there are usually two certificates. You sign the bundle you upload with your upload key, and Google signs the APKs it delivers with the app signing key. Chrome's Android concepts for web developers page says the app signing key fingerprint is the one that corresponds to your app when it is downloaded from the Play Store. A file that lists only your local certificate therefore passes on your desk and fails on every phone that installed from Play.
The two keys are not always different. Android's app signing documentation describes setups where the same key serves as both the app signing key and the upload key. So the fix is to compare the real certificates, not to assume which one you have.
| Where the build came from | Signed with | What assetlinks.json needs |
|---|---|---|
| Installed from a Play testing track or production | Signed withPlay's app signing key | What assetlinks.json needsThe app signing key certificate SHA-256. This is the one that fixes the Play install. |
| Your own release APK, installed by hand | Signed withYour upload or release key | What assetlinks.json needsThat key's SHA-256, only if you want those builds to verify too |
| Android Studio debug run | Signed withYour local debug key | What assetlinks.json needsThe debug SHA-256, only if you want debug builds to verify. A different application ID needs its own statement. |
| Internal app sharing link | Signed withA separate internal app sharing key | What assetlinks.json needsGoogle re-signs these uploads with an Internal App Sharing key, so test the fix on a testing track instead |
| A build released after a signing key upgrade | Signed withThe certificate Play now uses for that build | What assetlinks.json needsEvery certificate for builds you still support. Do not remove an older one only because a newer one appears. |
Closed testers see it too
Testers in a closed test install the Play signed build, so this is often the first place the bar shows up. It is not a closed testing defect: the variable is the certificate on the installed APK. If you only ever test a sideloaded APK, you can miss the problem completely.
Find the app signing SHA-256 in Play Console
Google's own documentation currently gives two labels for the same place. Both start at Protected with Play in the left menu of your app.
| Google page | Route | Copy from |
|---|---|---|
| Play Console Help: Use Play App Signing | RouteProtected with Play > Play Store distribution > Go to Play app signing | Copy fromApp signing key section |
| Android App Links documentation | RouteProtected with Play > Play Store protection > Manage Play app signing | Copy fromApp signing key certificate > SHA-256 certificate fingerprint |
Older guides, including some Google pages, still say Release > Setup > App signing or Setup > App integrity. If you only find those labels, you are looking for the same page under an older name.
Open the app in Play Console
Select the app whose package name your TWA uses. Each app has its own app signing key.
Go to Play app signing
Use either route in the table above. Both lead to the page that lists the app signing key and the upload key.
Copy the app signing key SHA-256
Copy the SHA-256 certificate fingerprint from the app signing key section, not the upload key section and not the SHA-1 line. It is 32 pairs of hexadecimal characters separated by colons. Paste it whole; a shortened example from a blog post will not verify.
Keep every app signing certificate that applies
Google's current Help page describes quantum-ready hybrid signing, where you copy the fingerprints for three keys: new classical and post-quantum keys used on newer devices and the classical key used on older devices. If your page shows more than one app signing certificate, list each one your supported devices can receive. This applies only to apps that use that configuration; most apps show one app signing certificate.
Read the fingerprint of a key you hold yourself
For your upload key or a debug key, Java's keytool prints the same format. Replace the keystore file and alias with your own, then copy the line labeled SHA256:
keytool -list -v -keystore my-upload-key.jks -alias upload
If you manage many apps, the Google Play Developer API can also return the certificate hash of the APKs Play generated (the certificateSha256Hash field of the generated APKs list). For a single fix, copying from Play Console is simpler.
Write and serve a correct assetlinks.json
The file is a JSON array of statements. For a TWA the relation is delegate_permission/common.handle_all_urls, and the target is your Android app: the namespace android_app, your exact application ID and an array of SHA-256 fingerprints. A minimal file looks like this:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.twa",
"sha256_cert_fingerprints": [
"PLAY_APP_SIGNING_KEY_SHA256",
"UPLOAD_KEY_SHA256"
]
}
}
]
Replace com.example.twa with your application ID and each placeholder with a full colon separated SHA-256. Delete the second entry if you only need Play installs to verify. Strict JSON only: no comments, no trailing commas, no SHA-1 values.
How Google requires the file to be served
- Exact location.
https://your-domain/.well-known/assetlinks.json, with the dot in.well-known.example.comandwww.example.comare different origins; publish the file on each one your app opens. A copy in a subdirectory such as/app/.well-known/does not count. - A direct HTTP 200. Google's Digital Asset Links documentation says: “Any response from the server besides HTTP 200 is treated as an error, and will result in an empty statement list.”
- No redirects. 301 and 302 responses are not followed. That includes an http to https hop and a bare domain to www hop.
- HTTPS with a valid certificate chain, and the header
Content-Type: application/json. A login page or an HTML error page that answers with 200 is not a valid file.
Check the live response from any terminal. The first status line must be 200 and the content type must be JSON, with no 3xx before it:
curl -sI https://example.com/.well-known/assetlinks.json
More than one fingerprint, more than one app
Android's website association guide says of the fingerprint array: “This field supports multiple fingerprints, which can be used to support different versions of your app, such as debug and production builds.” Add an upload or debug fingerprint only for builds you actually want that website to trust. A build with a different application ID, such as a separate debug package, needs its own statement in the array.
If you built the TWA with Bubblewrap or PWABuilder
In an existing Bubblewrap project, add Play's fingerprint and regenerate the file:
bubblewrap fingerprint add "PLAY_APP_SIGNING_KEY_SHA256" --name="Play app signing"
bubblewrap fingerprint list
bubblewrap fingerprint generateAssetLinks
Generating the file is not deploying it: upload the new assetlinks.json to your website and check it with curl. bubblewrap validate checks your PWA against quality criteria; it does not check the signing association, so a pass there proves nothing about the fingerprint. PWABuilder's current instructions make the same point about signing, “Once you've uploaded your .aab file, Google Play re-signs your app”, and tell you to add Play's fingerprint to the generated file. A fingerprint correction is a change to your website, not to the app binary.
Verify the association, then test the Play install
Four layers are involved: the file on your website, Google's Digital Asset Links API, Android's own link verification and the browser that launches your TWA. Passing one layer does not prove the next, so check them in order and finish on the device.
The website file
Run the curl check above. Fix any redirect, wrong content type or non 200 status before you look anywhere else.
Google's Statement List Generator and Tester
Google's Statement List Generator and Tester takes your domain, package name and SHA-256 and tests whether the statement is there. It is the quickest visual check.
The exact check through the API
The assetlinks.check method answers one precise question: is this package with this certificate linked to this website? Replace the origin, package, fingerprint and key, URL encode the values, and look for "linked": true:
https://digitalassetlinks.googleapis.com/v1/assetlinks:check?source.web.site=https%3A%2F%2Fexample.com&relation=delegate_permission%2Fcommon.handle_all_urls&target.android_app.package_name=com.example.twa&target.android_app.certificate.sha256_fingerprint=URL_ENCODED_SHA256&key=YOUR_API_KEY
The source is the origin, not the URL of the file. The statements.list method only lists what the website publishes, so a non empty list does not prove that your package and certificate are in it. Google's guide asks for an API key; an authorization or quota error is an API access problem, not a failed association.
To see everything the website publishes, the list request takes only the origin and the relation. Read the returned targets and look for your exact package and certificate:
https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https%3A%2F%2Fexample.com&relation=delegate_permission%2Fcommon.handle_all_urls
The app a tester installs
Install from your Play testing track, not a sideloaded APK and not an internal app sharing link, then open the app. If the bar is still there, read Chrome's verification log over adb. Chrome's documentation says that if you see Statement failure matching fingerprint., the app's signature does not match your assetlinks.json:
adb logcat -v brief | grep -e OriginVerifier -e digital_asset_links
Android Studio's App Links Assistant (Tools > App Links Assistant) checks Android App Links association and your manifest. It is useful for those, but it does not tell you whether your TWA opens full screen; only the device test does.
Advanced: Android's own verification state
On Android 12 and higher, Android's verification guide documents these commands for App Links. Replace the package, run the first two, wait a few minutes, then read the state:
adb shell pm set-app-links --package YOUR_PACKAGE 0 all
adb shell pm verify-app-links --re-verify YOUR_PACKAGE
adb shell pm get-app-links YOUR_PACKAGE
verified describes Android's domain verification, not whether your TWA opens without browser UI. Codes of 1024 or higher are verifier specific errors, not a diagnosis of a wrong SHA-256. For the TWA itself, use the Chrome log above.
The fingerprint matches but the bar stays
A visible bar does not prove the SHA-256 is wrong. When the check above returns linked: true and the bar is still there, work through these causes.
| What you see | Likely cause | What to do |
|---|---|---|
| The bar appears after a link, a login or a redirect | Likely causeYou left the verified origin | What to doChrome's multi origin guide says: “When a user navigates off the validated origin, Custom Tab UI is shown.” Declare every origin you control in the app and publish assetlinks.json on each. A login page on another company's domain, such as an identity provider, is outside your association: you cannot publish its file, so browser UI there is expected. |
| The bar is there from the first screen, and your domain redirects | Likely causeThe start URL and the declared origin are different hosts | What to doMake the launch URL, the declared origin and the file's host the same, for example all www. One reported Bubblewrap case with a matching fingerprint was fixed exactly this way. |
| Full screen with Chrome, a bar with another default browser | Likely causeBrowser provider choice | What to doChrome's quick start: the default browser is used if it supports TWAs, otherwise another installed browser that does, otherwise a Custom Tab. Run adb logcat -v brief | grep -e TWAProviderPicker to see which browser was picked. |
| A fresh install on a bad or missing network | Likely causeVerification could not run | What to doReconnect and reopen the app. This is a community reported pattern, not documented behavior. |
Android reports verified, but the TWA shows browser UI |
Likely causeAndroid's check and the browser's check are separate | What to doCapture the browser's origin verification message with the logcat command above; it explains the TWA result, not the Android state. |
| A short message that the app runs in your browser, then full screen | Likely causePossibly a browser notice, not a persistent bar | What to doRecord the exact text and how long it stays before you treat it as a failed association. This symptom is community reported and not documented by Google. |
How long until a fixed file takes effect
Google publishes no single wait time for TWAs, because several caches are involved and each has its own rules:
- Your server or CDN may still serve the old file. Purge it and confirm the live response with curl.
- The Digital Asset Links API states how long each response stays valid in its
maxAgefield. - Android App Links has separate timing. Android's verification guide says that on Android 15 and higher changes can take up to seven days to reach all devices, and that on Android 14 and lower the file is typically picked up when the app is installed or updated.
- The browser may keep its own state. One developer reported success after clearing Chrome's data.
So purge the cache, confirm the live file and reinstall from Google Play. On a test device, a fresh install or clearing the browser's data can rule out cached state; that is a diagnostic step, not something to ask every user to do. Do not plan around a fixed number of hours.
Rejection, review and closed testing
A missing or wrong assetlinks.json is not documented as a cause of rejection on its own. What the documentation describes is the fallback to a Custom Tab with browser UI. Review is a separate question: Google Play's functionality policy says “We don’t allow apps that crash, force close, freeze, or otherwise function abnormally,” and that applies whatever your association status is. A correct fingerprint fixes the bar; it does not settle review. If you received a rejection, start from the policy named in the email.
Some older articles say Chrome will crash a TWA that fails its quality checks. Chromium removed that QualityEnforcer code on May 4, 2023, so treat that advice as historical rather than as a description of today's browsers.
If you received a rejection, work from the reason in the notice: the Broken Functionality rejection walks through the most common functionality notice. Do not rebuild your TWA as a WebView only because of a browser bar. If your app came out of an AI builder, publishing a vibe-coded app on Google Play covers the full route from project to Play.
Testing a TWA with a new personal account
Personal developer accounts created after November 13, 2023 still need a closed test with at least 12 testers opted in for 14 continuous days before applying for production. Those testers install the Play signed build, which is exactly where this bug shows. PrimeTestLab provides 12+ real testers from $19.99 (+5% service fee), and 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 service works.
Frequently Asked Questions
Which SHA-256 goes in assetlinks.json when I use Play App Signing?
The SHA-256 of the app signing key certificate shown on Play app signing in Play Console. That certificate signs the builds people install from Google Play. Add your upload or debug fingerprint as well only if you also want builds you install yourself to verify.
Why does my TWA work from Android Studio but show the URL bar from Google Play?
Builds you install yourself are signed with your debug or upload key, while Google Play delivers your app signed with the app signing key. If your website lists only your local certificate, verification fails for the Play install and Chrome falls back to a Custom Tab with a browser bar.
Where is the app signing key in the current Play Console?
Under Protected with Play. Google currently documents two routes: Play Store distribution, then Go to Play app signing, and Play Store protection, then Manage Play app signing. Copy the SHA-256 certificate fingerprint from the app signing key certificate section.
Can assetlinks.json list more than one SHA-256 fingerprint?
Yes. The sha256_cert_fingerprints field is an array and supports multiple fingerprints for the same package, for example a debug build and the Play signed build. A different application ID needs its own statement.
How long after fixing assetlinks.json does the browser bar disappear?
Google publishes no single wait time for TWAs. Purge any CDN cache, confirm the live file returns HTTP 200 as JSON without redirects and reinstall the app from Google Play; on a test device, clearing the browser's data can rule out cached state. Android App Links verification has its own timing, which can take up to seven days on Android 15 and higher.
Does a wrong assetlinks.json get a TWA rejected on Google Play?
Current documentation describes a fallback to a Custom Tab with browser UI, not an automatic rejection. Play review judges whether the app works and offers a real experience, so a correct file fixes the bar but does not by itself settle review.
Do closed testers see the browser bar too?
Yes, if the website lacks the app signing certificate, because closed testers install the Play signed build. Test the fix with that installation rather than a sideloaded APK, and remember that internal app sharing links are signed with a different key.
The Digital Asset Links check passes. Why is the bar still there?
Check what passed. A statement list can contain an association for a different package or certificate, and even an exact check only tests the values you supplied. Confirm the installed build uses that identity, follow the origin the app actually lands on, and read the browser's verification log. Android's App Links state is a separate signal.
Can a www redirect or a login page bring the bar back?
Yes. TWA verification applies to origins, and navigating off a validated origin shows browser UI. Check where the app lands after redirects and configure every origin you control in both the app and its own assetlinks.json. A login page on another company's domain is not covered by your file, and you cannot publish its association.
Does bubblewrap validate check my Play signing fingerprint?
No. Bubblewrap documents validate as a check of your PWA against quality criteria, so a pass says nothing about whether the Play installed app matches your certificate list. Use the fingerprint commands to prepare assetlinks.json, publish it, check the exact domain, package and certificate, then test the Play installation.
Do I need to switch my TWA to WebView to remove the bar?
Not as a first step. Correct the installed app's signing identity, how the website serves the file and the origins the app opens, then retest. If the real problem is unsupported browser behavior, authentication or a specific policy notice, investigate that separately before deciding whether a different wrapper suits your app.
The Bottom Line
Bottom Line
A browser bar on a Play installed TWA starts with one comparison: the certificate that signed the installed build against the fingerprints in your website's assetlinks.json. Copy the app signing key SHA-256 from Play app signing, publish strict JSON at the exact origin with a direct HTTP 200, check the exact package and certificate, then test the build a tester would install. If the fingerprint already matches, look at origins, redirects, the browser and caches before you rebuild anything.
Sources checked October 16, 2026
Play Console menu labels are the fastest changing fact on this page. If the routes above no longer match your Console, look for Play app signing under Protected with Play, or search the Console for app signing.