How to Use Progressive Web Apps (PWAs) to Improve Engagement & Speed
If you could combine the reach and discoverability of the web with the feel and speed of a native app, would you do it? That is the promise of Progressive Web Apps (PWAs): delivering fast, reliable, and engaging user experiences that feel app-like, load quickly, work offline, and re-engage users when it matters most.
In a world where milliseconds affect conversions and users expect instant gratification, PWAs provide a pragmatic path to better performance and engagement without the heavy lift of native app development for multiple platforms. Whether you run an ecommerce store, a content site, a SaaS dashboard, or a community platform, PWAs can help you boost speed, retention, and revenue while keeping your stack web-first and future-friendly.
This comprehensive guide explains what PWAs are, why they work, and exactly how to plan, build, optimize, ship, and grow a PWA that users love. Along the way, you will get practical patterns, code snippets, checklists, and growth tips to turn your existing site into a progressive experience or start a new PWA from scratch.
What Is a Progressive Web App (PWA)?
A PWA is a web application enhanced with progressive capabilities to offer a native-like experience. PWAs are built using standard web technologies (HTML, CSS, JavaScript) and enhanced by modern APIs that enable offline support, installation, push notifications, background sync, and more.
PWAs are defined less by a single technology and more by a set of capabilities and user-centric qualities:
Reliable: Loads instantly and remains usable, even on flaky or offline networks.
Fast: Responds to user interactions quickly and keeps navigation smooth.
Engaging: Feels like an app with full-screen UI, installability, and re-engagement features like web push.
At the core of PWAs are three foundational pieces:
HTTPS: A secure context is mandatory for most modern APIs, including service workers and push.
Service Worker: A client-side proxy script that enables smart caching, offline behavior, background tasks, and request routing.
Web App Manifest: A JSON file that describes the app’s name, icons, colors, display mode, and how it should behave when installed.
When implemented thoughtfully, a PWA can deliver the speed of a highly optimized website plus the stickiness of an app without imposing the friction of app store downloads.
Why PWAs Matter for Engagement and Speed
Engagement and speed are tightly coupled. Slow experiences cause abandonment; fast, responsive experiences keep users browsing, exploring, and buying. PWAs drive both dimensions simultaneously:
Faster first load: Aggressive caching, pre-caching of shells, and optimized resource delivery reduce time to first interaction.
Consistent subsequent visits: Returning users benefit from offline caching, so assets and pages load near-instantly.
Lower friction to return: Installability puts your app on the home screen and task switcher; push notifications invite users back at relevant moments.
Offline resilience: Users can read content, add items to a cart, or draft messages offline and sync later.
Platform reach: A single codebase reaches users across desktop, Android, iOS (with varying support), and more—through a URL.
In short, PWAs enhance speed and reliability while giving you more ways to delight and re-engage users without asking them to visit an app store.
How PWAs Work: The Core Building Blocks
To harness the benefits of PWAs, it helps to understand the moving parts.
1) HTTPS Everywhere
Mandatory for PWAs: Service workers and many powerful APIs require a secure origin.
Trust and safety: Users are more likely to engage with a site they trust, and browsers highlight insecure experiences.
Performance enablement: HTTP/2 and HTTP/3, TLS session resumption, and modern CDNs all improve speed and rely on HTTPS.
2) Web App Manifest
The manifest is a JSON file that tells the browser how to present your app when installed. It includes the name, icons, theme colors, and display mode (standalone, fullscreen, minimal-ui, or browser).
Example manifest (using single quotes inside for readability):
{ 'name': 'Acme News', 'short_name': 'Acme', 'start_url': '/', 'scope': '/', 'display': 'standalone', 'background_color': '#ffffff', 'theme_color': '#0f62fe', 'description': 'Stay on top of global news, fast and offline', 'icons':[{ 'src': '/icons/icon-192.png', 'sizes': '192x192', 'type': 'image/png' },{ 'src': '/icons/icon-512.png', 'sizes': '512x512', 'type': 'image/png' }]}
A service worker is a script that runs in the background, intercepts network requests, and enables features like offline caching, prefetching, push notifications, and background sync. It acts as a programmable proxy between your app and the network.
Key lifecycle stages:
Install: Ideal for pre-caching essential assets and the app shell.
Activate: Cleanup old caches, take control of uncontrolled clients when appropriate.
Fetch: Intercept requests and respond from cache, network, or a combination.
Push/Sync: Handle push notifications and background synchronization events.
This is intentionally minimal to illustrate the approach. In production, use more nuanced strategies (below) and consider Workbox for robustness.
Step 6: Choose Caching Strategies Route-by-Route
Different resources benefit from different strategies:
App shell (CSS, JS, framework runtime): Cache-first with versioning for instant paint.
Dynamic content (news feed, product lists): Stale-while-revalidate to deliver fast cached content while fetching fresh data for next time.
Critical APIs (checkout, auth): Network-first with timeout fallback to cached data if safe. For security-sensitive endpoints, prefer fresh network data.
Images: Cache-first with responsive variants; apply max-age and content hashing.
Fonts: Cache-first, preferably with font-display: swap to avoid blank text.
Workbox makes it easier to implement these patterns.
Example with Workbox (using a build step):
import{ clientsClaim }from'workbox-core';import{ precacheAndRoute }from'workbox-precaching';import{ registerRoute }from'workbox-routing';import{StaleWhileRevalidate,CacheFirst,NetworkFirst}from'workbox-strategies';import{ExpirationPlugin}from'workbox-expiration';self.skipWaiting();clientsClaim();// Precache assets injected by Workbox manifestprecacheAndRoute(self.__WB_MANIFEST||[]);// CSS/JS - stale while revalidate for quick updatesregisterRoute(({ request })=> request.destination==='style'|| request.destination==='script',newStaleWhileRevalidate({cacheName:'static-resources'}));// Images - cache first with expirationregisterRoute(({ request })=> request.destination==='image',newCacheFirst({cacheName:'images',plugins:[newExpirationPlugin({maxEntries:150,maxAgeSeconds:60*60*24*30})]}));// API - network first with fallbackregisterRoute(({ url })=> url.pathname.startsWith('/api/'),newNetworkFirst({cacheName:'api-cache',networkTimeoutSeconds:3}));
Step 7: Design for Offline and Low-Connectivity Scenarios
Provide a meaningful offline page that contains links to cached content and explains offline features.
Use skeleton screens for lists and detail views to avoid jarring empty states.
Let users queue actions (e.g., add to cart, send message) and sync when back online.
Use IndexedDB for structured offline data; localStorage is not sufficient for complex cases.
Step 8: Implement Installability (Add to Home Screen)
Ensure your site passes the criteria: served over HTTPS, manifest with icons, and a service worker responding with a fetch handler.
Customize the install prompt flow; consider prompting after clear engagement (e.g., second visit, scrolled content, completed action).
Provide a non-intrusive UI (button or menu item) to trigger the install prompt handler.
Example install prompt handler:
let deferredPrompt;window.addEventListener('beforeinstallprompt',(e)=>{ e.preventDefault(); deferredPrompt = e;// Show your install buttondocument.querySelector('#installButton').classList.remove('hidden');});document.querySelector('#installButton').addEventListener('click',async()=>{if(!deferredPrompt)return; deferredPrompt.prompt();const{ outcome }=await deferredPrompt.userChoice;console.log('Install outcome:', outcome); deferredPrompt =null;});
Consistent navigation: Use an app bar and bottom tabs if appropriate; keep back behavior predictable.
Offline-first routing: Ensure navigation works even when offline.
Offline UX That Feels Considerate
Read later: Let users save content for offline consumption; sync reads when back online.
Drafts and queueing: For forms and messages, store offline and sync reliably.
Informative placeholders: Skeletons, placeholders, and progress states reduce anxiety.
Push Notifications and Re-Engagement
Value-based triggers: Announce price drops, order updates, or content relevant to previous activity.
Frequency caps: Avoid daily noise; build trust with timely, useful alerts.
Contextual deep links: Tap-through opens the exact relevant screen.
Respect privacy: Easy opt-out and clear explanations of what users will receive.
Personalization and State Persistence
Remember preferences offline: Theme, language, recent searches, and filters.
Smart onboarding: If installing, greet the user and explain offline features.
Lightweight accounts: Consider passkeys or passwordless to reduce friction.
Shareability and Virality
Web Share API: Enable native share sheets to invite friends.
Share Target API: Handle incoming shares; save content for later.
Deep-link resilience: Ensure routes work when opened from notifications or shares, online or offline.
Visual Feedback and Microinteractions
Instant feedback: Buttons and inputs should respond immediately, even if final results need network.
Optimistic UI: Update the UI as if the action succeeded; reconcile when the network responds.
These patterns make your PWA not merely fast, but genuinely pleasant to use.
SEO and Discoverability for PWAs
PWAs are still web apps, and SEO matters—especially for content and commerce. Keep these best practices in mind:
Use URLs that map to meaningful content. Avoid hash-only routes for primary content.
Prefer SSR/SSG or pre-render critical pages; SPAs without SSR can hurt crawlability and allow content to appear late.
Provide canonical URLs and avoid duplicate content across routes and parameters.
Include structured data where appropriate (products, articles, FAQs).
Serve clean HTML even without JS for indexable content, or at least pre-render initial content.
Generate sitemaps; ensure robots.txt does not block important paths.
Lazy-load respectfully: ensure content in viewport is available quickly.
Manage pushState routing carefully; handle 404s with server support for deep links.
PWAs and SEO are complementary when you preserve good fundamentals and render content early.
Data and Storage: Making Offline Work Real
A robust PWA leans on the right storage mechanism for the job:
Cache Storage: For request/response caching of assets and simple API responses.
IndexedDB: For structured data, complex objects, and offline reads/writes with synchronization strategies.
LocalStorage: Synchronous and limited; use sparingly for tiny bits of state, not large objects or frequent writes.
Patterns that scale:
Write-through cache: When online, write to the server and update local cache simultaneously.
Write-behind with queue: When offline, store mutations locally and replay them via Background Sync or on the next app open.
Conflict resolution: Use server timestamps or versioning to resolve offline edits vs. online updates.
A simplified example for queued offline actions:
asyncfunctionqueueAction(action){const db =awaitopenDB('acme',1,{upgrade(db){ db.createObjectStore('queue',{keyPath:'id',autoIncrement:true});}});await db.add('queue',{ action,ts:Date.now()});}self.addEventListener('sync',async(event)=>{if(event.tag==='sync-queue'){ event.waitUntil(flushQueue());}});asyncfunctionflushQueue(){const db =awaitopenDB('acme',1);const tx = db.transaction('queue','readwrite');const store = tx.objectStore('queue');let item;while((item =await store.get(1))){try{awaitfetch('/api/action',{method:'POST',body:JSON.stringify(item.action)});await store.delete(item.id);}catch(e){break;// stop if network fails; try later}}await tx.done;}
Note: The code above uses conceptual helpers like openDB; in production, use a small IndexedDB helper library or the native APIs.
Background Sync, Periodic Sync, and Quotas
Background capabilities can improve reliability, but they come with constraints:
One-off Background Sync: Allows the browser to retry queued actions when connectivity returns.
Periodic Background Sync: Lets you fetch updates at set intervals (support varies by browser). Use sparingly; respect battery and data.
Quotas: Browsers limit storage and background tasks; watch for quota exceeded errors and provide fallback behaviors.
Always degrade gracefully when an API is not supported. If periodic sync is unavailable, fetch updates on focus/visibility changes.
Update Strategy: Keeping Users Fresh Without Surprises
An excellent PWA updates quietly while respecting the user’s context.
Version your caches: Include a version in cache names. Remove old caches on activate.
Controlled rollout: Do not aggressively delete the old cache until the new SW activates and clients are under control.
Update prompts: Notify users when a new version is ready; let them refresh when convenient.
Skip waiting carefully: For critical security fixes, you may call skipWaiting and clientsClaim to take over immediately, but this can disrupt ongoing sessions.
navigator.serviceWorker.addEventListener('controllerchange',()=>{// Inform the user or reload content safely});
Give users control, especially in high-stakes contexts like form entry or checkout.
Security, Privacy, and Permissions
PWAs inherit the web’s security model but also introduce new considerations:
HTTPS: Mandatory. Enable HSTS and secure cookies. Validate CORS rules.
Service worker scope: Limit scope to what is necessary to reduce risk surface.
Content Security Policy: Use CSP to mitigate XSS and data injection.
Permissions hygiene: Ask for push notifications or geolocation in context; explain the value.
Data minimization: Store only what you need. Respect local storage quotas and user privacy expectations.
Incident response: Have a plan to revoke compromised assets, rotate keys, and force updates via a new SW.
Trust drives engagement. Respecting user privacy and security earns long-term loyalty.
Platform Support Realities: Android, iOS, Desktop
Support for PWA features is broad but not uniform.
Android/Chrome: Strong support for install, push notifications, background sync, and many modern APIs.
Desktop browsers: Robust support for installation and caching; push varies by platform and user settings.
iOS/Safari: Many PWA features work, including service workers and installation to the home screen. Some advanced APIs and behaviors differ by version and device configuration.
Guidelines:
Feature-detect rather than user-agent sniff.
Provide fallbacks when an API is unavailable.
Test key flows (install, offline, push) across major OS versions and browsers.
Your goal is progressive enhancement: a solid baseline everywhere, extra capabilities where supported.
Frameworks and Tools to Accelerate PWA Development
Modern tooling can speed up development, standardize patterns, and prevent mistakes.
Workbox: Battle-tested service worker generation, routing, caching strategies, precaching, and runtime caching with minimal boilerplate.
Lighthouse: Automated auditing for Performance, PWA compliance, and Best Practices.
Bundlers and frameworks: Vite, Next.js, Nuxt, SvelteKit, Angular (with @angular/pwa), Remix—many include PWA plugins or guides.
Image tooling: Squoosh, Sharp, or CDN image optimization for next-gen formats and responsive variants.
RUM libraries: Measure real-user performance with small, privacy-friendly scripts to track Web Vitals.
DevTools: Network throttling, coverage analysis, performance profiling, and service worker inspection.
Choose a stack that fits your team and product roadmap; PWAs are about capabilities, not specific frameworks.
Common Pitfalls and How to Avoid Them
Even seasoned teams hit a few bumps on the road to PWA excellence. Watch for these and mitigate early:
Cache stampedes and stale content: Without proper versioning and validation, users can see outdated UI or data.
Mitigation: Use content hashing, etags, cache-busting for app shell assets, and stale-while-revalidate for data.
Aggressive skipWaiting: Forcing immediate SW activation can drop in-flight requests or state.
Mitigation: Prompt the user or delay activation until a low-risk moment.
Offline illusions: An offline app that fails silently on critical actions erodes trust.
Mitigation: Provide explicit offline indicators, queue actions, and show sync status.
Bloated bundles: Large JS payloads negate caching benefits and hurt initial load.
Mitigation: Split bundles, lazy-load, and remove unused dependencies.
Push notification abuse: Over-sending leads to opt-outs and brand fatigue.
Mitigation: Earn permission, segment carefully, send value, and cap frequency.
SPA-only SEO: If content requires JS to appear, crawlers and users on low-end devices can suffer.
Mitigation: SSR, SSG, or pre-render critical routes.
Complexity creep: Service workers can become complicated quickly.
Mitigation: Start with simple strategies, adopt Workbox, and document your decisions.
Data sync conflicts: Offline edits may conflict with server updates.
Mitigation: Use versioning, timestamps, and clear conflict resolution rules; inform the user when merges happen.
Measuring Success: Metrics That Matter
Track both performance and engagement to see the full picture of your PWA’s impact.
Performance (speed and stability):
LCP (Largest Contentful Paint): Aim for under 2.5s for most users.
INP (Interaction to Next Paint): Aim for responsive interactions under 200ms.
CLS (Cumulative Layout Shift): Keep under 0.1 for visual stability.
TTFB and FCP: Useful to track server and first render speeds.
Engagement (stickiness and growth):
Install rate: Percentage of eligible users who install the app.
Opt-in rate for push: Share of users granting notification permission.
Retention: Day 1, Day 7, Day 30 return rates.
Session length and depth: Time per session, pages/screens per session.
Push performance: Delivery, open rate, and downstream conversion.
Offline sessions: Number of sessions that used offline features.
Conversion metrics: Purchases, signups, content consumption, or other KPIs.
Implement event tracking to attribute improvements directly to PWA features. For instance, track install prompt impressions and acceptances, push-related conversions, offline-created orders synced later, and improvements in route-level paint times after caching changes.
Example Scenarios: How PWAs Move the Needle
Consider a few realistic examples that illustrate the impact of PWA patterns.
Ecommerce Storefront
Problem: High mobile bounce on cellular networks; cart abandonment due to slow pages and flaky connections.
PWA solution: Pre-cache the app shell and product listing templates; use stale-while-revalidate for category pages; lazy-load images with responsive formats; queue cart updates offline with background sync.
Result: Faster first meaningful paint, near-instant navigation between product pages, resilient cart operations even offline, and higher conversion on low-end devices.
News and Content Publisher
Problem: Users bounce before article content appears; returning visits go to competitors.
PWA solution: Server-render article pages, pre-cache the shell and the latest headlines, enable install and read-later offline saves, and send personalized push for topics followed.
Result: Immediate content paint, frequent offline reading during commutes, and increased daily active users.
SaaS Dashboard
Problem: Heavy JS slows initial load; users need to access metrics even in poor connectivity.
PWA solution: Code-split per route, prefetch likely next routes on idle, cache API responses for summary widgets, and show skeleton UIs while syncing.
Result: Perceived responsiveness improves, users rely on the app during network blips, and support tickets about slowness decline.
Accessibility in PWAs: Fast and Inclusive
Speed and accessibility go hand-in-hand. Ensure your PWA is accessible:
Keyboard and screen reader support: Focus management and ARIA labels.
High contrast and scalable text: Respect prefers-reduced-motion; avoid reliance on color alone.
Offline indicators readable by assistive tech: Announce offline state changes.
Install prompts accessible: Buttons and dialogs should be operable by keyboard and announced properly.
Engagement rises when everyone can use your app comfortably.
Compliance and Data Protection
If you collect personal data or send notifications:
Obtain clear consent for push notifications and analytics tracking where required.
Provide a privacy policy that explains data use, storage, and retention.
Allow users to revoke permissions easily and honor opt-out.
Minimize data at rest on the device; encrypt sensitive data and avoid storing secrets in client storage.
Compliance is not just legal hygiene; it builds user trust and reduces churn.
Deployment, Versioning, and Rollbacks
Treat your PWA like any serious software product:
Semantic versioning for both app code and service worker.
Canary releases: Serve a small percentage of clients with the new SW first.
Feature flags: Toggle new features without redeploying the SW.
Rollback plan: Ability to revert to a prior SW quickly if regressions occur.
A disciplined release process ensures your PWA evolves rapidly without surprises.
A Practical PWA Checklist
Use this checklist as a launch companion for your PWA:
Security and infra
HTTPS enabled with HSTS
CDN with HTTP/2 or HTTP/3
CSP policy in place
Installability
Valid manifest with icons and theme color
Service worker with fetch handler
Passes Lighthouse installability checks
Performance
LCP under 2.5s for majority of users
INP within 200ms
CLS under 0.1
Minimal app shell size; code-splitting enabled
Responsive images and next-gen formats
Fonts with font-display: swap
Offline and caching
Pre-cache shell and critical assets
Route-level caching strategies (SW or Workbox)
Offline fallback page and skeleton screens
Clear update strategy and versioning
Engagement
Thoughtful install prompt flow
Optional push with segmentation and settings
Deep links and shareability
SEO
SSR/SSG or pre-render critical content
Sitemaps, canonical tags, and structured data
Proper 404 handling for deep links
Analytics and monitoring
Web Vitals RUM collection
Event tracking for install, push, offline usage
Error logs for SW and caching failures
Accessibility and compliance
Keyboard navigation, ARIA, color contrast
Clear privacy and permission management
Testing
Cross-browser and cross-device install/offline
Throttled network and CPU scenarios
Regression tests for SW lifecycle
Check these boxes, and your PWA will likely deliver both speed and engagement.
Frequently Asked Questions (FAQs)
Do PWAs help with SEO?
Yes, as long as you follow web SEO best practices. PWAs are just websites with extra capabilities. Use server-side rendering or static pre-rendering for content pages, provide proper metadata and sitemaps, and keep performance high. Speed and good HTML structure help indexing and ranking.
Are PWAs a replacement for native apps?
Not always. PWAs cover many use cases well, especially content, ecommerce, and dashboards. For deep hardware access, specialized sensors, or platform-specific features, native may still be preferable. Many companies run both and steer users to the best choice per context.
Can a PWA send push notifications on iOS?
Support exists for web push in certain contexts and versions, but capabilities and flows differ from other platforms. Always feature-detect and provide fallbacks. If push is critical to your business, test thoroughly on your target iOS versions and device types.
How do I measure the success of my PWA?
Track both performance (LCP, INP, CLS) and engagement (install rate, push opt-in, retention, conversion). Tie specific PWA features to outcomes: use event tracking for install prompts, offline sessions, and push-driven conversions.
Will a service worker break my site if implemented incorrectly?
It can cause issues like stale content or caching bugs if misconfigured. Start small, use Workbox to reduce risk, and set up a clear update strategy with careful activation. Monitor errors and be ready to roll back.
What about app store presence?
PWAs are discoverable via the web and can be installed directly. Some ecosystems support packaging a PWA for stores. Evaluate whether store distribution adds value for your audience; the web’s frictionless install is often enough.
How big should my app shell be?
As small as possible. Keep the shell minimal and load features on demand. A lean shell paints instantly and lets cached navigation feel native.
Do I need a backend change to support a PWA?
Not always, but it often helps. Server-rendered HTML, HTTP caching headers, and robust APIs improve performance and resilience. At a minimum, ensure your server returns the right content for deep links and 404s.
Is offline support mandatory for a PWA?
Strictly speaking, a service worker with a fetch handler is required for installability, but the depth of offline support is up to you. Even a basic offline fallback page is valuable. Build deeper offline features if they align with your users’ needs.
Does a PWA work on desktop?
Yes. Modern desktop browsers support installation and app-like windows. Many teams report strong engagement from desktop-installed PWAs, especially for productivity and SaaS apps.
Actionable Implementation Guide: A Sample Roadmap (90 Days)
Week 1–2: Assessment and Planning
Run Lighthouse and RUM to baseline performance and PWA criteria.
Map user journeys and identify offline opportunities.
Decide SSR/SSG vs. SPA + pre-render approach.
Draft a notification and install prompt strategy.
Week 3–4: Infrastructure and Foundations
Enforce HTTPS and HSTS across environments.
Set up CDN with HTTP/2 or HTTP/3.
Implement CSP, security headers, and basic RUM.
Week 5–6: PWA Core
Add manifest, icons, and theme color.
Build a minimal service worker: pre-cache shell, offline fallback, cache-first for static.
Implement code splitting and responsive images.
Week 7–8: Engagement Features
Add install prompt flow with analytics.
Implement offline storage for one key feature (e.g., cart, read later, drafts).
Optional: Add push notifications with settings screen.
Week 9–10: Performance and SEO
SSR/SSG for content or primary routes.
Optimize Web Vitals with route-specific budgets and fixes.
Preload critical assets; refine lazy-loading.
Week 11–12: Testing, Rollout, and Monitoring
Cross-device testing for offline, install, and push.
Canary release SW; monitor errors and metrics.
Week 13+: Iterate
Ship improvements based on user behavior and metrics.
Expand offline capabilities and personalization.
Call to Action: Build a PWA That Users Love
If you want the speed of an optimized site and the stickiness of an app without the cost of maintaining multiple native codebases, a PWA is your best path forward. Start small, focus on user value, and iterate.
Need a hands-on audit and PWA plan tailored to your product? Let GitNexa help you blueprint the right capabilities.
Ready to implement? We can assist with Workbox, SSR/SSG strategies, and engagement flows that convert.
Get in touch and turn your website into a fast, reliable, and engaging progressive web app.
Final Thoughts
Progressive Web Apps represent the web at its best: open, linkable, fast, and capable. They do not ask you to abandon your existing site or rewrite everything at once. Instead, they invite you to add capabilities progressively, guided by user needs and business goals.
When you combine a lean app shell, smart caching, and thoughtful engagement mechanics, PWAs can deliver a delightful experience that keeps users coming back—on any device, across any connection. And because it is still the web, you benefit from easy discovery, lower acquisition costs, and continuous delivery without app store gatekeeping.
Start with a plan, implement the foundations, and let real-world metrics guide your next steps. With disciplined performance work and respectful engagement, your PWA will improve both speed and retention—and that is a competitive edge you can measure.
progressive web appsPWAservice workerweb app manifestweb performancecore web vitalsLCPINPCLSWorkboxLighthouseoffline cachingadd to home screenweb push notificationsbackground syncIndexedDBapp shellresponsive imagescode splittingSSRSSGHTTP/2HTTP/3SEO for PWAinstall rateengagement metrics