---
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 <SaveToListButton />
  }
  return <SignInPrompt />
}
```

### 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 (
    <button onClick={() => requestScopesConsent(['product_lists:write'])}>
      Enable saving products
    </button>
  )
}
```

### 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 <CameraView />
  }
  return <RequestCameraButton />
}
```

### 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 <TryOn productId={intent.productId} />
  }
  return <DefaultExperience />
}
```

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