Analytics for browser extensions

Do you know how many of your users actually pinned your extension?

The Chrome Web Store won’t tell you. Neither will Google Analytics. One SDK call gives you pin rate, permission declines, uninstall reasons and release impact — from the day you ship.

SDK 0.6 · MV3-ready · Remote modules · Chrome / Firefox / Edge / Safari

Live feed1,204 connected
09:40:18extension_installedv3.2.1 · chrome · 🇸🇪 SE
09:40:26extension_heartbeatdaily · firefox · 🇫🇷 FR
09:40:31extension_ui_openedpopup · action_icon
09:40:39context_menu_clickedselection · chrome · 🇩🇪 DE
09:40:44uninstallv3.0.9 · edge · 🇺🇸 US
09:40:51extension_updated3.1.4 -> 3.2.1 · chrome · 🇧🇷 BR
09:40:57toolbar_pin_state_seenpinned · safari · 🇯🇵 JP
09:41:04permission_requestedtabs · firefox · 🇮🇳 IN
09:41:12permission_grantedtabs · popup
09:41:20custom_eventrule_created · chrome · 🇳🇱 NL
09:40:18extension_installedv3.2.1 · chrome · 🇸🇪 SE
09:40:26extension_heartbeatdaily · firefox · 🇫🇷 FR
09:40:31extension_ui_openedpopup · action_icon
09:40:39context_menu_clickedselection · chrome · 🇩🇪 DE
09:40:44uninstallv3.0.9 · edge · 🇺🇸 US
09:40:51extension_updated3.1.4 -> 3.2.1 · chrome · 🇧🇷 BR
09:40:57toolbar_pin_state_seenpinned · safari · 🇯🇵 JP
09:41:04permission_requestedtabs · firefox · 🇮🇳 IN
09:41:12permission_grantedtabs · popup
09:41:20custom_eventrule_created · chrome · 🇳🇱 NL

Events stream over SSE when the public demo is active

The difference

Four numbers nobody else can give you.

Mixpanel, Amplitude and PostHog are excellent at web products. None of them knows what a toolbar is. The figures below are live from the public demo.

Pin rate

21%

1,364 of 6,516 known toolbar states

Is your icon still on the toolbar?

Chrome reports whether each user kept your extension visible. An extension nobody can see is an extension nobody opens — and no store dashboard exposes this.

Permission declines

no permission prompt in the last 7 days

Who said no to the prompt?

Optional permissions are where activation quietly dies. You see requested, granted, declined and revoked — not just the users who made it through.

Uninstall reasons

Not working

14 of 29 answered uninstalls

Why did they actually leave?

The uninstall opens a feedback page in the user's language. Seven reasons, one optional comment, landing next to your churn numbers.

Release impact

5%

v1.1.8 share of the observed base

What did this version change?

Adoption, update lag and churn per version, so a regression shows up as a shape in the data instead of a one-star review three weeks later.

Why extensions are different

You ship, then wait days to find out what happened.

Web teams deploy in five minutes and roll back in one. You submit a build, wait for review, then watch it reach users gradually — with no way to hotfix. Every analytics tool on the market was designed for the first world.

Store dashboard only

  1. Day 0

    You submit the release

    The build leaves your machine. Nothing about it is observable yet.

  2. Day 1–5

    Store review

    You cannot ship a fix, and you cannot see who received what.

  3. Day 5+

    Gradual rollout

    Some users are on the new build, some are not. The store shows one rounded weekly number for both.

  4. Week 3

    A one-star review

    That is your regression report. You still do not know which version, which browser, or how many users.

With extension.report

  1. Hour 1

    The version appears

    First installations report the new version. Adoption starts as a curve, not a guess.

  2. Hour 6

    Behaviour is comparable

    Pin rate, open rate and permission outcomes for the new version sit next to the previous one.

  3. Day 1

    A regression has a shape

    Errors group by version. Uninstalls carry reasons. The affected population is a list you can open.

  4. Any moment

    You act without republishing

    Remote config reduces telemetry modules, targets compatible clients, caps traffic or stops collection — no second review.

The last step matters most. Because a fix takes days to reach users, the only thing that can act immediately is configuration the SDK fetches at runtime. See how remote modules work.

The gap

Store dashboards stop before the product work starts.

The store can tell you a rough audience number. It cannot tell you which release hurt retention, which browser keeps users, or what people say when they uninstall.

Store dashboard

Install base
rounded, delayed
Activation
not visible
Feature usage
not visible
Retention
not visible
Release impact
not visible
Uninstalls
partial, delayed
Uninstall reasons
not visible
Live activity
not visible

extension.report lifecycle view

Install base
daily, by browser and country
Activation
first opens and lifecycle events
Feature usage
custom events and counters
Retention
D1 / D7 / D30 cohorts
Release impact
versions and update paths
Uninstalls
observed + silence churn
Uninstall reasons
feedback page + comments
Live activity
real-time launch room

One SDK, one install base, broken down across Chrome, Edge, Firefox and Safari.

The product

Follow the full extension lifecycle.

Sample data — the public demo is warming up.

Micro → macro

Every metric opens the people behind it

Start with the signal. Open its exact population, inspect a real installation, then follow milestones and source events without rebuilding the query.

Observed installed
1,847
active base
Installed today
312
open population →
Net movement
+186
installs − uninstalls
Observed uninstalls
126
inspect reasons →

Selected population

Installed today

312 installations. Each row opens its complete trace.

Save as segment
Sofia · Pro
v3.2.1 · Chrome · 🇸🇪
First value reached
Anonymous · …a84f19c2
v3.2.1 · Edge · 🇫🇷
Pinned to toolbar
kenji@example.test
v3.2.1 · Firefox · 🇯🇵
Permission granted
Anonymous · …2d990bf1
v3.2.0 · Chrome · 🇩🇪
Opened popup

Retention

Find the versions and markets that keep users

Read retention curves, version adoption, update paths and country breakdowns in one place. When a release changes behavior, the dashboard should make it obvious.

Retention

38% of installs are still active a week later; 22% after 30 days.

Countries

🇺🇸United States502 45%
🇩🇪Germany187 17%
🇫🇷France165 15%
🇬🇧United Kingdom144 13%
🇧🇷Brazil118 11%

Versions

3.2.1861 71%
3.2.0172 14%
3.1.4121 10%
2.9.951 4%

Churn

Turn uninstalls into product feedback

When someone uninstalls, a feedback page opens in their language and asks why — seven reasons, one optional comment. Pair that with observed churn and heartbeat silence.

Top uninstall reasons

Not working34 40%
Too many permissions21 25%
Found an alternative17 20%
No longer needed12 14%

e.g. “Broke after the last Chrome update on my work laptop.” · Not working · v3.2.0

Integration

Wired in one call.

Initialize the SDK once and it tracks lifecycle, active usage, toolbar state, permissions, context menus, shortcuts, omnibox, and notification engagement when those browser APIs are present. Add explicit product events only where they matter. Adoption, Engagement, and Reliability remain remotely adjustable as coherent groups.

terminal
$pnpm add @extension-report/js@0.6.2
ChromeFirefoxEdgeSafari
extension.ts
import { initExtensionReport } from "@extension-report/js";

// initialize lifecycle and automatic extension signals
const sdk = initExtensionReport({ projectPublicKey: "pk_er_..." });

// optional: track specific UI or configuration moments
await sdk.popup.opened();
await sdk.trackCustomEvent("settings_saved");

SDK permissions are lightweight: "storage", "alarms", and your extension.report host permission. Feature permissions stay tied to the features your extension already uses.

Need server-side exports? Owner Stats API is available on plans with API access.

Pricing

Start with evidence. Scale with usage.

No trial clock and no invitation. Every plan uses the same owner-first telemetry pipeline; paid plans add capacity, history, and automation.

Free

€0/month

Understand one extension and reach your first insights.

Extensions
1
Team members
1
Monthly active users
1,000
Event history
30 days
Alerts
included
API & exports
  • 1 extension
  • 1,000 monthly active users
  • 30-day history
Start free

Pro

Built for growth
€29/month

€290 billed yearly

Operate a growing extension with deeper history and automation.

Extensions
5
Team members
5
Monthly active users
100,000
Event history
90 days
Alerts
included
API & exports
included
  • 5 extensions
  • 100,000 monthly active users
  • 90-day history
Choose Pro

Scale

€99/month

€990 billed yearly

Manage a portfolio with long-term history and higher limits.

Extensions
10
Team members
20
Monthly active users
1,000,000
Event history
365 days
Alerts
included
API & exports
included
  • 10 extensions
  • 1,000,000 monthly active users
  • 365-day history
Choose Scale

Prices exclude applicable taxes. You can change or cancel a paid plan from your workspace once billing is enabled.

Questions

Asked, answered.

Will this get my extension rejected from the store?

The SDK collects a random installation ID and coarse context (browser, OS, version) — no cookies, no browsing history, no personal data. Country is derived from the IP at ingestion and the IP isn't stored. You disclose the telemetry in your privacy policy like any analytics, and you stay well inside Chrome Web Store and AMO data policies.

How accurate is uninstall tracking?

Honest answer: it's best-effort, like everything built on setUninstallURL — some uninstall pages never open. That's why the dashboard pairs observed uninstalls with churn estimated from heartbeat silence, so the trend is reliable even when individual events are missed.

How do I learn why users uninstall?

The moment an uninstall happens, the browser opens your feedback page — localized in six languages — asking one question: why? Seven reasons, one optional comment. Reasons and quotes land on your report next to the churn numbers. No store dashboard does this.

Does it survive MV3 service workers going to sleep?

Yes — it was designed for that. Events queue persistently in storage.local, ship in batches with retry and exponential backoff, and heartbeats piggyback on alarms or the next wake. A worker being killed mid-flight loses nothing.

Which browsers are supported?

Chromium (Chrome, Edge, Brave, Arc…), Firefox, and Safari WebExtensions. One dashboard, one install base, broken down by browser, version and country.

What happens if my extension suddenly takes off?

Remote config is fetched by the SDK, so you can reduce Adoption, Engagement, or Reliability as coherent groups, roll changes out progressively, target compatible clients, cap noisy traffic, or stop telemetry entirely — without waiting for another store review.

I already use PostHog / Amplitude / Mixpanel. Why a second tool?

Because they cannot see the four things on this page. They are excellent at products that live in a page — but a toolbar pin, a permission prompt, an uninstall and a store rollout are not web events with different names, they are platform primitives their SDKs never receive. Most teams keep their product analytics for the web app and use extension.report for the extension.

Your extension has a lifecycle. Measure all of it.

Start tracking — first events in minutes →