Chrome Web Store · privacy

Chrome extension privacy policy and Data Use: what reviewers actually check

Privacy is where working extensions get rejected after the code is already fine — and where published extensions get removed later. The rule is simple to state and easy to fail: the dashboard declaration, the privacy policy, and what the code does all have to say the same thing.

On this page
  1. When you need a policy at all
  2. The declaration has to match the code
  3. Categories people forget to declare
  4. What the policy document must contain
  5. Why this also causes post-publish removals
  6. Pre-submit checklist
Scope

1. When you need a privacy policy at all

If the extension handles user data in any way, you need a privacy policy URL registered in the Privacy practices tab. Handling is broader than most developers assume: it covers collecting, using, storing and transferring data, and it applies even when the data never leaves the browser.

An extension that reads page content to render something locally is still handling user data. So is one that keeps a record of what the user exported in chrome.storage. The safe reading is that if your code touches anything a person typed, visited, or owns, you disclose it.

Consistency

2. The declaration has to match the code

This mismatch is a recurring reason privacy reviews fail. The dashboard asks which categories of data the extension handles and why. Reviewers compare those answers with the package they were given.

What triggers it

Fix: Walk the code and write down every place data is read, stored, or sent. Turn that list into the declaration — not the other way round. Then read your store listing copy and delete any absolute claim the code cannot support.
Categories

3. Categories people forget to declare

Every declared category should serve the extension’s single purpose or a related operational need you can explain — a category with no explainable purpose reads as over-collection, and a feature that handles data you never declared reads as an undisclosed transfer.

Document

4. What the policy document should cover

Policy requirements vary with what you handle, but a policy that holds up under review is short, specific, and consistent with the dashboard. In practice it is worth stating:

Fix: Host it at a stable public URL, keep the wording aligned with the dashboard, and update it in the same change as any edit to what the code sends. A policy that lags behind the code is the version reviewers will hold you to.
After publishing

5. Why this also causes post-publish removals

Permission and remote-code problems show up in the package itself. A privacy mismatch can hide longer, because the code path may only run for paying users or ship in a later update. When it surfaces then, the outcome is an enforcement action against a listing that already has users and revenue.

The practical defense is to treat the declaration as part of the release checklist. Any change that adds a network call, a bundled library, or a new storage key should also update the declaration and the policy.

Before you submit

6. Pre-submit checklist

The companion guide covers the other rejection reasons — remote code, host permissions, unused permissions, single purpose and listing quality: Why Chrome Web Store rejects extensions.

Not sure what your declaration should say?

Paste your rejection email or your manifest.json and describe what the extension sends. We read it and tell you which policy we think the reviewer is citing and what we would change — free, no signup, and it is our reading rather than a ruling from Google.

Waiting on a review that has not moved? Why reviews stall and what to do.

Prefer to fix it yourself?

The Chrome Web Store Submission Kit is the working document we use on client submissions: permission justification lines you adapt per permission, a Data Use worksheet that maps code paths to declared categories, a privacy policy template, listing-copy rules, and a rejection decoder that turns the email wording into a concrete change. 6-page PDF, one-time $19.

Get the kit — $19