Chrome Web Store Publishing
When to Use
- Submitting a new extension to Chrome Web Store
- Preparing store listing (description, screenshots, icons)
- Responding to CWS review rejection
- Releasing updates
Core Jobs
1. Pre-Submission Checklist
- Developer account: $5 one-time registration fee
- Extension packaged as .zip (not .crx)
- All permissions justified in store listing
- Privacy policy URL (required if handling user data)
- Icons: 128×128px PNG (store listing) + 16, 48, 128 in manifest
2. Packaging
# Build production extension
npm run build
# Create zip (from dist/ folder, not project root)
cd dist && zip -r ../extension.zip . && cd ..
# Do NOT include node_modules, .git, source maps in zip
3. Store Listing Best Practices
- Name: 45 chars max, no "Chrome" in name
- Short description: 132 chars — first thing users see in search
- Detailed description: explain value, list features, explain permissions
- Screenshots: 1280×800 or 640×400px, show actual usage (not mockups)
- Promotional tile: 440×280px (optional but recommended)
- Category: choose most relevant (Productivity, Developer Tools, etc.)
4. Permission Justification
CWS requires written justification for "sensitive permissions":
<all_urls> or broad host access → explain why access to all sites is needed
history → explain use case
webNavigation → explain use case
- Submit via "Single Purpose" description field
5. Review Process
- Initial review: 1-3 business days (new extensions)
- Update review: 1-3 business days
- Rejection reasons: policy violations, deceptive permissions, insufficient justification, broken functionality
- Appeals: via Chrome Web Store Developer Support
6. Update Management
// Increment version in manifest.json
"version": "1.1.0"
- Semantic versioning: MAJOR.MINOR.PATCH
- Users auto-update within 24 hours of approval
- Breaking changes → consider phased rollout via Google Groups
Key Concepts
- Developer account — Google account + $5 one-time fee
- Single purpose — CWS requires extensions to have one clear purpose
- Sensitive permissions — permissions requiring written justification
- Phased rollout — release to % of users to catch issues before full release
Checklist
Output Format
- 🔴 Critical — missing privacy policy (if handling data), invalid zip structure, broken extension
- 🟡 Warning — screenshots are mockups/blurry, vague permission justification
- 🟢 Suggestion — promotional tile for better store presence, video walkthrough
Common Pitfalls
- Zipping project root (includes node_modules) instead of build output → huge file, rejected
- Name contains "Chrome" — CWS rejects names with browser brand names
- No privacy policy → auto-rejection if extension requests any user data permissions
- Updating without incrementing version number — update not recognized
1---2name: chrome-store-publishing3description: Publish and maintain Chrome extensions on the Chrome Web Store — packaging, store listing, screenshots, review process, and update management.4---56# Chrome Web Store Publishing78## When to Use9- Submitting a new extension to Chrome Web Store10- Preparing store listing (description, screenshots, icons)11- Responding to CWS review rejection12- Releasing updates1314## Core Jobs1516### 1. Pre-Submission Checklist17- Developer account: $5 one-time registration fee18- Extension packaged as .zip (not .crx)19- All permissions justified in store listing20- Privacy policy URL (required if handling user data)21- Icons: 128×128px PNG (store listing) + 16, 48, 128 in manifest2223### 2. Packaging24```bash25# Build production extension26npm run build2728# Create zip (from dist/ folder, not project root)29cd dist && zip -r ../extension.zip . && cd ..30# Do NOT include node_modules, .git, source maps in zip31```3233### 3. Store Listing Best Practices34- **Name**: 45 chars max, no "Chrome" in name35- **Short description**: 132 chars — first thing users see in search36- **Detailed description**: explain value, list features, explain permissions37- **Screenshots**: 1280×800 or 640×400px, show actual usage (not mockups)38- **Promotional tile**: 440×280px (optional but recommended)39- **Category**: choose most relevant (Productivity, Developer Tools, etc.)4041### 4. Permission Justification42CWS requires written justification for "sensitive permissions":43- `<all_urls>` or broad host access → explain why access to all sites is needed44- `history` → explain use case45- `webNavigation` → explain use case46- Submit via "Single Purpose" description field4748### 5. Review Process49- Initial review: 1-3 business days (new extensions)50- Update review: 1-3 business days51- Rejection reasons: policy violations, deceptive permissions, insufficient justification, broken functionality52- Appeals: via Chrome Web Store Developer Support5354### 6. Update Management55```json56// Increment version in manifest.json57"version": "1.1.0"58```59- Semantic versioning: MAJOR.MINOR.PATCH60- Users auto-update within 24 hours of approval61- Breaking changes → consider phased rollout via Google Groups6263## Key Concepts64- **Developer account** — Google account + $5 one-time fee65- **Single purpose** — CWS requires extensions to have one clear purpose66- **Sensitive permissions** — permissions requiring written justification67- **Phased rollout** — release to % of users to catch issues before full release6869## Checklist70- [ ] Developer account registered ($5)?71- [ ] Extension zipped from build output (not source)?72- [ ] All sensitive permissions justified in listing?73- [ ] Privacy policy URL provided (if handling user data)?74- [ ] Screenshots show real usage (1280×800)?75- [ ] Short description is compelling (132 chars)?76- [ ] Version incremented in manifest?7778## Output Format79- 🔴 **Critical** — missing privacy policy (if handling data), invalid zip structure, broken extension80- 🟡 **Warning** — screenshots are mockups/blurry, vague permission justification81- 🟢 **Suggestion** — promotional tile for better store presence, video walkthrough8283## Common Pitfalls84- Zipping project root (includes node_modules) instead of build output → huge file, rejected85- Name contains "Chrome" — CWS rejects names with browser brand names86- No privacy policy → auto-rejection if extension requests any user data permissions87- Updating without incrementing version number — update not recognized