Reading the rejection email
Every rejection email includes:- The policy that was violated (for example, “Permissions” or “Misleading Metadata”)
- A link to the relevant policy documentation
- Sometimes, a specific description of what triggered the review
Common rejection reasons
Missing privacy policy
Missing privacy policy
Cause: Your extension requests a sensitive permission — such as
cookies, storage, or access to user data — but you didn’t link a privacy policy in the Developer Console.Fix: Create a privacy policy that explains what data your extension accesses and how it’s used. Host it on a public URL (your own website or a free policy generator). Then open the Chrome Web Store Developer Console, go to your extension’s listing, open the Privacy tab, and paste the URL.Excessive permissions
Excessive permissions
Cause: Your
manifest.json requests permissions that your extension’s code never actually uses, or it requests broad permissions (like <all_urls>) when a narrower scope would work.Fix: Remove every permission that isn’t actively used. Use activeTab instead of tabs where possible. Use specific host patterns (for example, https://*.example.com/*) instead of <all_urls>.Deceptive or misleading description
Deceptive or misleading description
Cause: Your extension’s name or store description doesn’t accurately reflect what it does, uses trademarked brand names in a misleading way, or omits significant behavior (such as changing the user’s search engine or homepage).Fix: Rewrite the store description to lead with the primary feature in plain language. If your extension modifies browser defaults, state that explicitly in the first sentence. Use a descriptive name that reflects functionality (for example, “Price Highlighter for Amazon”) rather than a vague or brand-adjacent name.
Low-quality or missing screenshots
Low-quality or missing screenshots
Cause: Your store listing is missing screenshots, or the screenshots don’t clearly show the extension’s functionality in use.Fix: Add at least two screenshots (1280×800 or 640×400 pixels) that show your extension actively running on a real webpage. Avoid screenshots of just the icon or a blank popup. Captions that explain what the screenshot shows are helpful but not required.
Insufficient permission justification
Insufficient permission justification
Cause: In the Developer Console, you provided a vague reason for a sensitive permission (for example, “needed for functionality”).Fix: Be specific for every permission that requires justification. Explain exactly what the permission is used for and why it’s necessary.
“The storage permission is used to save the user’s selected highlight color so it persists across browser sessions.”
Remote code execution
Remote code execution
Cause: Your extension uses
eval(), Function(), or fetches JavaScript from a remote server at runtime.Fix: Manifest V3 prohibits all forms of remote code execution. All logic must be bundled inside the ZIP you upload to the store. Remove any eval() calls and any fetch calls that retrieve and execute scripts.Repetitive or low-differentiation content
Repetitive or low-differentiation content
Cause: Your extension is too similar to an existing item in the store, or it doesn’t offer meaningful new functionality compared to existing tools.Fix: Add a distinguishing feature or a clearly different user experience. Describe what makes your extension unique in the store listing. Avoid submitting minor reskins of popular extensions without adding real value.
Deceptive installation or unexpected behavior
Deceptive installation or unexpected behavior
Cause: The extension does something the user didn’t explicitly agree to — such as modifying the new tab page, changing the default search engine, or injecting content into pages not covered in the description.Fix: Every behavior that affects the user’s browser experience must be described in the store listing. If your extension changes browser defaults, those changes must require explicit user opt-in and be clearly documented.
Inactive or placeholder extension
Inactive or placeholder extension
Cause: You submitted an extension with no functional features, a “coming soon” message, or stub code.Fix: Complete the extension’s core functionality before submitting. Google will not approve an extension that doesn’t do what its listing describes.