Get the store domain and public Storefront token, then verify them with one request.
<storesynk-store> needs two values from Shopify: your store domain and a public Storefront API access token. Most setup gaps return nothing rather than an error, so verify both with the smoke test at the end.
Install the Headless channel and copy the token
Section titled “Install the Headless channel and copy the token”- Install the Headless sales channel: apps.shopify.com/headless.
- Click Create storefront, then Manage next to Storefront API.
- Enable these scopes by name: unauthenticated product/collection listing, inventory & pricing, selling plan, metaobject/content, and cart/checkout. Leave the customer account scopes off. A missing scope is the most common setup mistake.
- Click Save, then copy the Public access token. This is
tokenon<storesynk-store>.
Shopify’s own guide: Getting started with the Storefront API.
Public token only. Never put a private or Admin API token in <storesynk-store>. A custom app’s Storefront API token also works, but the Headless channel is the recommended path.
Find your store domain
Section titled “Find your store domain”Use your *.myshopify.com domain from Settings → Domains. This is domain on <storesynk-store>. A custom domain pointing to Shopify works too.
Publish your products and collections
Section titled “Publish your products and collections”Publish every product and every collection you list to the Headless storefront. Unpublished items render blank.
Smoke-test the setup
Section titled “Smoke-test the setup”One request catches a bad token, a missing scope, an unpublished item, and a wrong handle. Substitute real handles:
curl -s https://your-store.myshopify.com/api/2026-07/graphql.json \ -H 'Content-Type: application/json' \ -H 'X-Shopify-Storefront-Access-Token: YOUR_PUBLIC_TOKEN' \ -d '{"query":"{ shop { name paymentSettings { currencyCode } } product(handle: \"a-real-handle\") { title } collection(handle: \"a-real-collection\") { title } }"}'- HTTP 401/403 or an access error: the token is wrong, is an Admin token, or is missing scopes. Redo step 3.
shopresolves butproduct/collectionisnull: wrong handle, or the item is not published to the channel.- All three non-null: the Shopify side is good. Anything blank after this is a markup problem.
currencyCode is the currency every price renders in; it is a Shopify store or Markets setting.
Password-protected stores
Section titled “Password-protected stores”The password does not block the Storefront API, but checkout dead-ends at the password wall. Remove the password under Online Store → Preferences or launch the plan.
Routing
Section titled “Routing”<product-link> emits href="/products/{handle}" by default (configurable with its path attribute), so a multi-page store needs a route per product handle. The framework setups on the next page handle this.
Still blank?
Section titled “Still blank?”The bundle script must load, and any script that injects domain/token must run before it. More in Troubleshooting: Setup & credentials.
Next: Set up your project