<Back to Updates

Developer preview release notes: July 30, 2026

July 30, 2026

New

Vue bindings

@shopify/hydrogen/vue is a new entrypoint that mirrors the React API: providers and composables for the cart, products, collections, and search. Vue 3.5+ is an optional peer dependency, same as React.

Typed factories work the same way as in React: createCartComponents<typeof cartHandlers>() returns CartProvider, useCart, and useCartForm, with cart state typed from your server handlers. Product forms get the same treatment through createProductComponents; collections and search use plain providers and composables.

GraphQL TypeScript tooling in the package

Apps no longer install gql.tada or repeat Shopify schema paths in tsconfig.json. A bundled TypeScript plugin gives you autocomplete and type errors across both the Storefront and Customer Account schemas, and it takes one tsconfig entry:

Code Example

{"compilerOptions": {"plugins": [{"name": "@shopify/hydrogen/ts-plugin"}]}}

The same validation runs headlessly with hydrogen gql check --fail-on-warn, so CI can catch schema drift without an editor.

Analytics and consent through ShopifyScripts

ShopifyScripts now inlines the analytics bus into the rendered HTML, so it's there before framework code hydrates. The bus lives at window.Shopify.analytics, which means any part of the app can publish to it without the bus being passed around. The consent and Shopify analytics scripts load on every page now; pass shopifyAnalytics: false to skip the analytics one.

Consent starts up as part of the same bootstrap. consent: {mode: "default-banner"} uses Shopify's privacy banner; an explicit consent config supports a custom one.

Cart tracking is a subscription now: trackCartAnalytics(cartStore) works from any framework, and React gets a useCartAnalytics() hook.

Shopify Inbox support

Hydrogen now supports Shopify Inbox. Shoppers can chat with your store's AI agent and get handed off to staff when they need a human, all without signing in.

With inbox enabled on ShopifyScripts, the Inbox module loads, and <shopify-chat /> controls where the widget appears. The store needs the Inbox app with the Agent feature enabled, and "Require sign-in to chat with staff" turned off.

Suspense cart reads in React

createCartComponents() now returns useSuspenseCart, and the cart store exposes the in-flight full-cart load. Cart content can suspend behind its own fallback while the rest of the page renders immediately. For Next.js apps, that means the app shell can stay static and CDN-cacheable while the cart streams in.

Changed

ShopifyScripts asks for your shop identity

Features like Inbox and analytics bootstrap from your shop's permanent domain, so the shop option is now required and includes myshopifyDomain alongside shopId and storefrontId. If you passed only IDs before, adding the domain is the whole migration.

Analytics and consent config shapes

The analytics config now asks for an explicit channel ("hydrogen" or "headless"), and fields Hydrogen can resolve on its own went away:

  • acceptedLanguage, currency, and hydrogenSubchannelId from ShopAnalytics
  • consentDomain and publicStorefrontAccessToken from ConsentConfig

Consent gating is stricter too: events now wait for customerPrivacy.consentStatus to reach loaded before firing. prevCart also moved off cart_viewed payloads; it stays on cart-update and cart-line-update payloads.

Product option selection

Variant matching now accounts for the full set of selected options, and variants from other products no longer leak into the result. The helper signature changed to take one object, { searchParams, allowedOptionNames? }; the URL and Request overloads are gone.

Private Storefront API calls now need buyerIp

If you call the Storefront API with a private token, directly or through the proxy, requestContext.buyerIp is now required: the proxy throws without it, and the client throws if it disagrees with the client's own buyerIp. Public-token setups aren't affected.

New window.Shopify globals

Shopify.currency.active tracks the active currency. The initial value comes from the new i18n.currency option; after that it stays in sync with the cart. Shopify.customerPrivacy.consentStatus flips to loaded once consent resolves, which is also when analytics events start firing. window.privacyBanner lets a "manage cookies" link reopen the banner.

Typed collection filters

Filter types are generic now, so API-provided value fields like swatch keep their types through to your UI.

Cart and search behavior fixes

Search results no longer go stale when shoppers navigate away and back: the predictive search store gained connect(), and the React provider reconnects on mount.

reset() on the cart store now reloads the cart from the server instead of leaving the store empty. When a shopper updates their consent, the cart refreshes its checkout URL to match.

Shopify CLI only shows commands this package supports

In a dev-preview project, the Shopify CLI now hides the classic hydrogen:* commands this package doesn't support, instead of offering ones that fail when you run them.

Agent skills

Updated across the board, with new framework references for Vue, Nuxt, SvelteKit, and Solid Start. Two new skills: hydrogen-image for CDN image URLs and hydrogen-oxygen for Oxygen and MiniOxygen setup. The starter templates now ship the full skill set under .agents/skills/.

Removed

  • Hydrogen no longer exports createStorefrontAnalytics(). ShopifyScripts creates the analytics bus now, so the factory had nothing left to do, and the bus's updateCart() method went with it. Cart tracking comes from trackCartAnalytics(cartStore), or useCartAnalytics() in React.
  • The canTrack and cookieDomain analytics options are gone. Consent gating is owned by the ShopifyScripts bootstrap now.
  • quantityAvailable is no longer fetched by the default cart fragment. If you show stock availability, pass a custom cart fragment that adds it back.
  • Shopify.customerPrivacy.shouldShowGDPRBanner() went away, along with config.storefrontAccessToken and config.injectedConsent. Use shouldShowBanner(), or the new window.privacyBanner API, instead.
  • InitializeShopifyScriptsOptions is no longer exported. Routing config uses ShopifyRoutesOptions, and webMcp is a prop on ShopifyScripts.

Migration

For migration guidance, compare the commits that bracket this release. The diff shows the changes between the previous preview and this release:

Code Example

git diff 8a708a87f..116d5d7ea

Get building

Spin up a new Hydrogen app in minutes.

See documentation