A PWA, or progressive web app, is a web page that a phone can install like a native app. In affiliate marketing it is used as an app-style landing page: the visitor arrives from an ad, taps Install, gets an icon on the home screen, and every later tap on that icon sends them through your tracker to the offer. No app store, no review queue, no APK, and every install, launch and push subscription attributed back to the click that paid for it.

This guide covers what a PWA actually is at the browser level, why media buyers in gambling, dating, nutra and finance verticals lean on them, how the funnel is tracked end to end, what the install experience looks like on Android versus iOS, what you need to build one, and the operational habits that keep a PWA campaign healthy. It assumes you already run paid traffic and use a tracker.

Quick answer

  • What it is: a landing page with a manifest, a service worker and an install flow. Installed, it opens full screen under its own icon.
  • Why affiliates use it: app-style trust and conversion rates, instant publishing, no store policy gate, re-engagement through web push, full attribution per click.
  • Where it shines: Android traffic from push, pop, native and in-app sources; gambling, sports betting, dating, nutra, finance and sweepstakes offers that stores restrict.
  • Where it is weaker: iOS requires a manual add-to-home-screen step; push on iOS needs the installed app and iOS 16.4 or later.
  • What tracks it: the tracker injects its click ID into the app so installs, launches, pushes and conversions all attach to the original click and sub IDs. BATracker does this with its built-in PWA Apps feature.

What a PWA is, technically

Three browser features turn a page into an installable app:

  1. A web app manifest. A small JSON file that declares the app name, icons, theme colors, display mode (standalone, so no browser bar) and the start URL that opens when the icon is tapped.
  2. A service worker. A script the browser keeps installed for your origin. It makes the app installable, caches the shell so it opens instantly, and receives push messages even when the page is closed.
  3. An install flow. On Android Chrome the browser fires an install prompt the page can trigger from a button. On iOS there is no prompt, so the page shows a short guide to the Share menu and "Add to Home Screen".

That is the whole stack. Everything else, the store-like design, the ratings block, the screenshots carousel, the "Install" progress bar, is page design.

The important consequence for a media buyer: a PWA is just a URL on your domain. It goes live when the page is online. It can be edited, versioned, rolled back or moved to another domain without anyone's approval.

Why affiliates use PWAs

Conversion rates on app-style pages

Users have learned that an app is something they chose to install, so an app-style flow carries more trust than a redirect chain. In practice the PWA page looks like a store listing: icon, name, developer, rating, screenshots, reviews, an Install button. The install gesture is a micro-commitment. The user then opens the icon in their own time, often more than once, and each open is a fresh visit to the offer.

For sports betting and casino offers in particular, the "app" framing matches what the user expects from the brand, which is why the format spread so fast in those verticals from 2021 onward.

No store, no review, no delay

Native apps for gambling, dating and many nutra products are rejected or heavily restricted by the Play Store and the App Store, and even approved apps take days to update. A PWA has none of that. The lander is yours, on your domain, changed in minutes.

Re-engagement through push

An installed PWA can ask for notification permission. Once granted, you can send a push with a title, text, an image and a click URL. The push opens the app, the app routes through the tracker, and the user lands on the offer again with the original click ID. This is the part that turns a one-time click into a small audience you can message for weeks.

Attribution you own

Because the tracker serves the PWA, it can bake its click ID into the manifest's start URL. The installed app therefore knows which click created it. Installs, launches, push subscriptions and the conversions that follow all appear in the tracker next to the sub IDs, source, geo and device of the original click. You see cost per install and cost per launch per zone, creative or placement, not just cost per click.

The PWA funnel, step by step

The flow below is how BATracker runs it. Other setups differ in details, but the stages are the same.

  1. Ad click to tracker. The ad points at a campaign URL on your tracking domain, for example https://go.yourdomain.com/c/<campaignId>?zone={zone}. The tracker records the click, assigns a 25-character click ID, applies filters and rules, and picks a path.
  2. Tracker to PWA page. The path's lander is the PWA, served at https://go.yourdomain.com/app/<slug>/?click_id=<id>. The page loads with the manifest, service worker and install logic injected, and the click ID is written into the manifest's start URL and into local storage.
  3. Install. On Android the Install button triggers Chrome's native dialog. On iOS the page shows the add-to-home-screen guide. The install is reported to the tracker and attached to the click.
  4. First launch. The user taps the icon. The app opens full screen, shows a splash, and on first launch asks for notification permission. If granted, the push subscription is sent to the tracker with the click ID.
  5. Launch to offer. The app calls the tracker's launch endpoint with the click ID. The tracker records the launch as a lander-to-offer click and redirects to the offer URL that was chosen for this click, with tokens such as {click_id} and {sub1} filled in.
  6. Conversion. The network fires its postback with the click ID. The tracker attributes the conversion to the click, the campaign, the PWA and the push subscriber if there is one.
  7. Re-engagement. You send a push to subscribers of that app, optionally filtered by language. Each tap opens the app and repeats step 5.

Read the postback mechanics in how to set up S2S postback tracking; nothing changes for a PWA, the click ID just travels through an extra stage.

Android versus iOS

Android (Chrome, Samsung Internet) iOS (Safari)
Install prompt Native dialog from a button tap None, user adds via Share menu
Icon and full screen Yes Yes, after add to home screen
Web push Yes, after permission iOS 16.4+, only for home-screen apps
In-app browsers (Facebook, Instagram, TikTok) No install prompt; page must open Chrome No add-to-home-screen; page must open Safari
Share of PWA installs in most campaigns Large majority Minority, improving

Two practical consequences. First, your PWA page needs an escape hatch for in-app browsers, because traffic from Meta and TikTok opens inside their own browser where installation is impossible. A good engine detects this and opens the page in Chrome or guides the user to Safari. Second, your tracker should treat the first standalone launch on iOS as the install signal, because iOS never tells the page that an install happened.

What you need to build one

The minimum set:

  • A page with a clear install call to action. The classic design mimics a store listing, but any page works as long as the install button is wired to the engine.
  • Icons in 192 and 512 pixel PNG. These show on the home screen, in the install dialog and in notifications.
  • A domain with SSL. Service workers and push require HTTPS. Use a domain whose reputation you control, not a shared one.
  • An engine that supplies the manifest, service worker, install prompt handling, iOS guide, push subscription and the beacons that tell your tracker about installs and launches.
  • A tracker that attributes installs, launches and pushes to clicks and conversions.

Standalone PWA builders such as EpicPWA, BlackApp or FreePWA provide the first four and hand the fifth to your tracker through tokens. BATracker folds the engine into the tracker: you either use the built-in template builder (name, developer, description, screenshots, reviews, colors, labels in several languages) or upload your own HTML as a ZIP or paste, and the tracker injects everything else when it serves the page. Pages are versioned, so every publish can be previewed and rolled back. See EpicPWA alternatives for how the options compare.

If you bring your own page

Keep the page self-contained: relative paths for images, CSS and scripts; one index.html at the root; optional per-language files such as index.de.html. Mark the install button with data-pwa="install" so the engine can bind to it, and optionally mark a progress bar and label. Leave out your own manifest, service worker and install logic. The tracker supplies them, and a stray old script that registers a different service worker is the most common cause of a broken install. Tokens such as {{app_name}}, {{click_id}} and {{year}} are replaced at serve time.

Reading the numbers

A PWA campaign has a longer funnel than a direct-link campaign, so the report needs more columns. The ones that matter:

Metric Meaning What to look for
Visits Clicks that reached the PWA page Same as any lander
LP views Page fully loaded and engine booted Gap to visits shows slow pages or in-app browser issues
Installs Install accepted (Android) or first standalone launch (iOS) Install rate per zone, creative, OS
Launches Icon opened and routed to the offer Launch rate per install, repeat launches over days
Push subscribers Permission granted and subscription stored Opt-in rate; drives re-engagement volume
Conversions and revenue From postbacks, attributed to the click Compare EPC on install traffic versus direct link

Watch the install rate by operating system and by traffic source. In-app traffic that cannot install will show visits without installs. iOS will show lower install rates than Android, which is normal, so judge iOS on launches per install and revenue rather than on install rate alone. The how to track PWA installs and launches article walks through the stats tab and the click log fields.

Push without burning the audience

Push is what makes a PWA audience worth more than a single click, and it is also the fastest way to lose that audience. Some ground rules:

  • Ask once, at the right moment. The first launch inside the installed app is the natural place. Asking on the browser tab before install yields far lower opt-in and often gets ignored by the browser as a non-gesture request.
  • Keep the promise. The notification should relate to the app the user installed. Fake system alerts and "you have a new message" bait get apps uninstalled and, on Android 13 and later, get the app's notification channel blocked by the OS.
  • Frequency. One well-timed push a day beats five. Track unsubscribes and uninstalls after each send.
  • Segment by language. Store the user's language with the subscription and send localized copy. BATracker records the language per subscriber and lets you target a push to selected languages.
  • Route pushes through the tracker. The click URL of a push should open the app, which then launches through the tracker, so every push-driven visit to the offer keeps the original attribution.

The push notifications for affiliate marketing article covers permission flows, iOS specifics and how to read subscription failures.

Domains: the operational risk

A PWA is tied to its origin. If the domain gets flagged by Safe Browsing or an ad network, installed apps on that domain stop working for new users, and existing users see warnings. This is the single biggest operational risk of the format and the reason experienced buyers keep PWAs on dedicated domains, one per vertical or offer group, and keep a spare verified domain ready.

Rotation means publishing the same app on a new domain, pointing the campaign path at it, and letting the old one age out. With BATracker you duplicate the app onto another verified domain in one action, including page versions, icons and push keys, then switch the lander in the campaign path. Existing subscribers of the old domain stay on the old app; new traffic goes to the new one. The full procedure and the warning signs are in PWA domain rotation for affiliates.

Compliance

The PWA format is neutral; what you promote and how you advertise it is not. Three points that matter in practice:

  • Advertising rules by market. Gambling, betting and dating advertising is licensed in most countries and some ban it outright. The PWA does not change your obligations.
  • Ad network policies. Most networks have specific rules for app-style landers, "install" language and push consent. Read them for each source you run.
  • Honest content. The app name, icon, ratings and reviews on the page are claims. Keep them consistent with the offer. A PWA that looks like a brand you do not represent is a trademark problem, not a marketing tactic.

When a PWA is the wrong tool

  • Desktop-heavy traffic. Installation and push on desktop exist but the behavior that makes PWAs work, the icon on the phone, does not.
  • Offers that convert on the first visit with no reason to return. The extra install step costs conversions you would have had on a direct link.
  • Sources that forbid app-style landers or any install prompt. Check the policy before you build.
  • Traffic that is mostly in-app on iOS. The add-to-home-screen path from inside Instagram or TikTok is too long for most users.

Test with a split: send half of a zone to the PWA and half to the plain lander or direct link, and compare EPC after a week, not after a day. The PWA side needs time for launches and pushes to accumulate. Split-testing landing pages explains how to set up the paths and read significance.

Setting one up in BATracker

  1. Add and verify a custom domain for the app (DNS CNAME, SSL is automatic).
  2. Create a PWA App: pick the domain, a slug, and either fill the template (listing, screenshots, reviews, colors, languages) or upload your own page as a ZIP. Upload icons if your bundle does not contain them.
  3. Publish. The app is live at https://<domain>/app/<slug>/ and a lander of type PWA is created automatically.
  4. Build a campaign with a path that uses that lander and your offer. Set the traffic-source preset so sub IDs map correctly.
  5. Open the campaign URL on a phone, install, open the icon, confirm you land on the offer with the click ID in the URL, then confirm the install and launch appear in the app's stats.
  6. Set a fallback CTA URL on the app so launches from long-dormant installs still have somewhere useful to go.
  7. Enable push, send yourself a test notification, then set your sending schedule.

The getting-started guide covers steps 1 and 4 in detail.

Bottom line

A PWA is a landing page with an install step and a memory. For mobile offers that benefit from app-style trust and from being opened more than once, it raises the value of every click you buy, and it does so without stores, approvals or native code. The costs are a longer funnel, a dependence on domain reputation, and a weaker experience on iOS. Run it where Android traffic is strong, track every stage back to the click, treat push as a privilege the user granted, and keep a spare domain ready.