Shopify Dev Helper
Chrome extension for Shopify development workflows.
/ Chrome extension
A Chrome side panel extension for Shopify theme developers. Think Postman, but built specifically for the Shopify AJAX API ā living right next to your browser tab.
No console. No custom scripts. No copy-pasting URLs. Just open the panel, navigate to any Shopify store, and start making requests.
Install on Chrome Web StoreA developer tool for Shopify theme development. Select a section to learn how each feature works.
Shopify's AJAX API lets you interact with cart, product, recommendations, and search ā all without page reloads. Requests are injected into the active Shopify tab via chrome.scripting.executeScript to bypass CORS. When the session cache is active, requests are routed to the cached Shopify tab instead. The response toolbar shows a Copy button when a response is present; clicking it copies the full JSON to the clipboard and briefly shows a "Copied!" confirmation.
All cart operations target the current store's session. The cart is identified by a token stored in a cookie ā no authentication is needed.
items, token, total_price, attributes, note, discount_codes etc.{ items: [{ id, quantity, properties?, selling_plan? }] }. The id field is a variant ID (integer).{ updates: { "variantId": qty } }. Also accepts note and attributes. Set a quantity to 0 to remove that item.{ id|line, quantity, properties? }. Use id for variant ID or line for 1-based line index./cart/update.js with each key set to "". Shopify only clears keys that are explicitly sent./cart/update.js with { note: "" }./cart/change.js with each key set to "". Sending properties: {} is ignored by Shopify./cart/update.js with { discount: "CODE" }. Multiple codes are joined with a comma. Clear all codes by sending { discount: "" }.?variant= URL param ā input[name="id"] / select[name="id"] ā ShopifyAnalytics.meta.selectedVariantId ā first variant in ShopifyAnalytics.meta.product.variants.Fetch product data by handle. The response includes all variants, options, images, pricing, and metafields exposed via the AJAX API.
my-blue-shirt).location.pathname from the active tab and extracts the handle using the pattern /\/products\/([^/?#]+)/. Works on any product page URL.Fetches AI-powered product recommendations for a given product. Requires the product's numeric ID (not the handle or GID).
product_id (integer), limit (1ā10, default 10), intent (related or complementary)./products/{handle}.js to resolve the numeric product ID.Returns autocomplete suggestions as the user types ā ideal for live search dropdowns.
q (search query), resources[type] (comma-joined resource types), resources[limit] (1ā10), resources[fields] (comma-joined fields to search).product, article, page, collection, query. Select multiple to search across all of them.title, body, tag, product_type, vendor, author, variants.title, variants.sku, variants.barcode. Leave all unselected to search all fields.GraphQL queries sent directly from the extension service worker context. Shopify's Storefront API allows CORS from browser extensions ā no tab injection needed. Requires a public Storefront Access Token.
The Storefront API requires a public access token ā not an Admin API key or private app secret. Configure it in the Config tab. Without a token, the Storefront section is disabled and shows a "Token required" overlay.
X-Shopify-Storefront-Access-Token on every request.chrome.storage.local ā persists across browser restarts.YYYY-MM (e.g. 2026-04). Determines the endpoint: https://<store>/api/<version>/graphql.json. Also configured in the Config tab.Fetch product and collection data with fine-grained field selection and metafield support.
my-product).gid://shopify/Product/) as a visual label ā only type the numeric suffix.Add metafield identifiers to product, collection, article, blog, page, or shop queries to fetch custom field values inline. Toggle the metafields pill in the Fields row to reveal the identifier inputs.
metafields(identifiers: [{namespace: "ns", key: "key"}]) { value type }
unauthenticated_read_metafields storefront access scope on your app.null even when queried with valid identifiers.Query custom structured data you've defined in Shopify Admin ā Custom data ā Metaobjects.
author) and handle. Alternatively provide the GID numeric suffix directly.unauthenticated_read_metaobjects access scope.Query content resources from your store's online store channel.
Query navigation menus defined in your Online Store ā Navigation settings.
main-menu). Returns id, title, handle, items (with nested title, url, and sub-items), and itemsCount.unauthenticated_read_content access scope.Fetch store-level metadata from the Storefront API. Useful for reading payment methods, currencies, and primary domain without needing Admin API access.
id, name, description, primaryDomain, paymentSettings, shipsToCountries, currencyCode, moneyFormat, and more (18 fields total).Write any valid Storefront API GraphQL query directly. The token and version from Config are used automatically.
https://<shop>/api/<version>/graphql.json ā the same endpoint as all other Storefront tabs.Utilities for theme preview, page context inspection, quick navigation to Admin sections, and direct links to the theme customizer. All actions require an active Shopify store tab (or a valid session cache).
Three buttons that open the Shopify theme editor in a new tab. Each reads window.Shopify.theme.id from the active tab via script injection to resolve the current theme ID.
admin.shopify.com/store/<slug>/themes/<id>/editor.admin.shopify.com/store/<slug>/themes/<id> (the online code editor for Liquid, CSS, and JS files).?previewPath={current pathname} so the customizer opens directly on the page you are viewing.If Shopify.theme.id cannot be read (e.g. on a non-Shopify page), an error is shown below the buttons.
Open in Admin reads ShopifyAnalytics.meta.page.pageType and resourceId from the active tab, then resolves the matching Shopify Admin URL:
product ā /admin/products/<resourceId>
collection ā /admin/collections/<resourceId>
page ā /admin/pages/<resourceId>
article ā fetches <pathname>.js to get the blog_id, then opens /admin/blogs/<blog_id>/articles/<id>
blog ā /admin/blogs/<resourceId>
home / frontPage) ā opens the Customizer (no direct Admin page)Unsupported page types (search, cart, 404) will show an error. Navigate to a product, collection, article, blog, or page first.
Adds or removes the pb query parameter on the current tab's URL and reloads the page.
The preview bar appears when you're browsing a store using a theme preview link. Use this to toggle it without manually editing the URL.
Reads window.Shopify.theme.id from the active tab and appends ?preview_theme_id= to the current page URL, then copies the result to the clipboard.
Use this to share a preview link of an unpublished theme with clients or stakeholders ā they can browse the store using your theme without needing Admin access. The link works for anyone and does not expire until the theme is published or deleted.
Injects a script into the active tab's MAIN world and reads Shopify global objects. Useful for debugging theme templates and understanding what data Shopify exposes on each page type.
pageType, resourceId, and other analytics metadata set by Shopify on each page load.id, name, and role (published, unpublished, development).en-CA).Results are displayed in a collapsible key-value table. Arrays show an item count and can be expanded to reveal nested values.
Theme visit history is recorded automatically and documented in the Cache & History section.
One-click buttons that open common Shopify Admin sections for the current store in a new tab. The store slug is read from the detected myshopify_domain.
Available links: Dashboard, Products, Collections, Orders, Customers, Themes, Pages, Blog Posts, Files, Metafields & Metaobjects.
Permanent settings stored in chrome.storage.local ā they persist across browser sessions and extension reloads. Changes take effect immediately without restarting the extension.
When enabled, the extension panel closes automatically after 3 seconds whenever you navigate to a page that is not a Shopify store and there is no active session cache.
A public Storefront API token used to authenticate all Storefront API (GraphQL) requests. Without this token the entire Storefront section is disabled and shows a "Token required" overlay.
X-Shopify-Storefront-Access-Token: <your-token>
chrome.storage.local ā survives browser restarts and extension updates.Determines which Shopify Storefront API release is used for all GraphQL requests. Format: YYYY-MM (e.g. 2026-04).
https://<shop>/api/<version>/graphql.json
Covers three persistence features: session caching (keeps the panel functional across non-store tabs), request history (automatic log of API calls), and themes viewed history (log of visited Shopify themes).
Every time you activate a Shopify store tab, the extension saves the store domain and tab ID to chrome.storage.session. This cache persists for the lifetime of the browser session. When you switch to a non-Shopify page (e.g. Google, a localhost app, or the browser settings), the extension checks whether the cached Shopify tab is still open. If it is, the full UI is shown using the cached store data and a cached badge appears next to the shop domain in the header.
Shopify AJAX API requests (/cart.js, /products/*.js, etc.) are injected into the target tab via chrome.scripting.executeScript ā they run inside the tab's JavaScript context, so they use the Shopify origin. When the cache is active, requests are routed to the cached Shopify tab instead of the currently active tab. This avoids CORS issues that would occur if requests were injected into a non-Shopify page.
Storefront API (GraphQL) calls are made directly from the extension service worker context ā Shopify's Storefront API allows CORS from browser extensions, so no tab injection is needed there.
If you have multiple Shopify store tabs open, the cache always reflects the most recently activated store. Switching between Shopify tabs updates the cache to the new store instantly. The cached badge disappears whenever the active tab is a confirmed Shopify store.
The cache is cleared automatically in these cases:
If the cache clears while you are on a non-Shopify page, the error screen will appear. Open any Shopify store tab to restore full functionality.
Every API request made from any tab (Cart, Product, Recommendations, Search, Storefront API) is automatically logged to a persistent history. Entries survive page reloads and browser restarts within the same profile.
localStorage under request.history; the oldest entry is dropped automatically when the cap is reached.On each tab load the extension reads window.Shopify.theme via script injection and automatically records the active theme. The history is displayed in the Theme & Admin tab.
?preview_theme_id= appended).Release history for Shopify Dev Helper.