Chrome Web Store Development Publishing Best Practices

The Ultimate Chrome Extension Pre-Submission Checklist (2026)

ET

ExtensionBooster Team

12 min read
Developer checklist on laptop screen for Chrome extension submission

Most Chrome extension rejections are preventable. Google’s review team rejects extensions for the same recurring reasons: obfuscated code, missing privacy policies, overly broad permissions, or store listings that don’t match actual functionality.

A thorough pre-submission review catches the majority of these issues before they cost you review cycles. This checklist walks you through every phase—code, permissions, privacy, store listing, testing, and dashboard—before you hit that submit button.

Work through each phase sequentially. Check off every item. Most extensions are reviewed within 24 hours, with 90% cleared within 3 days—don’t waste that window on avoidable issues.


Phase 1: Code & Security

Your extension’s code is the first thing automated review systems and human reviewers examine. Violations here trigger immediate rejection with no appeal shortcut.

  • Using Manifest V3 — MV2 extensions are no longer accepted for new submissions. Migrate service workers, update background page references, and replace XMLHttpRequest in service workers with fetch.
  • All files in manifest.json exist — File paths are case-sensitive on Linux (Chrome’s review environment). Icon.png and icon.png are different files. Verify every path referenced in manifest.json resolves correctly.
  • No code obfuscation — Minification is permitted; obfuscation is not. If reviewers cannot read and understand what your code does, it gets rejected. Use readable variable names and include source maps if you minify.
  • No eval() with remote data — Using eval() on data fetched from external sources violates Content Security Policy. Refactor to use JSON.parse() or safe DOM manipulation methods.
  • No external script tags — MV3 prohibits loading remote code at runtime. All JavaScript must be bundled in your extension package. Remove any <script src="https://..."> references from HTML files.
  • HTTPS for all data transmission — Every API call, WebSocket connection, and resource fetch must use HTTPS. HTTP endpoints will trigger policy violations.
  • No sensitive data in URLs or headers — API keys, tokens, and user credentials must not appear in URL query parameters or logged to the console. Use request headers with proper authorization patterns.
  • No deprecated APIs — Replace unload event listeners with pagehide. Audit your code against Chrome’s deprecated API list. chrome.tabs.executeScript is replaced by chrome.scripting.executeScript.
  • WebSocket/WebRTC in service workers, not content scripts — Persistent connections belong in background service workers. Content scripts should communicate via message passing.
  • Clean, readable code — Meaningful variable names, consistent formatting, and logical function decomposition. Reviewers look for code clarity as a proxy for trustworthiness.

Phase 2: Permissions Audit

Permissions are the single most common reason for policy violations. Every permission you request must be demonstrably necessary for your extension’s stated purpose.

  • Only the narrowest required permissions — If your extension reads tab URLs, request tabs not <all_urls>. If you only need active tab data, use activeTab instead of broad host permissions.
  • No unused permissions — Audit your manifest.json against your actual code. Remove any permission that isn’t called by your code. Automated tools exist specifically to flag this mismatch.
  • Each permission documented and justified — Prepare a plain-language explanation for every permission: what it enables and why your extension cannot function without it. This goes in your test instructions.
  • No excessive host permissions unless required*://*/* requires strong justification. If your extension works on specific domains, list those domains explicitly.
  • Optional permissions for non-core features — Features used by a subset of users should request permissions via chrome.permissions.request() at runtime rather than requiring them at install.

Quick Permission Reference

PermissionWhen to UseCommon Mistake
activeTabReading/modifying current tab onlyRequesting tabs instead
storageSaving user preferencesUsing localStorage in service workers
scriptingInjecting scripts dynamicallyHardcoding all injections in manifest
contextMenusRight-click menu itemsRequesting when feature is optional
notificationsUser alertsRequesting for a rarely-used alert

Phase 3: Privacy Compliance

Privacy policy violations account for a large share of rejections, particularly for extensions handling any user data. “User data” is broadly defined—it includes browsing history, tab URLs, form inputs, and anything a user types or clicks while your extension is active.

  • Privacy policy written and comprehensive — Your policy must cover: what data is collected, how it’s used, how it’s stored, how long it’s retained, who it’s shared with, and how users can request deletion.
  • Privacy policy link valid and accessible — The URL must resolve to a live, public page. A 404 or redirect loop will fail review. Test the link in an incognito window.
  • Policy matches actual data handling — If your code sends tab URLs to your server but your policy says “we don’t collect browsing data,” that’s a policy violation. Audit your network calls and align your policy with what your code actually does.
  • Single purpose declaration aligns with functionality — Your extension must serve one primary purpose. An extension that blocks ads and also tracks competitor prices and also sends email newsletters is three extensions. Focus the purpose statement on what the extension primarily does.
  • All data collection disclosed — In the Chrome Web Store dashboard under Privacy Practices, every category of data you collect must be checked. Undisclosed data collection is grounds for removal, not just rejection.
  • Third-party sharing disclosed — If you use analytics (Google Analytics, Mixpanel), crash reporting (Sentry), or any third-party SDK, those must be disclosed. The SDK’s data collection counts as your data collection.

Phase 4: Store Listing

A technically perfect extension can still be rejected or underperform if the store listing is misleading, incomplete, or inconsistent with the extension’s actual behavior.

  • Clear, meaningful extension name — Names cannot include “Chrome” as a standalone word (it implies Google endorsement). The name should describe the extension’s function, not just a brand name.
  • Compelling short description — 132 characters max. Lead with the core value proposition. Avoid “best,” “free,” and superlatives without evidence. Focus on what the user gains.
  • Detailed full description — List all features, use cases, and permissions. If your extension requests the tabs permission, explain in the description why it’s needed. Reviewers compare description claims against functionality.
  • High-quality icon — 128x128 PNG minimum, but submit 512x512 for future-proofing. Transparent background, no text that becomes unreadable at small sizes, and visually distinct at 16x16.
  • 3-5 crisp, annotated screenshots — Screenshots must show actual extension UI, not marketing graphics. Dimensions: 1280x800 or 640x400. Annotate with callouts to highlight key features.
  • Optional: marquee image — 1400x560 PNG/JPEG for featured placement. Clean design, no text-heavy layouts, readable at reduced sizes.
  • Optional: demo video — YouTube URL showing the extension in action. 60-90 seconds is the effective range. Actual usage footage outperforms animated mockups.
  • Appropriate category selected — Miscategorized extensions get less organic discovery. Choose the category that matches your primary use case, not the most popular category.
  • Description matches actual functionality exactly — Any feature mentioned in the description must exist and work. Any feature that exists but isn’t mentioned will look suspicious to reviewers if they find it.

Phase 5: Testing

Submit an extension you’ve actually stress-tested. Reviewers test extensions too, and they will find bugs you didn’t.

  • Tested on multiple Chrome versions — Test on the current stable, beta, and one major version back. APIs behave differently across versions.
  • Tested on multiple operating systems — File paths, system fonts, and keyboard shortcuts behave differently on Windows, macOS, and Linux. Test on at least two.
  • Tested on slow/unreliable networks — Use Chrome DevTools’ network throttling. Your extension should degrade gracefully, not crash, when API calls time out.
  • Error handling for network failures — Every fetch() call needs a .catch() handler. Service workers should handle offline scenarios. Unhandled promise rejections appear in reviews.
  • No back/forward cache invalidation — Extensions that add unload listeners prevent pages from being cached in the back/forward cache. Use pagehide with event.persisted check instead.
  • All advertised features work as described — Do a fresh-install walkthrough of every feature listed in your store description. Fix anything that doesn’t match.
  • Extension works as a fresh install — Disable the extension, clear extension storage, re-enable it, and test onboarding. Many bugs only appear on first run.

Phase 6: Dashboard Completion

Every tab in the Chrome Web Store developer dashboard must be complete before submission. Incomplete tabs block the submit button or cause delayed reviews.

  • Package tab: ZIP uploaded — Your ZIP must contain manifest.json at the root level, not inside a subfolder. Maximum file size is 500MB (keep it under 10MB for faster review).
  • Store listing: all fields completed — Title, short description, full description, category, language, icon, and at least one screenshot. Missing fields prevent submission.
  • Privacy: data practices disclosed — The Privacy Practices tab requires you to classify every type of data your extension handles. Be thorough—undisclosed practices are grounds for removal after publishing.
  • Distribution: country and visibility set — Choose public or unlisted. Select your target regions. Extensions set to private never go through public review.
  • Test instructions provided — If your extension requires login, API keys, or specific setup steps to review, include detailed instructions in the “Notes for reviewers” field. Reviewers who can’t test your extension may reject it.

Phase 7: Final Checks

Before clicking submit, run through this final gate.

  • No deceptive practices or hidden features — No hidden functionality, no dark patterns, no features that activate after review approval. Everything must be visible and working at review time.
  • Single, focused purpose — If you’ve added features since you wrote your purpose statement, revisit it. Purpose creep is a policy violation.
  • Proper error handling throughout — Review your error boundaries. Unhandled exceptions in service workers will cause the extension to stop working silently.
  • Performance optimized — Service workers must complete initialization quickly. Extensions that cause measurable browser slowdown attract negative reviews that compound over time.
  • Ready for review — You wouldn’t submit code to production without review. Treat the Chrome Web Store submission the same way.

Publishing Limits and Operational Tips

Account limits:

  • Maximum 20 published extensions per developer account
  • New developer accounts have a $5 one-time registration fee
  • Suspended accounts lose access to all published extensions

Deferred publishing:

  • You can schedule publication up to 30 days after approval
  • Use this window to coordinate launch with marketing, email campaigns, and social announcements
  • Approval does not mean immediate publication unless you’ve selected auto-publish

Notifications:

  • Enable email notifications for both staging and publishing events in your developer dashboard settings
  • Review feedback arrives via email—missing these delays your response time

Review timeline expectations:

  • Most submissions: under 24 hours (90% within 3 days)
  • First submissions or complex permissions: may take longer
  • For a full breakdown of the review process, see our Review Process guide

Quick Reference: What Gets You Auto-Rejected

These violations trigger rejection without human review escalation. Avoid all of them.

ViolationWhy It’s RejectedFix
Code obfuscationReviewers cannot assess safetyUse minification, not obfuscation
Manifest V2MV2 is deprecated, no longer acceptedMigrate to MV3
Remote code executioneval() on fetched dataParse JSON safely, no eval()
Missing privacy policyRequired for any data-handling extensionWrite and host a proper policy
Deceptive descriptionFunctionality doesn’t match listingUpdate description to match code
Malicious behaviorAny code that harms users or systemsDo not submit
Excessive permissionsPermissions not justified by functionalityRequest minimum required permissions
External scriptsLoading JS from remote at runtimeBundle all JS in the package
Undisclosed data collectionData practices not declared in dashboardComplete Privacy Practices tab
Policy-violating contentContent that violates Chrome Web Store policiesReview policies before submission

Conclusion

The developers who get through Chrome Web Store review fastest aren’t necessarily the best coders—they’re the most prepared. Running through this checklist before every submission eliminates the most common rejection causes and demonstrates to reviewers that you understand and respect Chrome’s policies.

One submission done right beats three submissions with back-and-forth rejections every time. Your users are waiting.


Prepare your store listing assets before you submit.

Use the Screenshot Makeup Tool to create crisp, professional screenshots that meet Chrome Web Store dimensions and help your extension stand out.

Ready to grow your extension after it’s live? Sign in to ExtensionBooster to start collecting genuine reviews and building credibility from day one.

Related guides:

Share this article

Related Articles