Shop Minis / March–April 2026 Update

Shop Minis now "keeps working even when denied"
& evolves to "context-aware launch"

Optional Consent for scopes, launching Intents from the Shop app, storage limits, availableForSale exposure, and more — a major update that changes how you build Minis.

On this page
  1. Key points in 30 seconds: what's changing
  2. Optional Consent: toward Minis that keep working even when denied
  3. Three new Hooks (scopes / permissions)
  4. Intents: Minis invoked with context
  5. Changes to storage and data specifications
  6. Deprecations and other changes
  7. Five points engineers should know
  8. Three use cases you can put to work
  9. A one-line summary for your pitch

1Key points in 30 seconds: what's changing

Shop Minis has moved from assuming "you get all consents" and "launch from the Explore tab,"
to assuming they keep working even when denied and are invoked with context — the SDK's model has changed.

Optional Consent

Consent isn't all-or-nothing. Even when some scopes are denied, the Mini must keep running. Handle it with the three new hooks.

Shop

Intents

Launch a Mini "with context" from product pages and more in the Shop app. try_on / view_in are available today.

10K · 1MB

Operational guardrails

Limits on async storage. localStorage/sessionStorage deprecated. availableForSale exposure for inventory consistency.

2Optional Consent: toward Minis that keep working even when denied

User Scope request product_lists:write, etc. User decides individually granted Show full functionality SaveToListButton, etc. declined Show alternative UI Keep it alive with SignInPrompt, etc. request_blocked Cannot re-prompt Distinguishable from "unconfirmed"
The traditional "stop the Mini if consent isn't granted" design may break if left as is.Existing Minis that hard-fail need to be rewritten with the new hooks— so it has been announced.
The state transitions are granted / declined / request_blocked — these three values. "null (unconfirmed)" and "request_blocked (blocked after denial)" are now distinct, so you can branch your UI.

3Three new Hooks (scopes / permissions)

scope

useCheckScopesConsent: Check granted scopes at runtime

Use it when conditionally rendering UI that depends on scopes.

import {useCheckScopesConsent} from '@shopify/shop-minis-react'
function MyMini() {
 const {scopes} = useCheckScopesConsent()
 if (scopes.includes('product_lists:write')) {
 return <SaveToListButton />
 }
 return <SignInPrompt />
}
scope

useRequestScopesConsent: Re-request after a denial (requires user action)

You can't re-prompt automatically. It takes a button press, etc. Must be invoked in response to a user action.

import {useRequestScopesConsent} from '@shopify/shop-minis-react'
function GrantAccessButton() {
 const {requestScopesConsent} = useRequestScopesConsent()
 return (
 <button onClick={() => requestScopesConsent(['product_lists:write'])}>
 Enable saving products
 </button>
 )
}
permission

useCheckPermissions: Check OS permissions (camera, photos, etc.)

A separate layer from scopes. Lets you check whether OS permissions like the camera / photo library are granted.

import {useCheckPermissions} from '@shopify/shop-minis-react'
function CameraFeature() {
 const {permissions} = useCheckPermissions(['camera'])
 if (permissions.camera === 'granted') {
 return <CameraView />
 }
 return <RequestCameraButton />
}
"scope = access to Shopify features" and "permission = OS permission"now form a two-layer structure. Even for the same camera feature, you must check both the scope and the OS permission separately.

4Intents: Mini is invoked with context

Such as the product detail page in the Shop app "a moment of high purchase intent" A new communication layer that launches a Mini while passing context (usually a product) from such moments. It opens up entry points beyond the Explore tab.
Shop App Product detail Try on → View in room → intent + product useIntent() intent.action intent.productId Parse the launch context and branch try_on Virtual try-on view_in AR / room placement Coming soon Recipes / gift finding Custom configurations, etc.

Currently supported Intents

IntentUse caseMain targets
try_on Virtual try-on Mini Clothing, accessories, and wearables in general
view_in AR / room placement Mini Furniture, interior decor, and anything you want to see placed in a space

How to use the useIntent Hook

import {useIntent} from '@shopify/shop-minis-react'
function MyMini() {
 const intent = useIntent()
 if (intent?.action === 'try_on') {
 return <TryOn productId={intent.productId} />
 }
 return <DefaultExperience />
}
Even if it isn't currently supported, if you have other use cases such as recipe creation, gift finding, or custom configuration, contact the Shop Minis team directly and your new intent may become a candidate for scoping — this is explicitly stated.

5Changes to storage and data specifications

10 keys 1 MB / key

Async Storage limits

useAsyncStorage and useSecureStorage now have 10 keys per Mini / 1 MB per key limits. This keeps Minis lightweight.

For large assets like images, the recommended approach is to "convert them to URLs via the upload hook and store those."

The Product Hook now exposes availableForSale

availableForSale is now exposed on variant.AddToCartButton/BuyNowButton automatically handle the out-of-stock state. If you build a custom cart UI, check it explicitly.

$ pnpm

The CLI now supports pnpm

npx minis create , auto-detecting pnpm in addition to npm/yarn. You can now select pnpm in the prompt when creating a project.

6Deprecations and other changes

localStorage / sessionStorage are no longer available : browser storage is no longer allowed in the Mini webview. Disabled on Android, and reset between sessions on iOS.ESLint detects and flags it. Migrate to useAsyncStorage (persistent) or useSecureStorage (encrypted).

Package Versions

PackageVersion
@shopify/shop-minis-platform0.17.0
@shopify/shop-minis-react0.20.0
@shopify/shop-minis-cli0.3.11

Other

Lint

No phantom dependencies

Importing packages not declared in package.json is flagged by ESLint.

Allowed

Explicitly allowed transitive dependencies

clsx / tailwind-merge / cva are now explicitly allowed for use by partners.

TypeScript

Upgrade to TS 6.0.2

The SDK build has been updated to TypeScript 6.0.2 (from 5.8.3).

Documentation updates

Scopes Consent

The Scopes Consent page on shopify.dev now supports optional consent. It documents the granted/declined/request_blocked state machine and guidance for the three new hooks.

Intents

A new documentation page has been added. It explains end-to-end what intents are, the current intents (try_on/view_in), the launch-context contract, and how to parse them with useIntent.

7Five points engineers should know

3-state consent

1. Treat consent as three values

granted / declined / request_blocked. request_blocked in particular is a "can no longer ask" state, so on the Mini side you should switch your design to an "explaining UI" rather than a "prompting UI" .

2. Re-requests require a "user gesture"

useRequestScopesConsent can only be triggered by a user action. By design, auto re-prompt implementations using useEffect and the like simply won't fire.

SC OS

3. Design scopes and OS permissions separately

Even for the same "camera feature," you need to evaluate scope (Shopify permission) and permission (OS permission) as separate layers. Combine useCheckScopesConsent and useCheckPermissions.

localStorage

4. localStorage / sessionStorage are banned

Existing codebases need to be migrated. Since ESLint can detect this mechanically, making CI fail on it is a safe practice to adopt. Replace them with useAsyncStorage / useSecureStorage.

intent

5. Treat Intents as a "distribution channel"

Launching from places like product details in the Shop app = broadens distribution that used to rely only on the Explore tab. It's best to build in from the start a design (routing) that reads the launch context with useIntent and navigates to the appropriate screen. They've announced that even unsupported intents can become candidates for new scoping if you contact the Shop Minis team.

8Three use cases you can apply to your work

decline
USE CASE 1

Refactor existing Minis to a state where they "don't break when consent is denied"

Problem
Until now, Minis have been built on the premise of "stop if you can't get consent." With Optional Consent, you'll now have users who keep using the Mini while consent remains denied.
Approach
Use useCheckScopesConsent to evaluate the required scopes at runtime, and fall back to alternative UI (such as SignInPrompt) when they aren't granted. Place useRequestScopesConsent so re-granting is triggered by a user action.
Impact
Prevents churn among users who deny consent + fewer "can't do anything once denied" reviews + eliminates the risk of violating platform policy.
Technical notes
State has three values: granted / declined / request_blocked. In request_blocked you can't re-prompt, so switch to UI that explains "why it's needed."
Product Try on Mini
USE CASE 2

Capture "contextual Minis" as a new acquisition channel for apparel and furniture brands

Problem
Minis only launch via the Explore tab in the Shop App, so you can't reach high-intent users on the PDP (product detail page).
Approach
Implement Minis that support the try_on Intent for apparel and the view_in Intent for furniture and interiors. Read intent.productId with useIntent to deliver pinpoint AR / try-on experiences for a specific product.
Impact
The Mini launches at the moment of highest purchase intent → try-on / AR removes hesitation → a new distribution channel aimed at improving CVR and AOV.
Technical notes
The supported intents are only the two types try_on / view_in(as documented). For other use cases, contacting the Shop Minis team directly could make a new intent eligible for scoping.
localStorage × phantom dep × storage limit × ESLint pass ✓
USE CASE 3

Strengthen CI / health checks for Mini development all at once

Problem
When you run multiple Minis in parallel, storage and prohibited API usage drift over time, and detecting bugs after release takes a while.
Approach
Use the SDK's bundled ESLint config to fail CI on localStorage / sessionStorage and phantom deps (undeclared imports). Rework your key design around the 10 keys / 1 MB storage limit, and standardize on saving images as URLs. Also add a required availableForSale check.
Impact
Even new members catch violations automatically, mistaken purchase paths to out-of-stock products are eliminated, and code review standards can be unified across stores.
Technical notes
The SDK is upgraded to TypeScript 6. clsx / tailwind-merge / cva are approved for use as transitive dependencies (explicitly documented). Creating new projects that use pnpm is also npx minis create supported with a single command.

9A one-line summary you can use in proposals

"Shop Minis has evolved into an SDK that is "consent-optional" and "context-aware on launch." With Optional Consent's 3 hooks for graceful degradation,
Optional Consent's 3 hooks enable graceful degradation, Intents (try_on / view_in) provide new entry points from the PDP,
and the storage limit and dropping localStorage strengthen operational guardrails too.Rewriting existing Minis on the premise that they "keep working even when denied" is the top priority this quarter."