Skip to content

Connect your store

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”
  1. Install the Headless sales channel: apps.shopify.com/headless.
  2. Click Create storefront, then Manage next to Storefront API.
  3. 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.
  4. Click Save, then copy the Public access token. This is token on <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.

Use your *.myshopify.com domain from Settings → Domains. This is domain on <storesynk-store>. A custom domain pointing to Shopify works too.

Publish every product and every collection you list to the Headless storefront. Unpublished items render blank.

One request catches a bad token, a missing scope, an unpublished item, and a wrong handle. Substitute real handles:

Terminal window
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.
  • shop resolves but product / collection is null: 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.

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.

<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.

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