How to Publish a Chrome Extension to the Chrome Web Store (2026 Guide)
How to publish a Chrome extension: Chrome Web Store developer account, MV3 zip package, listing assets, review times, updates, and API automation.

You built a Manifest V3 extension. The next job is to publish a Chrome extension so real users can install it from the Chrome Web Store. That path is separate from your product backend: Google runs registration, review, listing assets, and distribution even when your SaaS billing lives on Stripe or Lemon Squeezy.
Google Search Console already sends turbostarter.dev hundreds of impressions for queries like "chrome web store developer dashboard" and "chrome extension developer dashboard," mostly to our Chrome publishing docs. This post is the broader, tool-agnostic walkthrough those docs complement. If you are shipping web, mobile, and extension from one monorepo, pair it with cross-platform SaaS architecture and versioning across surfaces.
Short answer
To publish a Chrome extension, register a Chrome Web Store developer account (one-time registration fee), open the Developer Dashboard, upload a zip with manifest.json at the root, complete Store listing, Privacy practices, and Distribution, then click Submit for review. Review usually finishes in a few days but can take up to a few weeks. After the first manual upload, you can automate updates with the Chrome Web Store API or tools like wxt submit.
Who this guide is for
You have a working extension build (popup, content scripts, or both) and you want it live on the public store, unlisted for beta testers, or private to trusted Google accounts. You do not need a separate backend guide here, though production extensions almost always talk to an API. TurboStarter's extension kit docs cover auth and deployment; this article focuses on Google's publishing pipeline.
| You need… | Start here |
|---|---|
| Kit-specific zip + GitHub Actions wiring | Publish to Chrome Web Store |
| Firefox or Edge after Chrome | Firefox Add-ons, Microsoft Edge |
| Which TurboStarter kit includes an extension | Which kit to choose |
Chrome Web Store developer account and dashboard
Register and pay the one-time fee
Before any upload, you must register as a Chrome Web Store developer and pay a one-time registration fee. Google's developer agreement describes the fee as an amount determined in Google's sole discretion (Developer Agreement); Google's extension release notes and dashboard onboarding describe a $5 registration fee for a new publisher account (What's New).
Pick a developer email you check often. Google sends rejections, takedowns, and policy warnings there. You cannot change the account email later without transferring items to a new account (register guide).
Registration opens at the Chrome Web Store Developer Dashboard. The first visit walks you through the developer agreement and payment. After that, the dashboard is your home for every extension you own.
Complete publisher profile settings
After payment, finish account details Google shows in the dashboard:
- Publisher name (shown under extension titles; verified publishers can display an official URL on listings).
- Verified contact email (required for new accounts; used for notifications).
- Physical address when you sell in-app purchases, subscriptions, or other paid functionality through the store (register guide).
Group publishers and team access
You do not need a separate Google Group anymore. Publisher members can be invited with roles (Viewer, Item Manager, Editor, Admin). Invited members can join without paying another registration fee (role expansion blog). Creating an additional publisher still requires a fully registered developer account.
Use the publisher switcher in the top-right of the Developer Dashboard if you belong to multiple publishers.
Prepare your extension package
Manifest V3 and manifest hygiene
New extensions on the Chrome Web Store use Manifest V3. Your uploaded zip must include manifest.json at the root, not inside a subfolder (prepare guide).
Before the first upload, double-check manifest fields you cannot edit later in the dashboard UI without shipping a new version:
| Field | Why it matters |
|---|---|
name | Store and browser title |
version | Must increase on every upload |
icons | Store and install UI |
description | Up to 132 characters in the manifest |
Start with a low version such as 0.0.0.1 so you have room to iterate (prepare guide). JSON comments break uploads with "Cannot parse the manifest" errors.
Zip the build output
Zip only the packaged extension files (manifest, scripts, assets). Maximum package size is 2 GB; larger zips are rejected (publish guide).
If you use a bundler like WXT, run your production build first, then zip the output folder the tool documents. TurboStarter maps package.json version into the manifest on build (extension versioning recipe).
Permissions, single purpose, and remote code
Chrome reviewers read your Privacy practices tab alongside the manifest.
- Request the minimum permissions your feature needs (privacy fields).
- State a clear single purpose that matches what the extension actually does (Extension Quality Guidelines).
- Declare remote code honestly. Manifest V3 disallows remotely hosted executable code; extensions that execute remote code face longer review (privacy fields).
Broad host permissions (<all_urls>, *://*/*, https://*/*) are common rejection drivers because they enable wide data access (review process).
Privacy policy and data disclosures
You need a privacy policy URL on your developer account and consistent data use checkboxes in the Privacy tab (privacy fields). Disclosures must match what users see on the listing and what your extension collects.
Store listing graphic assets
The Store listing tab needs assets beyond manifest icons (listing guide):
| Asset | Size | Notes |
|---|---|---|
| Store icon | 128×128 px | Required |
| Screenshots | 1280×800 px | At least one, up to five |
| Small promo tile | 440×280 px | PNG or JPEG |
| Marquee promo tile | 1400×560 px | Optional |
| Promo video | YouTube URL | Optional |
Manifest icons and store icons serve different jobs. Ship crisp screenshots that show the popup or in-page UI, not just your logo.
Submit a Chrome extension step by step
Upload the zip
- Open the Developer Dashboard.
- Sign in with your developer account.
- Click Add new item.
- Choose your zip file and upload (publish guide).
If the manifest and zip validate, the new item appears in your dashboard list.
New publisher limit: first-time publishers are capped at two published extensions until they request an increase (publish guide). Themes are excluded from that cap.
Fill out dashboard tabs
Work through the left-hand sections (publish guide):
- Package: shows the uploaded bundle (read-only right after create).
- Store listing: description, category, language, graphics.
- Privacy practices: single purpose, permission justifications, remote code, data use.
- Distribution: visibility, regions, paid-item declaration.
- Test instructions: optional credentials for reviewers.
Visibility: public, unlisted, or private
On the Distribution tab (distribution guide):
| Setting | Who can install |
|---|---|
| Public | Anyone via Chrome Web Store search and listing |
| Unlisted | Anyone with the direct Chrome Web Store URL |
| Private | Trusted testers, Google Groups you own, or (when enabled) your Google Workspace domain |
Private trusted testers are email addresses tied to Google accounts, configured in account settings (distribution guide). All visibility modes go through the same review process.
Geographic distribution
Choose All regions or specific countries (distribution guide). You can also select all regions then exclude individual countries.
Deferred publishing and staged rollout
When you click Submit for review, a confirmation dialog lets you defer publishing so the item does not go live automatically after approval (publish guide). You can also pick Defer publish from the item menu later.
After review completes, you have up to 30 days to publish a deferred submission. After that, it reverts to draft and must be submitted again (publish guide).
Percentage rollout: if your item has more than 10,000 seven-day active users, the Chrome Web Store API supports setPublishedDeployPercentage to ramp visibility gradually.
Send to review
Click Submit for review when listing, privacy, and distribution tabs are complete. Track status in the dashboard (Published, Pending, Rejected, Taken Down) (Chrome publishing docs).
Chrome extension review time and rejections
How long review takes
Google's review process documentation states:
- For most extensions, review completes within a few days.
- It can take up to a few weeks.
- If an item stays pending more than three weeks, contact developer support.
Review load, permission breadth, code size, and prior rejections can lengthen queues. New developers, new extensions, dangerous permissions, and large code changes are called out as signals for closer inspection (review process).
Common rejection themes and fixes
| Issue | What to do |
|---|---|
| Broad host permissions without justification | Narrow host_permissions, document the exact domains you need in Privacy practices |
| Unused or excessive API permissions | Remove permissions from manifest.json, rebuild, bump version, re-upload |
| Remote code or MV3 policy violations | Remove remote execution; ship all logic inside the package |
| Single purpose mismatch | Rewrite listing + single purpose field so they describe one focused job |
| Privacy policy or data use gaps | Align policy URL, in-dashboard disclosures, and actual behavior |
Rejections email the publisher address with policy references (review process). Fix issues, increment version, upload a new zip, and submit again. See troubleshooting violations.
Update an existing Chrome extension
Every new upload needs a higher version in manifest.json than the last accepted build (prepare guide). Upload the zip on the same dashboard item, update listing or privacy fields if permissions changed, add release notes, and submit for review again.
TurboStarter's extension updates doc recommends bumping package.json version and following the same checklist you used for the first ship.
Breaking permission changes often require manual metadata updates even when CI uploads the bundle (Chrome publishing docs).
Automate publishing with the Chrome Web Store API
Manual first upload is still required so Google assigns an extension ID and you can complete listing metadata (Chrome publishing docs). After that, automate with the Chrome Web Store API:
- Enable the Chrome Web Store API in Google Cloud.
- Configure OAuth consent and create OAuth client credentials.
- Obtain refresh and access tokens with scope
https://www.googleapis.com/auth/chromewebstore. - Call REST endpoints with your publisher ID from Publisher settings in the dashboard.
Prerequisites from Google (using API):
- 2-Step Verification on the Google account that owns the items.
- Store listing and Privacy tabs completed before API publish.
Typical flow: upload a new package, then publish to submit for review. Use fetchStatus while uploads process, and cancelSubmission if you need to stop an in-flight review (using API).
CI example (GitHub Actions + WXT)
TurboStarter documents a .github/workflows/publish-extension.yml workflow that runs npx wxt submit with Chrome secrets (CHROME_EXTENSION_ID, CHROME_CLIENT_ID, CHROME_CLIENT_SECRET, CHROME_REFRESH_TOKEN) (Chrome publishing docs). Token setup guides such as Plasmo BMS Chrome tokens walk through OAuth refresh tokens.
Use --chrome-skip-submit-review when you only want upload without sending to review (Chrome publishing docs).
Also ship to Firefox and Microsoft Edge
Chromium stores share packaging concepts, but each marketplace has its own account and review:
| Store | Account cost | TurboStarter doc |
|---|---|---|
| Firefox Add-ons | No registration fee (Firefox doc) | Publish to Firefox |
| Microsoft Edge Add-ons | Separate from Chrome listing | Publish to Edge |
Cross-browser builds are why TurboStarter uses WXT in the Core monorepo (WXT + Vite extension stack).
How TurboStarter fits in
TurboStarter Core is a production-ready SaaS starter kit across Next.js web, Expo mobile, and a WXT browser extension on one Better Auth backend. Publishing is not a separate product: you get build scripts that output store-ready zips, shared API types, and docs that mirror the steps in this article.
What the kit actually documents today:
- Manual and automated Chrome publishing, including the first-upload requirement and GitHub Actions secrets (Chrome Web Store).
- Pre-submission checklist covering database, API URL, assets, and store accounts (publishing checklist).
- Version bumps via
package.jsonbefore each store upload (updates). - Firefox and Edge parallel guides when you expand beyond Chrome.
Use this blog post for policy context and official links. Use /docs/extension/publishing/chrome when you are inside the repo running builds and workflows. If you are still evaluating kits, see Core pricing and the extension stack page.
FAQ
Google requires a one-time registration fee when you create a publisher account. The developer agreement states the amount is set in Google's sole discretion. Google's 2025–2026 developer dashboard messaging describes a $5 fee for new publishers (register, What's New). Team members invited to an existing publisher do not pay again (group publishers).
Google says most extensions finish within a few days, but review can take up to a few weeks depending on permissions, code complexity, and queue volume (review process). Contact developer support if review exceeds three weeks.
Many SaaS extensions are free to install and bill users on the web app. If you sell purchases or subscriptions through the Chrome Web Store itself, you declare that on the Distribution tab and may need a physical address on your developer account (distribution, register). Most indie SaaS products charge outside the store and use the extension as a client.
Unlisted items are not discoverable in store search but anyone with the listing URL can install them. Private items are limited to trusted tester accounts, Google Groups, or domain publishing you configure (distribution).
Common causes include excessive permissions, missing or inaccurate privacy disclosures, remote code violations, or a single-purpose description that does not match behavior (review process, troubleshooting). Read the email policy citation, fix the issue, bump the version, upload a new zip, and submit again.
Not for the first release. You need the dashboard for initial upload, extension ID, and complete listing metadata. After that, the Chrome Web Store API or wxt submit can upload and publish updates (Chrome publishing docs).
Takeaway
Publish a Chrome extension by treating the Chrome Web Store as its own release channel: register once, ship a clean MV3 zip, be precise about permissions and privacy, choose visibility and regions deliberately, and plan for review that may take days or weeks. Automate only after the first manual submission passes review. If you want the extension client already wired to your SaaS backend, TurboStarter Core ships the WXT app, store docs, and CI patterns so you can focus on the product inside the popup, not on rediscovering Google's dashboard labels every release.
Polar vs Stripe: fees, tax, and Stripe Managed Payments
Polar vs Stripe as of October 2026: real fee math at $20 and $100, Stripe Managed Payments vs Polar as MoR, migration notes, and when to pick each.
Renovate vs Dependabot - best tool to automate your dependency updates (2026)
Which should you pick for a monorepo in 2026? Compare Renovate and Dependabot on features, monorepo support, and automation.


