Introduction: What Are Progressive Web Apps?
Progressive Web Apps (PWAs) combine the best of web and mobile apps. They're websites that look and feel like native mobile applications, with features like offline functionality, push notifications, and home screen installation—all without app store approval.
For SMEs, PWAs offer a cost-effective way to provide app-like experiences without the complexity and cost of developing separate native apps for iOS and Android.
Key characteristics of PWAs:
- Installable: Users can add to home screen like native apps
- Offline Capable: Work without internet connection
- Fast: Load instantly, even on slow networks
- Responsive: Work on any device, any screen size
- Secure: Served over HTTPS
Benefits Over Traditional Web Apps
Performance Advantages
PWAs use service workers to cache resources, enabling instant loading and offline functionality.
Cost Benefits
- Single Codebase: One PWA works on all platforms (iOS, Android, desktop)
- No App Store Fees: Bypass 15-30% app store commission
- Faster Development: 50-70% faster than native app development
- Easier Updates: Update instantly without app store approval
- Lower Maintenance: Maintain one codebase instead of multiple
User Experience Benefits
- App-like interface and navigation
- Full-screen experience (no browser UI)
- Smooth animations and transitions
- Native device features (camera, geolocation)
Offline Capabilities
How Offline Functionality Works
PWAs use service workers—JavaScript files that run in the background—to intercept network requests and serve cached content when offline.
Service Worker Example
// service-worker.js
const CACHE_NAME = 'pwa-cache-v1';
const urlsToCache = [
'/',
'/styles.css',
'/app.js',
'/offline.html'
];
// Install event - cache resources
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => cache.addAll(urlsToCache))
);
});
// Fetch event - serve from cache when offline
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then((response) => {
// Return cached version or fetch from network
return response || fetch(event.request)
.catch(() => {
// If offline and not cached, return offline page
if (event.request.destination === 'document') {
return caches.match('/offline.html');
}
});
})
);
});
// Update cache when new version available
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
return caches.delete(cacheName);
}
})
);
})
);
});
Offline Strategies
Cache First: Serve from cache, fallback to network (for static assets)
Network First: Try network, fallback to cache (for dynamic content)
Stale While Revalidate: Serve cache immediately, update in background
Background Sync: Queue actions when offline, sync when online
Push Notifications
Engaging Users Without Apps
PWAs can send push notifications just like native apps, re-engaging users and driving conversions.
Push Notification Implementation
// Request notification permission
async function requestNotificationPermission() {
if ('Notification' in window) {
const permission = await Notification.requestPermission();
if (permission === 'granted') {
// Subscribe to push notifications
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)
});
// Send subscription to server
await fetch('/api/subscribe', {
method: 'POST',
body: JSON.stringify(subscription),
headers: { 'Content-Type': 'application/json' }
});
}
}
}
// Service worker: Handle push notifications
self.addEventListener('push', (event) => {
const data = event.data.json();
const options = {
body: data.body,
icon: '/icon-192x192.png',
badge: '/badge-72x72.png',
vibrate: [200, 100, 200],
data: data.url,
actions: [
{ action: 'open', title: 'View' },
{ action: 'close', title: 'Close' }
]
};
event.waitUntil(
self.registration.showNotification(data.title, options)
);
});
// Handle notification clicks
self.addEventListener('notificationclick', (event) => {
event.notification.close();
if (event.action === 'open') {
event.waitUntil(
clients.openWindow(event.notification.data)
);
}
});
Use Cases for Push Notifications
- E-commerce: Abandoned cart reminders, sale alerts
- Content: New blog posts, article updates
- Services: Appointment reminders, order updates
- Engagement: Personalized offers, loyalty rewards
Real-World Examples
Case Study 1: Local Restaurant Chain
Challenge: Needed mobile ordering app but couldn't afford native app development.
Solution: Built PWA for online ordering with offline menu browsing.
Results:
- 40% increase in mobile orders
- 60% of users installed to home screen
- 25% reduction in development cost vs native app
- Works offline for menu browsing
Case Study 2: E-Commerce SME
Challenge: Low mobile conversion rates, high cart abandonment.
Solution: Converted website to PWA with push notifications and offline support.
Results:
- 35% increase in mobile conversions
- 20% reduction in cart abandonment
- 3x increase in repeat visits
- Push notifications: 15% click-through rate
Case Study 3: Service Business
Challenge: Needed appointment booking system accessible on mobile.
Solution: PWA with offline form submission and push notification reminders.
Results:
- 50% of bookings now come through PWA
- 30% reduction in no-shows (push reminders)
- Works in areas with poor connectivity
PWA Manifest File
Making Your App Installable
The web app manifest defines how your PWA appears when installed.
// manifest.json
{
"name": "My Business App",
"short_name": "MyApp",
"description": "Progressive Web App for my business",
"start_url": "/",
"display": "standalone",
"background_color": "#0f172a",
"theme_color": "#6366f1",
"orientation": "portrait-primary",
"icons": [
{
"src": "/icon-72x72.png",
"sizes": "72x72",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icon-96x96.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "/icon-128x128.png",
"sizes": "128x128",
"type": "image/png"
},
{
"src": "/icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src": "/icon-152x152.png",
"sizes": "152x152",
"type": "image/png"
},
{
"src": "/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icon-384x384.png",
"sizes": "384x384",
"type": "image/png"
},
{
"src": "/icon-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
}
],
"screenshots": [
{
"src": "/screenshot-wide.png",
"sizes": "1280x720",
"type": "image/png",
"form_factor": "wide"
},
{
"src": "/screenshot-narrow.png",
"sizes": "750x1334",
"type": "image/png",
"form_factor": "narrow"
}
],
"categories": ["business", "productivity"],
"shortcuts": [
{
"name": "New Order",
"short_name": "Order",
"description": "Create a new order",
"url": "/orders/new",
"icons": [{ "src": "/shortcut-order.png", "sizes": "96x96" }]
}
]
}
Implementation Checklist
- Serve over HTTPS (required for service workers)
- Create web app manifest (manifest.json)
- Register service worker
- Implement caching strategy
- Add install prompt
- Implement push notifications (optional)
- Test offline functionality
- Optimize for performance (Lighthouse PWA score)
Conclusion
Progressive Web Apps offer SMEs a cost-effective way to provide app-like experiences without the complexity and cost of native app development. With offline capabilities, push notifications, and home screen installation, PWAs can significantly boost user engagement and business reach.
For businesses looking to improve mobile user experience, increase engagement, and reduce development costs, PWAs represent an excellent investment. As browser support continues to improve and PWA capabilities expand, they're becoming the standard for modern web applications.