Chrome Extension Submission Process — Publishing Guide

3 min read

Chrome Web Store Submission Process

Overview

Step-by-step guide from code to published extension. Covers everything from creating a developer account to passing review.

Prerequisites

Step 1: Create a Developer Account

Step 2: Prepare Your manifest.json

Ensure your manifest is production-ready:

{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.0",
  "description": "Brief, clear description under 132 characters",
  "icons": {
    "16": "icons/icon-16.png",
    "48": "icons/icon-48.png",
    "128": "icons/icon-128.png"
  },
  "permissions": ["storage"],
  "action": { "default_popup": "popup.html" }
}

Key rules:

Step 3: Package Your Extension

Step 4: Required Store Assets

| Asset | Size | Required | |——-|——|———-| | Store icon | 128x128 PNG | Yes | | Screenshot 1 | 1280x800 or 640x400 | Yes | | Screenshots 2-5 | Same sizes | Recommended | | Promo tile (small) | 440x280 | Required | | Marquee promo | 1400x560 | Optional |

Step 5: Store Listing Details

Step 6: Privacy Practices

Step 7: Submit for Review

Step 8: After Submission

Tips for Fast Approval

  1. Request minimal permissions
  2. Use @theluckystrike/webext-permissions for optional runtime permissions (reduces manifest footprint)
  3. Clear, honest description
  4. Complete privacy disclosures
  5. Include a privacy policy even if not strictly required
  6. Test on Chrome stable (not just Canary/Beta)

Using @theluckystrike/webext-* for Better Reviews

Minimal manifest permissions with runtime requests

// Instead of requiring "tabs" in manifest, request at runtime:
import { requestPermission } from "@theluckystrike/webext-permissions";

document.getElementById("enable-tabs")?.addEventListener("click", async () => {
  const result = await requestPermission("tabs");
  if (result.granted) enableTabFeatures();
});

User-friendly permission descriptions

import { describePermission } from "@theluckystrike/webext-permissions";

// Show users what they're granting:
const desc = describePermission("tabs");
// "Read information about open tabs"

Version Updates

Common Rejection Reasons

Part of the Chrome Extension Guide by theluckystrike. Built at zovo.one.