Title: Progressive Web App &#8211; PWA, Web Push Notifications and Offline Mode
Author: DevDiggers
Published: <strong>September 5, 2026</strong>
Last modified: September 5, 2026

---

Search plugins

![](https://ps.w.org/devdiggers-pwa/assets/banner-772x250.png?rev=3682482)

![](https://ps.w.org/devdiggers-pwa/assets/icon-256x256.gif?rev=3682482)

# Progressive Web App – PWA, Web Push Notifications and Offline Mode

 By [DevDiggers](https://profiles.wordpress.org/devdiggers/)

[Download](https://downloads.wordpress.org/plugin/devdiggers-pwa.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/devdiggers-pwa/#description)
 * [Reviews](https://wordpress.org/plugins/devdiggers-pwa/#reviews)
 *  [Installation](https://wordpress.org/plugins/devdiggers-pwa/#installation)
 * [Development](https://wordpress.org/plugins/devdiggers-pwa/#developers)

 [Support](https://wordpress.org/support/plugin/devdiggers-pwa/)

## Description

This plugin turns your WordPress or WooCommerce site into a progressive web app:
an app people can install on their phone from the browser, with your icon on their
home screen, your splash screen when it opens, pages that still load when the signal
drops, and web push notifications that bring them back.

You get the three things a [WordPress PWA Plugin](https://devdiggers.com/product/progressive-web-app-for-wordpress/)
is made of, all configurable from one menu. A web app manifest, so browsers offer
to install your site. A service worker, so visited pages stay readable offline. 
And web push notifications through Firebase Cloud Messaging, so you can reach people
on Android, Windows, macOS and iOS after they leave.

#### Push notifications without a monthly bill

Most push notification plugins are the front end of a paid service. You connect 
an account, and once you pass a few thousand subscribers you start paying every 
month to message people who already opted in on your site. Your list lives on their
servers.

This one works differently. You create a free Firebase project, paste three values
into the settings, and notifications go out from your own project. There is no subscriber
limit, no per message price and no trial period. The subscriber list sits in your
own database tables, on your own server, and you can export or delete it whenever
you want.

#### Quick links

 * [View Demo](https://demo.devdiggers.com/progressive-web-app-for-wordpress/)
 * [Documentation](https://docs.devdiggers.com/progressive-web-app-for-wordpress/)
 * [Support](https://devdiggers.com/contact/)

#### Turn your website into an installable app

Visitors get an install prompt on Android and desktop Chrome, and Add to Home Screen
on iOS. Once installed, your site opens in its own window with no browser bar, its
own app icon and its own splash screen.

 * Full web app manifest control: name, short name, theme and background colour,
   display mode, orientation, scope, start URL, description and categories.
 * Upload your own app icon set, including a maskable icon so Android does not crop
   your logo into a circle.
 * Store screenshots for the richer, app store style install dialog Chrome shows
   when both a wide and a narrow screenshot are supplied.
 * iOS splash screens, so the installed app does not open on a blank white screen,
   plus an iOS status bar style.
 * An install banner with your own title, message, button label and colours, plus
   a [ddwppwa_install_button] shortcode for putting an install button in a page,
   post or widget.
 * Optional campaign parameters on the start URL, so app launches can be told apart
   from ordinary visits in your analytics.

#### Offline browsing with a service worker

A service worker caches the pages people visit, so a dropped signal on a train or
in a lift does not end the visit.

 * Network first caching. A visitor with a connection always sees your current content,
   and the cache is only reached for when the network is not there.
 * Set how long a cached page stays usable.
 * Point the offline fallback at any page you have written, or use the built in 
   offline screen.
 * Keep pages out of the cache with a never cache list. Your cart, checkout and 
   account pages are filled in for you, because a cached cart is a support ticket.

#### Web push notifications on Android, desktop and iOS

Notifications are delivered by Firebase Cloud Messaging using your own project, 
so there is no cap on subscribers and no per message pricing from us.

 * Write a push notification with a title, message, image and click URL, then send
   it to everyone who subscribed.
 * Send a quick push straight from any post with the Send Push box in the editor.
 * Send a push automatically when you publish a new post, with a per post switch
   for the ones that should stay quiet, and placeholders for the title, URL, excerpt
   and site name.
 * Welcome new subscribers with a one time notification.
 * Style the permission prompt with your own wording and colours, delay it by a 
   number of seconds or page views, and exclude the pages where asking would be 
   rude.
 * A Test Notification button, so you find out your setup is wrong before your subscribers
   do.
 * A [ddwppwa_subscribe_button] shortcode for asking permission from inside your
   content.

#### See who subscribed and what you sent

 * A dashboard with total installs, active installs, subscribers and notifications
   sent.
 * An app readiness score out of 100, worked out from the same checks as the Status
   tab, with whatever is holding it back listed underneath.
 * Charts for app performance over time, notifications sent, notifications by type
   and which browsers your visitors are on.
 * A Delivery Log with a row for every push: type, status, how many devices it reached,
   and the reason when a send fails.
 * A Subscribers screen listing every known device with its platform, browser, status,
   signed in user, when it was installed and when it was last seen.
 * A setup checklist, and a Status tab that checks HTTPS, OpenSSL, your generated
   files, your icons and your Firebase credentials, then shows what each browser
   lets your app do.

#### Works with AMP, multisite, WPML and WooCommerce

 * AMP. On an AMP page no script is enqueued, so the page stays valid and keeps 
   its AMP cache listing. The manifest and the app meta tags are valid AMP and are
   still added, so the page is still installable. Works with the official AMP plugin
   and with AMP for WP.
 * Multisite. Every site in the network gets its own manifest, its own settings 
   and its own subscriber list. Nothing is shared between them.
 * WPML and Polylang. The app name, short name, description, install banner and 
   permission prompt are registered for translation under the DevDiggers PWA string
   group, and the manifest is served in the language the visitor is reading, so 
   a French visitor installs an app named in French.
 * WooCommerce. HPOS compatible, and the cart, checkout and account pages are kept
   out of the offline cache by default.

#### Turn off what you do not need

The installable app, offline support, push notifications and analytics tracking 
each have their own switch, at the top of the tab where that feature is configured.
Switching one off unregisters its hooks completely, which also makes it the quickest
way to find out whether another plugin is conflicting.

#### Free vs Pro

Everything above is in this free plugin, with no subscriber cap, no sending fees
and no trial period.

[DevDiggers PWA Pro](https://devdiggers.com/product/progressive-web-app-for-wordpress/)
adds:

 * Click tracking and click through rate. See how many people opened each notification,
   per send and across the site, with an engagement chart on the dashboard.
 * Audience targeting. Send to logged in users, guests, installed app users or WooCommerce
   customers instead of everyone.
 * Scheduled sends. Pick a future date and time and the notification sends itself.
 * Action buttons and badges. Up to two buttons on a notification, each opening 
   its own URL, plus a badge icon for the Android status bar.
 * WooCommerce push notifications. New product and on sale pushes, back in stock
   alerts for the shoppers who asked, order status updates to the buyer’s own devices,
   and abandoned cart reminders.
 * Recurring digest. A daily or weekly broadcast on the day and time you choose.
 * App shortcuts and a QR code. Quick links in the menu that opens when someone 
   long presses your app icon, plus a printable QR code for the app start URL.
 * Cache first strategy. Serve the stored copy of a page immediately for a noticeably
   faster repeat visit. Free is always network first.
 * App Experience. A bottom tab bar built from a WordPress menu, pull to refresh,
   page transitions, a loading bar, a dark mode toggle, the device share sheet, 
   haptic feedback, a screen wake lock and saved form entries.
 * Android app for the Play Store. Store readiness checks, the packaging file for
   PWABuilder or Bubblewrap, and the asset links file served from your own site 
   so the installed app opens with no browser bar. You keep your own signing key.
   The iOS project is generated the same way.
 * Send when back online. A comment or contact form submitted with no signal is 
   queued on the device and sent as soon as the connection returns, instead of being
   lost to a browser error page.
 * Save for offline. A button that keeps a page on the device for reading later,
   listed in the browser’s own downloads area.

### External services

This plugin uses the following external services. Each is described here so you 
know what is sent, why, and when.

**1. Firebase Cloud Messaging (server side)**

 * What it is: Firebase Cloud Messaging, a Google service, delivers web push notifications
   to browsers that subscribed on your site. It runs under the Firebase project 
   you create yourself and connect under Configuration > Push Setup.
 * What it is used for: Sending your push notifications, and managing the topics
   a device is subscribed to.
 * When data is sent: Only when a notification is sent, whether you sent it by hand,
   the Test Notification button sent it, or an automation such as Auto Push on Publish
   or the welcome notification triggered it. Also when a device subscribes or unsubscribes,
   so its token can be added to or removed from a topic. Nothing is sent on a page
   load or on a schedule.
 * What data is sent: The notification title, message, image URL and click URL, 
   together with the browser push tokens of the devices it is going to. Your service
   account credentials are exchanged for a short lived access token first. No visitor
   name, email or order data is sent.
 * Endpoints: https://oauth2.googleapis.com/token, https://fcm.googleapis.com/v1/
   projects/{your-project-id}/messages:send, https://iid.googleapis.com/iid/v1:batchAdd
   and https://iid.googleapis.com/iid/v1:batchRemove
 * Terms of Service: https://firebase.google.com/terms
 * Privacy Policy: https://policies.google.com/privacy

**2. Firebase installations and registration (visitor’s browser)**

 * What it is: The same Firebase project, contacted by the Firebase JavaScript SDK
   running in the visitor’s browser rather than by your server.
 * What it is used for: Issuing the push token that identifies that browser, so 
   notifications can reach it. Without this step no device can receive a notification.
 * When data is sent: Only after a visitor allows notifications in the browser permission
   prompt, and afterwards when the browser refreshes an expiring token. Visitors
   who never allow notifications never contact these endpoints.
 * What data is sent: The public Firebase config you entered, the VAPID public key,
   the browser’s own push endpoint and keys, and the usual request data such as 
   IP address and user agent. The token that comes back is stored in your database
   so you can send to that device.
 * Endpoints: https://firebaseinstallations.googleapis.com/v1 and https://fcmregistrations.
   googleapis.com/v1
 * Terms of Service: https://firebase.google.com/terms
 * Privacy Policy: https://policies.google.com/privacy

The Firebase JavaScript SDK itself ships inside this plugin and is served from your
own domain, so no script is loaded from a third party. Only the requests described
above leave the browser.

**3. DevDiggers extensions directory**

 * What it is: A read only API on devdiggers.com that returns the public list of
   DevDiggers extensions.
 * What it is used for: Showing available DevDiggers extensions on the Extensions
   admin page.
 * When data is sent: Only when a logged in administrator opens the Extensions admin
   page. The response is cached for 24 hours, so the request does not repeat on 
   every page load.
 * What data is sent: A standard outbound HTTP request only, meaning your server’s
   IP address and a plugin user agent string, as with any web request. No personal
   data and no site data are sent.
 * Endpoint: https://devdiggers.com/wp-json/ddwcs/v1/plugins

**4. Newsletter subscription (optional)**

 * What it is: A contact and newsletter endpoint on devdiggers.com.
 * What it is used for: Adding your email address to the DevDiggers newsletter, 
   only if you choose to subscribe.
 * When data is sent: Only when an administrator submits the optional newsletter
   form in the plugin dashboard. Nothing is sent automatically.
 * What data is sent: The email address you enter and your site URL.
 * Endpoint: https://devdiggers.com/

**5. Gravatar (avatar images)**

 * What it is: Gravatar, the globally recognised avatar service operated by Automattic.
 * What it is used for: WordPress core’s `get_avatar_url()` is used to show the 
   logged in administrator’s avatar in the plugin dashboard header. This is standard
   WordPress behaviour and is not specific to this plugin.
 * When data is sent: Only when a logged in administrator opens the plugin dashboard
   and WordPress avatars are enabled in Settings > Discussion. Disabling avatars
   there stops the request completely.
 * What data is sent: An MD5 hash of the administrator’s email address, inside the
   image URL requested by the browser, plus the usual request data such as IP address
   and user agent.
 * Endpoint: https://secure.gravatar.com/avatar/
 * Terms of Service: https://automattic.com/terms/
 * Privacy Policy: https://automattic.com/privacy/

The DevDiggers services above (3 and 4) are provided by DevDiggers. By using them
you agree to the DevDiggers Terms and Conditions (https://devdiggers.com/terms-and-
conditions/) and Privacy Policy (https://devdiggers.com/privacy-policy/).

This plugin contains no licensing checks, no update checks and no telemetry.

### Source code and build tools

The admin and frontend JavaScript and CSS are compiled from the `src/` folder with
webpack and Babel. The complete, human readable source code, including all build
configuration, is published in our public GitHub repository:

https://github.com/DevDiggers-Technologies/pwa

To build the assets from source:

 1. Run `npm install` to install the build dependencies listed in `package.json`.
 2. Run `npm run build` to compile the production assets into `assets/js` and `assets/
    css`.

The build configuration is in `webpack.config.js` and `babel.config.js`. The shared
DevDiggers framework in `devdiggers-framework/` builds the same way from its own`
src/` folder and its own `package.json`.

Three third-party libraries ship unmodified, exactly as their projects release them,
all under the MIT licence: Chart.js 4.5.1 (https://www.chartjs.org), Select2 4.1.0(
https://select2.org) and the Firebase JavaScript SDK 10.12.3 (https://firebase.google.
com/docs/web/setup), in `assets/js/vendor/`.

## Screenshots

[⌊Dashboard with installs, subscribers, notifications sent, charts and the setup
checklist.⌉⌊Dashboard with installs, subscribers, notifications sent, charts and
the setup checklist.⌉[

Dashboard with installs, subscribers, notifications sent, charts and the setup checklist.

[⌊Delivery Log with the type, status and audience of every push.⌉⌊Delivery Log with
the type, status and audience of every push.⌉[

Delivery Log with the type, status and audience of every push.

[⌊The notification list and the add notification screen.⌉⌊The notification list 
and the add notification screen.⌉[

The notification list and the add notification screen.

[⌊Automations: auto push on publish and the welcome notification.⌉⌊Automations: 
auto push on publish and the welcome notification.⌉[

Automations: auto push on publish and the welcome notification.

[⌊Configuration tabs for the manifest, app icons and offline behaviour.⌉⌊Configuration
tabs for the manifest, app icons and offline behaviour.⌉[

Configuration tabs for the manifest, app icons and offline behaviour.

[⌊Status tab with the setup checks and the browser support list.⌉⌊Status tab with
the setup checks and the browser support list.⌉[

Status tab with the setup checks and the browser support list.

[⌊The install prompt and a push notification on the storefront.⌉⌊The install prompt
and a push notification on the storefront.⌉[

The install prompt and a push notification on the storefront.

[[

[[

[[

[[

## Installation

 1. Upload the devdiggers-pwa folder to /wp-content/plugins/, or install the zip from
    Plugins > Add New.
 2. Activate the plugin through the Plugins menu.
 3. Open the Progressive Web App menu and run the Setup Wizard.
 4. For push notifications, create a free Firebase project, then paste the Firebase
    config, the VAPID key and the service account JSON into Configuration > Push Setup.

Push notifications and offline browsing need a secure context, so serve your site
over HTTPS. Localhost is fine while you are developing. The plugin warns you in 
the admin if it is not.

## FAQ

### How do I turn my WordPress site into an app?

Activate the plugin and run the Setup Wizard. It writes the web app manifest and
the service worker for you, and asks for an app name, an icon and a theme colour.
After that, browsers on Android and desktop offer an install prompt, and iPhone 
users can add your site to the home screen from the Safari share sheet.

### Do I need an SSL certificate?

Yes. Browsers only allow service workers and web push over HTTPS, or on localhost
during development. Without it the app cannot be installed and no notification can
be delivered.

### Is there a limit on subscribers or notifications?

No. Notifications are delivered by Firebase Cloud Messaging using a Firebase project
you create yourself, so the sending limits are Google’s rather than ours. There 
is no subscriber cap in the plugin, no per message price and nothing to pay us for
the free version.

### Do I need a Firebase account?

Yes, for push notifications. It is free to create. Add the Firebase config, the 
VAPID key and the service account JSON under Push Setup, then use the Test Notification
button to confirm it works. The installable app and offline browsing need no Firebase
account at all.

### Do web push notifications work on iPhone?

Yes, within the limits Apple sets. iOS delivers web push only after the visitor 
has added your site to the home screen from the Safari share sheet. Once it is added,
the installed app gets your icon and splash screen and can receive notifications
like any other device.

### Does it work with WooCommerce?

Yes. It is HPOS compatible, and the cart, checkout and account pages are kept out
of the offline cache by default so nobody is shown a stale basket. Store event pushes,
such as order status updates, back in stock alerts and abandoned cart reminders,
are part of the Pro version.

### Does it work with AMP?

Yes. On an AMP page no script is enqueued, so the page stays valid, but the manifest
and app meta tags are still added and the page is still installable. Both the official
AMP plugin and AMP for WP are detected.

### Can I send a push automatically when I publish a post?

Yes. Turn on Auto Push on Publish under Automations and every published post broadcasts
to your subscribers, using a title template with placeholders for the post title,
URL, excerpt and site name. Any single post can opt out from the Send Push box in
the editor.

### Can I see what I have sent?

Yes. Every push is recorded in the Delivery Log with its type, delivery status, 
the number of devices it reached and the reason when a send fails. Knowing how many
people opened each notification, as a click count and a click through rate, is part
of the Pro version.

### Can I use it on a multisite network or a translated site?

Yes. Each site in a network keeps its own manifest, settings and subscriber list.
With WPML or Polylang, the app name, description, install banner and permission 
prompt are registered for translation and the manifest is served in the visitor’s
language.

### Will this slow my site down?

The front end adds a small script and a service worker. Caching usually makes repeat
visits faster rather than slower, and if you do not want a particular feature, each
one has its own switch.

### Can I publish the app on Google Play?

Not from the free version. Free gives you the installable web app that Android and
iOS both accept from the browser. The packaging file for PWABuilder or Bubblewrap,
the store readiness checks and the asset links file needed for a Play Store listing
are part of the Pro version.

### What happens to my subscribers if I delete the plugin?

They are kept. Deleting the plugin removes the generated service worker and manifest,
because a stale service worker would keep serving cached pages, but your notifications,
subscribers and delivery log stay in the database unless you tick the setting that
asks for them to be removed.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Progressive Web App – PWA, Web Push Notifications and Offline Mode” is open source
software. The following people have contributed to this plugin.

Contributors

 *   [ DevDiggers ](https://profiles.wordpress.org/devdiggers/)

[Translate “Progressive Web App – PWA, Web Push Notifications and Offline Mode” into your language.](https://translate.wordpress.org/projects/wp-plugins/devdiggers-pwa)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/devdiggers-pwa/), check
out the [SVN repository](https://plugins.svn.wordpress.org/devdiggers-pwa/), or 
subscribe to the [development log](https://plugins.trac.wordpress.org/log/devdiggers-pwa/)
by [RSS](https://plugins.trac.wordpress.org/log/devdiggers-pwa/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * Initial release of the free version.

## Meta

 *  Version **1.0.0**
 *  Last updated **9 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [add to home screen](https://wordpress.org/plugins/tags/add-to-home-screen/)[progressive web apps](https://wordpress.org/plugins/tags/progressive-web-apps/)
   [push notifications](https://wordpress.org/plugins/tags/push-notifications/)[pwa](https://wordpress.org/plugins/tags/pwa/)
   [web push](https://wordpress.org/plugins/tags/web-push/)
 *  [Advanced View](https://wordpress.org/plugins/devdiggers-pwa/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/devdiggers-pwa/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/devdiggers-pwa/reviews/)

## Contributors

 *   [ DevDiggers ](https://profiles.wordpress.org/devdiggers/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/devdiggers-pwa/)