← Back to Blog
Abstract illustration of a progressive web app storefront on a phone

PWA for Ecommerce: What It Changes, What It Does Not, and How to Ship One

Why ecommerce keeps circling back to PWAs

An online store has a structural problem that content sites do not: the moment of highest purchase intent is almost never the moment a shopper is willing to install anything. Ask for an app install between "add to cart" and "pay" and you lose the sale. Ask for it after the sale and you are competing with the receipt email.

A progressive web app (PWA) sidesteps the trade-off. It is your storefront — the same URL, the same catalogue, the same checkout — with a service worker, a web app manifest, and HTTPS layered on top. Those three additions let the store be installed to the home screen, launched full-screen without browser chrome, cached for repeat visits, and (on Android) re-engaged with push notifications. Nothing about the first visit changes: the shopper still lands on a link and can buy immediately.

What a PWA changes for a store, concretely

The install ask moves after the purchase, not before it. A shopper who has already bought has a reason to keep the icon. Prompting at that moment converts far better than an interstitial on a product page, and if they decline, nothing is lost — the store is still a website.

Repeat visits get faster, which is a conversion variable. A service worker can cache the app shell, category templates, product imagery, and static assets. On a returning visit the layout paints from cache while only prices, stock, and personalisation come over the network. On the mid-range Android hardware that dominates emerging markets, that difference is the gap between a bounce and a browse.

Android re-engagement stops being email-only. Web Push on Android reaches an installed PWA the same way a native app does — back-in-stock alerts, price drops, abandoned-cart nudges — with none of the app-store review overhead. iOS supports Web Push only for PWAs the user has explicitly added to the Home Screen, so treat it as an Android-first channel and plan an email or SMS fallback for iOS. See PWA push notifications on Android for the permission-prompt mechanics.

Distribution stops depending on a review queue. No submission, no staged rollout, no waiting on a policy decision to ship a pricing change. For catalogues in categories where store policy is restrictive or where review timelines are unpredictable, this is often the deciding factor rather than a nice-to-have — see PWA vs APK for the full comparison.

Paid traffic lands on the thing it advertised. An ad click opens the product page directly. There is no store listing in between, no install step, no cold-start onboarding — which is why the same creative usually shows a materially shorter path to first purchase.

What a PWA does not fix

Being accurate here saves a quarter of wasted work.

  • It is not a growth channel by itself. A PWA changes how a store is delivered, not whether anyone wants what it sells. Traffic still has to come from search, paid, or social.
  • iOS remains the constrained platform. Home-screen install works, and Web Push works once installed, but the prompt is manual (Share → Add to Home Screen) rather than a browser-driven banner, and background capabilities are narrower. Expect lower iOS install rates and design for it.
  • Hardware-deep features stay native. Bluetooth peripherals, background location, advanced camera control, and platform biometric APIs are either unavailable or partial on the web. Most storefronts never touch these; if yours does, that is a real constraint, not a preference.
  • App-store discovery disappears. You trade a store listing for the open web. For most ecommerce that is a good trade — search and paid already dominate acquisition — but it is a trade.
  • SEO needs deliberate work. A single-page storefront can render beautifully for humans and be nearly empty for crawlers. Product and category pages need server-rendered or pre-rendered HTML, real URLs, and canonical tags. PWA SEO challenges covers the failure modes.

The build order that works

1. Get the manifest right first. name, short_name, start_url, display: standalone, theme_color, background_color, and icons at 192px and 512px including a maskable variant. Get this wrong and the install prompt never appears — the browser simply declines to offer it, with no error you would notice. The full field list is in PWA manifest requirements.

2. Serve everything over HTTPS. Service workers refuse to register otherwise. One mixed-content image is enough to break registration in some browsers.

3. Cache by content type, not uniformly. Static shell and assets: cache-first with a versioned name. Product detail and category data: network-first with a cache fallback. Prices, stock, cart, and checkout: network-only, always. Serving a cached price is not a performance win, it is a pricing incident.

4. Never cache the checkout flow. Payment pages, order confirmation, and the session endpoints behind them stay uncached and online-only. This is the single rule most likely to be violated by a generic "cache everything" service-worker recipe — see PWA payment integration for how the payment layer should be wired.

5. Design the offline state honestly. Offline browsing of previously viewed products is genuinely useful. Offline checkout is not — queueing an order the shopper thinks succeeded is worse than a clear "you are offline, we will not lose your cart" message.

6. Version and clean up the cache. Ship a cache name that changes with each release and delete old caches in the activate event. Stale-shell bugs after a deploy are almost always this.

Measuring whether it worked

Instrument these before launch, not after:

Signal

What it tells you

beforeinstallprompt fired vs prompt shown vs accepted

Whether install eligibility, timing, or the offer itself is the bottleneck

Launches with display-mode: standalone

Real installed usage, as opposed to install count

Repeat-visit LCP, cached vs uncached

Whether caching is actually reaching returning shoppers

Conversion rate, installed vs browser sessions

The number the whole exercise exists to move

Push opt-in rate, and revenue per push cohort

Whether re-engagement is worth the permission you spent

Track install-to-first-repeat-purchase separately from raw installs. An install that never produces a second session is a vanity metric.

Is a PWA right for this store?

It usually is when: mobile web is already the majority of traffic; paid acquisition sends users to product pages; repeat purchase matters; the catalogue is browsable rather than hardware-integrated; and app-store timelines or policy are a live risk.

It usually is not when: the shopping experience genuinely depends on native hardware access; app-store discovery is a real acquisition channel for the category; or the audience is overwhelmingly iOS and re-engagement is the entire point of the project.

For teams shipping web storefronts to Android audiences at scale, ROIBest handles the delivery layer — manifest and service-worker setup, install-prompt behaviour, and push — so the work stays on the catalogue and the funnel rather than on the plumbing. If you are still deciding on the packaging question, converting a website into an app without coding is the better place to start.

ROIBest

Build your next growth engine with ROIBest

Talk to our team about a stable, high-converting Android PWA solution.