Template
Three changes needed to run against a real storefront rather than mock.shop. Storefront API version 2025-07 -> 2026-07. Verified before switching: the API validates the version segment (a bogus one returns NOT_FOUND), and the fields this app selects all still resolve at 2026-07 — including the two deprecated ones, ProductOption.values and CartCost.totalTaxAmount, and the classic customer account mutations. BREAKING (config): NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN is now NEXT_PUBLIC_SHOPIFY_PUBLIC_ACCESS_TOKEN. Deploy environments must set the new name *before* the next build — NEXT_PUBLIC_* values are inlined at build time, so a stale name silently degrades to a tokenless client and real-store queries start failing. Works around a bug in this preview build of @shopify/hydrogen: the client tags every request with X-Hydrogen-Version, which the Storefront API does not list in its CORS access-control-allow-headers. Browsers reject the preflight, fetch throws, and hydrogen reports the generic "SFAPI request failed". Confirmed by isolating the single header in the browser against a real store: without it the request reaches the server (401 on a dummy token), with it fetch throws TypeError: Failed to fetch. This never showed up on mock.shop, which answers access-control-allow-headers: *. The header is stripped in the browser only, inside the fetch wrapper the client already owns; server-side requests are not subject to CORS and keep sending it. Remove once the API allows the header, or once these queries move server-side — which is the better fix, and what hydrogen's own guidance recommends for browser UI. Verified against a real store: product grid, search (519 results), product detail with variants, and cartCreate all succeed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JaxgqPbFxLsSuLPZom2kdC