Skip to content

Periodic Background Sync support

Published Updated

Periodic Background Sync lets a web app’s service worker periodically synchronize data in the background, so a PWA can show fresh content immediately on launch instead of fetching it while the user waits.

  • Legend
  • Yes
  • Partial
  • Flag
  • No
  • Unknown
Browser / PlatformSupportVersionsConfidenceSourceNotes
Chrome (Desktop)Yes80highsource—
Chrome (Android)Yes80highsource1
Edge (Desktop)Yes80highsource2
Firefox (Desktop)No—highsource3
Firefox (Android)No—highsource45
Safari (macOS)No—highsource6
Safari (iOS)No—highsource78
Samsung InternetYes13.0highsource9
WebView (Android)No—highsource10
  1. Derived by browser-compat-data mirroring from Chrome.
  2. Derived by browser-compat-data mirroring from Chrome.
  3. No Firefox support is recorded in browser-compat-data.
  4. No Firefox for Android support is recorded in browser-compat-data.
  5. Derived by browser-compat-data mirroring from Firefox.
  6. No Safari support is recorded in browser-compat-data.
  7. No Safari on iOS support is recorded in browser-compat-data.
  8. Derived by browser-compat-data mirroring from Safari.
  9. Derived by browser-compat-data mirroring from Chrome Android.
  10. Implementation tracking: https://crbug.com/40151529.

Source data: /compatibility/periodic-background-sync.json · Global usage: 72 % (StatCounter 2026-05)

Source: spec · MDN · Last verified 2026-10-03 · Confidence: high (computed from sources)

Register a periodic sync tag with a minimum interval (in milliseconds) once the service worker is ready:

async function registerPeriodicSync() {
const registration = await navigator.serviceWorker.ready;
await registration.periodicSync.register('get-latest-news', {
minInterval: 24 * 60 * 60 * 1000,
});
}

In the service worker, handle the periodicsync event by tag:

self.addEventListener('periodicsync', (event) => {
if (event.tag === 'get-latest-news') {
event.waitUntil(fetchAndCacheLatestNews());
}
});

Feature-detect periodicSync on the service worker registration before registering. When it is absent, fall back to refreshing content on page load instead:

async function scheduleRefresh() {
const registration = await navigator.serviceWorker.ready;
if ('periodicSync' in registration) {
await registration.periodicSync.register('get-latest-news', {
minInterval: 24 * 60 * 60 * 1000,
});
} else {
await fetchAndCacheLatestNews();
}
}
  • Chrome grants the periodic background sync permission only to an installed web app that has been launched as a separate application — not to a page open in a regular browser tab.
  • The browser, not your app, decides the actual sync frequency based on site engagement and other signals; treat minInterval as a lower bound, not a guarantee.
  • Firefox and Safari do not implement this API — always provide a fallback refresh path (e.g. on page load) for those browsers.
  • Use distinct tag values for independent periodic tasks and branch on event.tag in the periodicsync handler.

← Back to the Compatibility explorer.