Plasmo Analytics: What Works in a Plasmo Extension's Service Worker
Plasmo analytics: where init() has to live, the dev-mode service worker trap, the storage permission Plasmo will not generate, and the env var rule.
Read more
How we think about extension analytics, plus deep dives on MV3 and Chrome Web Store policy.
Plasmo analytics: where init() has to live, the dev-mode service worker trap, the storage permission Plasmo will not generate, and the env var rule.
Read more
WXT analytics compared: what each @wxt-dev/analytics provider sends from an MV3 background service worker, read from the package source.
Read more
Why Manifest V3 splits permissions and host_permissions, what the optional keys add, and the match pattern and update rules that still break after the fix.
Read more
Do you need analytics in a Chrome extension? What to track, in what order, and the data Chrome's own policies forbid you from collecting.
Read more
Why a Chrome extension content script is not working: the manifest matches and run_at fix, patterns that match nothing, and SPA route changes.
Read more
How to find out why users uninstall your Chrome extension using the one page Chrome opens on removal, uninstall tenure, and events logged earlier.
Read more
What Firefox add-on analytics you get from the AMO statistics dashboard, why its numbers run low, and how to measure the rest from inside the add-on.
Read more
Inspect popup, reload from the Network panel, and the manifest, CSP, and module-path causes of a Chrome extension popup that renders blank.
Read more
Using Matomo in a Chrome extension: why the JavaScript snippet cannot run in an MV3 service worker, and what the HTTP Tracking API gives you instead.
Read more
What each chrome.identity.launchWebAuthFlow error message means in a Manifest V3 extension, the redirect URL Chrome accepts, and Firefox differences.
Read more
Chrome extension usage tracking in MV3: which events to fire, the click handlers that never fire, and how to turn events into feature adoption.
Read more
When Chrome extension analytics needs consent, why the ePrivacy device-storage rule decides it before GDPR does, and how to gate an SDK in MV3.
Read more
Why a WebSocket in an MV3 service worker dies after 30 seconds, the 20-second keepalive fix, and the failures that remain after you add it.
Read more
What free Chrome extension analytics really gets you, from the Web Store dashboard's limits to the event math that decides whether a free tier fits.
Read more
Why blocking webRequest listeners stop working in Manifest V3, the declarativeNetRequest rules that replace them, and what still breaks after.
Read more
Yes, with conditions. What the Limited Use policy, the Manifest V3 code rules, and Google's own Analytics terms require of an extension.
Read more
Sentry in a Manifest V3 Chrome extension: what Sentry's own docs prescribe, what they never mention, and what error logs you get without it.
Read more
Why chrome.tabs.executeScript is not a function in MV3, the chrome.scripting.executeScript call that replaces it, and what still breaks after.
Read more
Chrome extension retention is not in the Web Store dashboard as an install cohort. How to define day-7 and day-30 retention and compute it in MV3.
Read more
Why a Chrome extension throws "Cannot access contents of url", the host_permissions and activeTab fix, and the URLs no manifest key can unlock.
Read more
Chrome gives extensions no daily active users number. How to define DAU, WAU and MAU and measure them from an MV3 service worker heartbeat.
Read more
Firebase Analytics in a Chrome extension: Firebase's own table marks it unsupported and the SDK reaches for window. The source lines, and the alternative.
Read more
When to use chrome.tabs.sendMessage vs chrome.runtime.sendMessage in a Manifest V3 extension, and the routing rules that make messages silently disappear.
Read more
How to define a Chrome extension uninstall rate that means something, from picking the denominator to cohorting by install date and measuring it yourself.
Read more
Why Chrome logs "Denying load of chrome-extension://", the web_accessible_resources manifest fix for MV3, and the reasons the entry still does not work.
Read more
Putting Plausible or Umami in a Chrome extension: why the page snippet cannot run in an MV3 service worker, and what their HTTP APIs count as a visitor.
Read more
What Aptabase's browser extension SDK does inside an MV3 service worker, what it counts, and how it compares to Moderok, sourced from both products' own docs.
Read more
Why a Chrome extension throws "Refused to execute inline script", the external-file fix, and what still breaks after you move the code out.
Read more
A chrome extension analytics comparison of Moderok, the GA4 Measurement Protocol, Umami and PostHog, judged by what actually runs in an MV3 service worker.
Read more
Why a Chrome extension throws "Could not establish connection. Receiving end does not exist.", the inject-and-retry fix, and what still breaks after it.
Read more
A working GA4 Measurement Protocol setup for an MV3 Chrome extension, the documented limits you will hit, and the extension metrics GA4 never sees.
Read more
How many users does my Chrome extension have? What Web Store Installs and Weekly Users each count, and how to measure active users yourself.
Read more
Why chrome.cookies.get returns null in a Manifest V3 extension: the host permission rule, the url argument, partitioned cookies, and Firefox differences.
Read more
Analytics does not slow down a Chrome extension much, but it costs you something in four places. Here is what each one is and how to measure it.
Read more
Why chrome.storage.session throws "Access to storage is not allowed from this context" in a content script, the setAccessLevel fix, and what it misses.
Read more
The permissions an analytics SDK actually needs in a Manifest V3 extension, which ones add an install warning, and what to check before you pick one.
Read more
Why an MV3 service worker hits "Cannot create item with duplicate id", the chrome.runtime.onInstalled fix, and what still breaks after it.
Read more
Why a Chrome extension service worker throws "Cannot use import statement outside a module", the type module manifest fix, and why importScripts then breaks.
Read more
How to fill in browser_specific_settings.gecko.data_collection_permissions for a Firefox extension, and where analytics belongs in it.
Read more
Why Chrome throws "sidePanel.open() may only be called in response to a user gesture" after an await, and the call ordering that fixes it.
Read more
Why a Chrome extension fetch is blocked by CORS policy, how host_permissions exempts the request, and what to do when the fetch is in a content script.
Read more
Rejected with a two-word code like Blue Argon? Here is the full mapping of Chrome Web Store violation codes and how to fix the ones that hit real extensions.
Read more
Load an unpacked MV3 extension in Puppeteer, get the extension ID, run code inside the service worker, read its console, and force it to terminate.
Read more
Why Chrome throws "The message port closed before a response was received.", how return true and async onMessage listeners cause it, and the fix.
Read more
How a chrome.offscreen document runs DOMParser, clipboard, or audio code for an MV3 service worker, plus the one-document limit and lifetime rules.
Read more
Why a published Chrome extension update takes hours or days to reach users, covering Web Store review, percentage rollout, update checks, and the idle rule.
Read more
What the "Extension context invalidated" error means, why it hits content scripts after every extension update or reload, and how to detect and recover.
Read more
Which manifest keys trigger the scary Chrome "read and change all your data" permission warning, and three ways to narrow or remove it.
Read more
Why setInterval fails in an MV3 service worker, how chrome.alarms schedules periodic tasks that wake a terminated worker, and the 30-second minimum.
Read more
A Chrome MV3 service worker has no DOM, so "document is not defined" is expected: here is how to find the line that threw and the three ways to fix it.
Read more
We ranked 7 chrome extension analytics options: Web Store stats, GA4, Mixpanel, Amplitude, PostHog, Aptabase, and Moderok. One was built for the job.
Read more
Amplitude is enterprise analytics with enterprise overhead. See how its MV3 setup compares with Moderok, round by round.
Read more
Google Analytics wasn't built for Chrome extensions. Moderok was. A head-to-head on setup, dashboards, privacy, and price, with a clear winner.
Read more
Mixpanel's SDK won't even load in a Chrome extension service worker. See how Moderok and Mixpanel really compare for chrome extension analytics.
Read more
PostHog's best features need a web page, and your Chrome extension doesn't have one. How Moderok and PostHog compare for chrome extension analytics.
Read more
How to tell a first install from an update in a Chrome extension using chrome.runtime.onInstalled reason, and track version adoption.
Read more
Porting a Chrome MV3 extension to Firefox? Its background runs as an event page, not a service worker. Here is what changes and what stays the same.
Read more
Why chrome.storage.local throws QUOTA_BYTES quota exceeded, the real byte limits for local, sync, and session, and how to stay under them.
Read more
A developer's guide to the Chrome Web Store data collection disclosure: the data categories, the Limited Use certifications, and analytics.
Read more
Google Analytics gtag.js breaks in MV3 extensions: service workers have no DOM and Chrome bans remote code. Here's why, and what to use instead.
Read more
chrome.storage.local vs chrome.storage.sync in a Chrome extension: exact quotas, the 8 KB per-item cap, write throttling, and which to use for what.
Read more
Why a Chrome extension service worker keeps stopping after 30 seconds, what actually resets the timer, and how to keep state across restarts.
Read more
What Chrome Web Store Weekly Users and Installs actually count, why Weekly Users is not installs minus uninstalls, and which number to trust.
Read more
How to track Chrome extension uninstalls using chrome.runtime.setUninstallURL, what it can and cannot catch, and the Firefox differences.
Read more
Why chrome.runtime.lastError doesn't throw or reject, how it silently swallows failures in MV3 service workers, and how to catch it.
Read more