Build my web app

Trusted Web Activities explained: your PWA on Google Play without a second codebase

What a TWA is technically, how it differs from a WebView app, Digital Asset Links, the tooling (our builder, Bubblewrap, PWABuilder), Play Billing via the Digital Goods API, and the review considerations.

A Trusted Web Activity is Google's answer to "I have a progressive web app; how do I put it on the Play Store?" It is a minimal Android app that opens your web app in the device's Chrome, full-screen, with no browser UI — and Chrome agrees to hide its UI only because you have proven you own the website. This guide explains how it works and how to ship one.

TWA vs WebView wrapper

Both are Android apps that show a website. The difference is in what renders it:

Trusted Web ActivityWebView wrapper
Rendering engineThe user's installed Chrome (or another supporting browser), always currentAndroid System WebView, updated separately, sometimes older
Cookies and loginShared with Chrome — users already signed in on the web are signed inSeparate cookie jar — users sign in again
Service worker, push, install stateYour PWA's, unchangedProvided by the wrapper, if at all
RequirementA valid PWA and a Digital Asset Links fileAny URL
Customisation of the shellSplash screen, status bar colour, orientation; no native UIWhatever the wrapper offers: nav bars, pull-to-refresh, native menus
Google's stanceDocumented, recommended path for PWAsAllowed; subject to the minimum-functionality policy

If your site is a PWA, the TWA is the better vehicle. If your site cannot be a PWA (Shopify theme, Wix, Blogger), the WebView route from the Android app builder is the one available.

How trust is established: Digital Asset Links

Chrome will only hide its UI if the website declares that it trusts the app. You do that by hosting a file at https://yourdomain.com/.well-known/assetlinks.json naming the app's package and the SHA-256 fingerprint of the certificate it is signed with:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.yourdomain.app",
    "sha256_cert_fingerprints": ["12:34:…"]
  }
}]

On launch, Chrome fetches this file and compares the fingerprint to the running app. Match: full-screen. No match: the site opens in a Custom Tab with a visible URL bar — the app still works, but looks like a browser. The two classic failures are hosting the file under a redirect, and using the fingerprint of your upload key when Google Play re-signs the app with its own app signing key. After the first upload, take the fingerprint from Play Console → App signing and put that one in the file (you can list both).

Tooling

All three produce the same kind of app. Choose by how much you want to touch Android tooling.

What the shell can configure

From your manifest: name, icon, theme_color for the status bar, background_color for the splash screen, orientation, display. From the build: package name, version code, the start URL, whether to enable notification delegation (so web push shows as the app's notifications), and fallback behaviour when no supporting browser is installed. There is no native navigation bar — the web app is the whole UI, which is the point.

Payments: the Digital Goods API

Google Play requires Play Billing for digital goods and subscriptions sold in apps distributed through Play. For a TWA, that is done with the Digital Goods API together with the Payment Request API: your web code queries Play for SKUs and prices, launches the Play purchase flow, and receives a token to verify server-side. It only works when the site is running inside the TWA — the same code path in a browser tab uses your normal web checkout. Physical goods and real-world services are exempt and continue to use your web checkout inside the TWA. If you sell nothing digital in-app, you can ignore this section entirely.

Review considerations specific to TWAs

Lifecycle after launch

Content and web-app changes ship through your website with no Play release. You release a new AAB only to change the icon, colours or start URL, or to meet Google's annual target-SDK requirement. Keep assetlinks.json hosted permanently: if it disappears, every installed copy reverts to a Custom Tab with a URL bar on next launch.

Ready to list? The TWA checklist takes you from PWA to live listing, form by form.