Skip to main content
Shipping an extension to the Chrome Web Store, Firefox Add-ons, and Edge Add-ons is one journey with the same shape on every store: register a developer account, create the listing once, get API credentials, and automate every submission after that. This page walks the whole journey. The per-store guides cover each credential portal in detail:

The journey

1

Register the store accounts

Each store requires a developer account before anything else works. See account prerequisites below for the fee, agreement, and enrollment each store demands.
2

Create each listing once by hand

The Chrome and Edge APIs cannot create a new listing. Upload the first zip manually in the store dashboard. That first upload is what creates the extension ID (Chrome) and the Product ID (Edge) that automation needs. Firefox can create a new unlisted add-on through the API; a listed add-on still needs a first manual submission.
3

Get API credentials per store

Follow the per-store guides linked above. Each guide names the exact portal page, shows what every value looks like, and lists the expiry rules.
4

Enter the credentials

Set the environment variables in your own CI, or keep them in a .env.submit file you write yourself. Keep it out of git.
5

Author STORE.md

Write the STORE.md metadata file before the first submission. Submission tooling reads it and attaches reviewer notes, release notes, and certification notes automatically. Without it, submissions go out noteless.
6

Submit

Submit from your own CI against each store’s API. Dry-run first when your tooling supports it: a dry run verifies credentials and zips without uploading anything.
7

Track the review

A successful submission means the store accepted the upload and queued it for review. Review is a third-party decision: poll each store’s dashboard or API for status, and never claim a listing is live before the store confirms it.
8

Handle a rejection

Read the failure reason the store returned, fix the cause, and record both in the version history section of STORE.md so the next submission does not repeat the mistake. Vague permission justifications are the most common rejection on every store.

Account prerequisites

Where credentials live

You hold the credentials yourself. A .env.submit file is the usual per-project credential file: one per repository, kept out of git, backed by your own secret storage. In CI, store each value as a secret. Keep credentials per project even when two projects share a store account. All three stores’ API credentials are account-wide, so a separate publisher account per product line is the only real isolation boundary on the store side. Rotating a credential then touches exactly one project.

What a submission needs, per store

Next steps