How to publish a Chrome extension

The whole path: developer account, packaging, store listing, privacy tab, review — and the mistakes that get first submissions rejected.

Publishing costs a one-time $5 registration fee and usually takes under an hour of dashboard work. The part people underestimate is review: Google checks your code, your permissions, and your privacy disclosures against policy, and a first submission with sloppy answers gets rejected with a cryptic notification ID. Here is the full sequence.

1. Package your extension

# from inside your extension directory:
zip -r ../my-extension.zip . -x "*.git*" -x "node_modules/*"

2. Register a developer account — the only cost

  • Go to the Chrome Web Store Developer Dashboard (chrome.google.com/webstore/devconsole) with the Google account you want to own the extension.
  • Pay the $5 one-time registration fee. There is no per-extension or per-update charge after that.
  • Enable 2-Step Verification on the account; the dashboard requires it before you can publish.
  • Pick the account carefully. Transferring an extension to a different owner later is possible but painful — use a durable account, not a work address you might lose.

3. Upload and fill the store listing

4. The privacy tab — the easiest place to slip up

5. Choose visibility, then submit

VisibilityWho can installTypical use
PublicAnyone; searchable in the storeNormal launch
UnlistedAnyone with the direct link; not searchableBeta, client-only tools
PrivateTrusted testers/Google Groups you specify, or your Workspace domain (admin-enabled)Internal company tools

All three go through review. Submit, and the item shows "pending review" in the dashboard.

6. Review: what to expect

Already rejected? Paste the rejection email into the free decoder, or use the free triage form to get our reading of what to change — not a ruling from Google, and nobody can guarantee approval.

See also: writing permission justifications · privacy policy requirements · appealing a rejection · Why Chrome Web Store rejects extensions