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