--- title: Shop Minis March April 2026 update - Shopify developer changelog description: >- Shopify’s developer changelog documents all changes to Shopify’s platform. Find the latest news and learn about new platform opportunities. source_url: html: 'https://shopify.dev/changelog/shop-minis-march-april-2026-update' md: 'https://shopify.dev/changelog/shop-minis-march-april-2026-update.md' metadata: effectiveApiVersion: '' affectedApi: - displayName: Shop Minis handle: shop-minis primaryTag: displayName: API handle: api secondaryTag: displayName: Update handle: update indicatesActionRequired: false createdAt: '2026-05-19T23:11:16-04:00' postedAt: '2026-05-20T12:00:00-04:00' updatedAt: '2026-05-20T03:41:50-04:00' effectiveAt: '2026-05-20T12:00:00-04:00' --- May 20, 2026 Tags: * Shop Minis # Shop Minis March April 2026 update ## New Features ### Optional Consent Users can now reject scopes and continue using your Mini. Consent is no longer all-or-nothing — if a user declines a scope, your Mini should gracefully degrade rather than block the experience. If your Mini hard-fails when a scope is rejected, please update it using the new hooks below. ### useCheckScopesConsent Hook Check at runtime which scopes a user has granted. Use this to conditionally render features that depend on a particular scope. **Usage:** ``` import {useCheckScopesConsent} from '@shopify/shop-minis-react' function MyMini() { const {scopes} = useCheckScopesConsent() if (scopes.includes('product_lists:write')) { return } return } ``` ### useRequestScopesConsent Hook Re-request consent after a user has previously declined. The hook must be invoked from a user interaction — you cannot re-prompt automatically. Use this for flows where granting consent unlocks a clear, user-initiated action. **Usage:** ``` import {useRequestScopesConsent} from '@shopify/shop-minis-react' function GrantAccessButton() { const {requestScopesConsent} = useRequestScopesConsent() return ( ) } ``` ### useCheckPermissions Hook Separate from scopes, `useCheckPermissions` lets your Mini check OS-level permissions (camera, photo library, and so on) before invoking an action that requires them. **Usage:** ``` import {useCheckPermissions} from '@shopify/shop-minis-react' function CameraFeature() { const {permissions} = useCheckPermissions(['camera']) if (permissions.camera === 'granted') { return } return } ``` ### request\_blocked Sentinel When a user has declined a scope or permission and the platform will not re-prompt, the relevant hooks now return a `request_blocked` sentinel value instead of `null`. This lets you distinguish "not asked yet" from "asked and blocked" and tailor your UI accordingly. See the Scopes Consent docs on shopify.dev for the full state machine. ### Intents Intents are a new communication layer between the Shop app and Shop Minis. The Shop app launches your Mini from contextually relevant moments — such as a product detail page — and passes along the context (typically a product). For partners, this opens a new path to distribution: instead of relying on the Explore tab alone, your Mini can be surfaced where buyer intent is highest. Two intents are supported today: | Intent | What it's for | | - | - | | `try_on` | Virtual try-on Minis — clothing, accessories, anything wearable | | `view_in` | AR and room-placement Minis — furniture, decor, anything you'd visualize in a space | If your Mini fits one of the supported intents, or you have a different use case in mind (recipe building, gift finding, custom configurations, and so on), reach out to the Shop Minis team — we're onboarding partners now and actively scoping new intents. ### useIntent Hook Parse the intent that launched your Mini. Use this to read the context the Shop app passed in and route the user to the right experience. **Usage:** ``` import {useIntent} from '@shopify/shop-minis-react' function MyMini() { const intent = useIntent() if (intent?.action === 'try_on') { return } return } ``` ### Async Storage Limits To keep Minis fast, we're introducing limits on `useAsyncStorage` and `useSecureStorage`: * **10 keys max** per Mini * **1 MB per key** Most Minis are well under both limits. Async storage is intended for small structured data — if you're persisting larger assets like images, use a dedicated upload hook and store the resulting URL instead of the raw bytes. ### availableForSale on Product Hooks Product hooks now expose `availableForSale` on variants, and the SDK's commerce buttons (`AddToCartButton`, `BuyNowButton`) handle the out-of-stock state out of the box. If you render product cards or build a custom commerce flow, check `availableForSale` before letting users add to cart. ### pnpm Support in the CLI `npx minis create` now detects and supports pnpm alongside npm and yarn. **Usage:** ```shell npx minis create # Select pnpm when prompted ``` *** ## Documentation Updates ### Scopes Consent The Scopes Consent page on shopify.dev has been updated to reflect optional consent. It now documents the full state machine (granted, declined, `request_blocked`) and includes guidance for the new `useCheckScopesConsent`, `useRequestScopesConsent`, and `useCheckPermissions` hooks. ### Intents A new documentation page covers intents end-to-end: what they are, which intents are supported today (`try_on`, `view_in`), the launch-context contract, and how to parse the intent in your Mini with the `useIntent` hook. *** ## Deprecations ### localStorage and sessionStorage Browser storage is no longer permitted inside the Mini webview — it's disabled on Android and reset between sessions on iOS. The Shop Minis ESLint config now flags any use of `localStorage` or `sessionStorage`. Migrate to `useAsyncStorage` (persistent) or `useSecureStorage` (encrypted). *** ## Package Versions | Package | Version | | - | - | | `@shopify/shop-minis-platform` | 0.17.0 | | `@shopify/shop-minis-react` | 0.20.0 | | `@shopify/shop-minis-cli` | 0.3.11 | *** ## Other Changes * **Phantom dependency imports blocked**: The partner ESLint config flags imports of packages not declared in your `package.json`. * **Transitive SDK deps allowed**: `clsx`, `tailwind-merge`, and `cva` are now explicitly available for partner use. * **TypeScript 6**: The SDK is now built against TypeScript 6.0.2 (up from 5.8.3). *** ## Summary March-April 2026 brings significant improvements to the Shop Minis platform: 1. **Optional consent** is now the default — *three new hooks let your Mini gracefully degrade when scopes are declined.* 2. **Intents** are a new communication layer for launching your Mini from contextually relevant moments in the Shop app — `try_on` and `view_in` supported today. 3. **Async storage limits** of 10 keys per Mini, 1 MB per key. 4. **`availableForSale`** on product variants for first-class out-of-stock handling. 5. **`localStorage` and `sessionStorage`** are no longer permitted in the Mini webview. For questions or feedback, reach out to the Shop Minis team.