Chrome Web Store

Why Chrome Web Store rejects extensions — and how to fix each reason

Your extension works perfectly and still gets rejected. Most rejections come down to a handful of policy patterns. Here is each common reason, why reviewers flag it, and what to change — so your next submission is not another round trip.

Common rejection reasons
  1. Remotely hosted code
  2. Over-broad host permissions
  3. Unused / unjustified permissions
  4. Privacy & data-use mismatch
  5. Single purpose violation
  6. Metadata & spam
  7. Pre-submit checklist
Remote code

1. Remotely hosted code

Under Manifest V3, the executable code that ships must be the code that was reviewed. Anything that fetches a remote payload and then executes it at runtime is treated as remotely hosted code. (Sandboxed pages and iframes that run remote content are handled separately by policy — the violation is your extension executing code it downloaded.)

What triggers it

Fetching data (JSON) from a server is fine. The problem is turning what you fetched into executable code.

Fix: Bundle every executable file inside the extension and load it locally. Remove eval/dynamic execution. In your CSP, keep external origins out of script-src. Server calls are network requests, not scripts — and note that a cross-origin fetch from your extension generally still needs a matching host_permissions entry, so add the API domain there and keep its responses as data.
Permissions

2. Over-broad host permissions

The most common rejection for functional extensions. If you request access to more sites than your feature needs, reviewers reject it as over-broad.

What triggers it

Fix: List only the domains your features actually need (for example https://*.example.com/*) — note that Chrome ignores the path part of a host permission, so narrowing happens at the domain level. If you only act after a user clicks your icon, switch to activeTab. Each permission should map to a visible feature you can point at. If broad access is truly required, say why in the justification field rather than hoping it passes unexplained.
Permissions

3. Unused or unjustified permissions

Reviewers reject extensions that declare permissions the code never actually uses, or sensitive permissions with no clear justification.

What triggers it

Fix: For each declared permission, confirm it is actually used in the code, and remove any that are not. Replace tabs with activeTab where possible. If a sensitive permission is essential, make its purpose obvious in the code and the listing.
Privacy

4. Privacy & data-use mismatch

An extension can be rejected — or removed after publishing — when the privacy declaration in the dashboard does not match what the code actually does with user data, or when a privacy policy is missing. The disclosure covers collection, use, storage and transfer — data that never leaves the browser still has to be declared.

What triggers it

Fix: Register a valid privacy policy URL. In the Privacy practices tab, declare every data category the code collects, uses, stores or transmits, plus its purpose. The declaration has to match the code exactly — including a single license-key call.
Single purpose

5. Single purpose violation

Every extension must have one narrow, easy-to-understand purpose. A pile of unrelated permissions or features reads as multi-purpose and gets rejected.

Fix: Describe the single job the extension does in plain sentences. Move unrelated features into a separate extension. There is no permission count that trips this — reviewers look at whether the features and permissions all serve one purpose.
Metadata

6. Metadata & spam

Listing-level issues also cause rejections, even when the code is clean.

What triggers it

Fix: Describe one job in natural sentences, no keyword lists. Provide the 128×128 store icon and at least one real screenshot (the 48 and 16 px manifest icons are for Chrome’s UI, not listing requirements). Make the title and description match what the extension actually does.
Before you submit

Pre-submit checklist

Rejection is not the end — it is a signal about what to change. Fix the item and resubmit; the resubmission gets a fresh review, and review times range from a few days to a few weeks.

Check your manifest in 5 seconds

Paste your manifest.json and see which of these reasons it is likely to trip — before you submit. Free, runs in your browser.

Run the free pre-check