releases.shpreview
Home/Shopify
Shopify

Shopify

Rollouts now supports scheduling, gradually publishing and A/B testing your themes and checkout and customer accounts configurations.

You can now:
1. Schedule an entire new checkout or theme to go live at a specific date and time. For example, switch from Dawn to Horizon on a specific date.
2. Temporarily swap to a different theme or checkout setup. For example, activating a BFCM theme for one week with automatic revert.
3. Gradually roll out a new theme or checkout configuration to a percentage of your visitors. For example, rolling out a new branding experience for your customer account pages.
4. Run an A/B test between two entirely different themes or checkout setups to find the winner. For example, A/B testing a new upsell block for your checkout page.
5. Schedule or test localized content per market. For example, test different CTA text for each region to see impact on conversions.

In addition, a copy of your published theme or config is automatically created so you can continue to edit your live theme/checkout independently from your experiment. And with mutually exclusive experiments, you can run multiple live experiments at the same time.

To get started, go to Markets > Rollouts in your Shopify admin and create a Rollout. Learn more about Rollouts in our help documentation.

Custom reports in Shopify Analytics now support two new chart types: scatter plots and radar charts. These give you more ways to spot patterns and compare performance across your store data without exporting to a spreadsheet.

Use scatter plots to see how two metrics relate. Plot revenue against units sold per product to find which products move volume but not margin. Plot session count against conversion rate per traffic source to see which channels actually convert, not just bring traffic. Each data point shows up as a dot, so clusters and outliers are easy to spot.

Use radar charts to compare across multiple metrics at once. Look at product categories side by side across average order value, conversion rate, and return rate on one shared axis. The shape that emerges shows the relative strengths and weaknesses of each category at a glance, instead of bouncing between separate line or bar charts.

Both chart types are available now in the visualization picker when you create or edit an existing report with compatible data.

Learn more about chart types in custom reports in the Shopify Help Center.

Starting with GraphQL Admin API version 2026-07, the [GiftCardCashOutTransaction](https://shopify.dev/docs/api/admin-graphql/2026-07/objects/GiftCardCashOutTransaction type is introduced as a new variant of the GiftCardTransaction interface. This type specifically represents transactions where a gift card balance is paid out through a point of sale (POS) system.

In previous API versions, such as 2026-04 and earlier, these transactions were classified as GiftCardDebitTransaction. From version 2026-07 onwards, they are identified as GiftCardCashOutTransaction. To accurately differentiate cash-out transactions from credit and debit transactions, use the __typename field when querying giftCard.transactions.

Below is an example query:

giftCard(id: "...") {
  transactions(first: 10) {
    nodes {
      __typename
      ... on GiftCardCashOutTransaction {
        id
        amount { amount currencyCode }
      }
    }
  }
}

You can now identify cart lines by their view_key when calling the cartLinesUpdate and cartLinesRemove mutations, as an alternative to the cart line id.

What's new

  • cartLinesUpdate accepts a viewKey on each CartLineUpdateInput, mutually exclusive with id.
  • cartLinesRemove accepts a viewKeys list, mutually exclusive with lineIds.

How to use

Provide exactly one identifier per line. Existing integrations that use id or lineIds keep working with no changes.

mutation RemoveLineByViewKey($cartId: ID!) {
  cartLinesRemove(cartId: $cartId, viewKeys: ["794864053:7c2a9f..."]) {
    cart { id }
    userErrors { field message }
  }
}

The end-to-end review management experience previously launched for new app submissions in the Partner Dashboard now also applies to app audits.

When a published app undergoes a quality check and requires changes, that feedback appears in the Partner Dashboard under App > Distribution. You’ll see the same requirement-level tracking, a structured fix workflow, and direct messaging used for app submissions.

What to do if your app has an active audit

If your published app currently has an open audit with outstanding issues, review and manage all feedback in the Partner Dashboard under App > Distribution. Use your app’s status page there to see required changes, update your app, and respond to the review team, instead of checking your email inbox.

Offering buyers a familiar, local way to pay can reduce friction and improve conversion at checkout. We've expanded the local payment methods available through Shopify Payments to more countries across Europe and beyond.

Depending on where your business is located, you can now offer:

MobilePay
Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Estonia, Finland, Greece, Hungary, Ireland, Italy, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Poland, Portugal, Romania, Slovenia, and Spain.

TWINT
Austria, Belgium, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, Greece, Hungary, Ireland, Italy, Latvia, Liechtenstein, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal, Romania, Slovenia, Spain, and Sweden.

BLIK
Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, Greece, Hungary, Ireland, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Norway, Portugal, Slovenia, and Sweden.

Przelewy24
Australia, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, Greece, Hong Kong SAR, Hungary, Ireland, Japan, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Netherlands, Norway, Portugal, Romania, Singapore, Slovenia, Sweden, and Switzerland.

Eligible buyers will see these payment methods at checkout once you turn them on. To get started, go to Settings > Payments in your Shopify admin and add the local payment methods you'd like to offer.

Learn more about local payment methods

Your store includes a default agents.md file accessible at /agents.md. The paths /llms.txt and /llms-full.txt also point to this content by default.

Add any of the following templates under Online Store > Themes > Edit code to serve different content per path:

  • templates/agents.md.liquid — controls /agents.md (and the default for the other two paths)
  • templates/llms.txt.liquid — controls /llms.txt only
  • templates/llms-full.txt.liquid — controls /llms-full.txt only

If no template is present for a given path, it falls back to your agents.md template, then to the Shopify-generated default.

Starting in API version 2026-07, the GraphQL Admin API supports local currency gift cards. You can create gift card products that are issued in a specific currency, and control whether buyers can redeem those gift cards across currencies. If your app creates gift cards directly, migrate from the deprecated initialValue field to initialAmount.

What changed

Use the new giftCardProductSet mutation to create and update gift card products. The input includes issuanceCurrency and crossCurrencyRedeemable, and automatically applies the product’s gift card settings to its variants. You can set issuanceCurrency and crossCurrencyRedeemable only when you create the product; you can’t change either field afterward.

Inspect a product’s settings through Product.giftCardSettings. If issuanceCurrency is null, Shopify issues gift cards from the product in the shop’s currency. If issuanceCurrency is set, Shopify issues gift cards in the specified currency, and buyers can purchase the product only in that currency. Publish these products only in markets where that currency is supported.

crossCurrencyRedeemable controls redemption behavior across currencies:

  • If crossCurrencyRedeemable is false, issued gift cards use a crossCurrencyRedemptionStrategy of NONE.
  • If crossCurrencyRedeemable is true and the product has no issuance currency, gift cards use MARKET_FX.
  • If crossCurrencyRedeemable is true and the product has an issuance currency, gift cards use SPOT_FX.

Gift card creation now accepts initialAmount, which replaces the deprecated initialValue field. initialAmount includes both the amount and currency. Query GiftCard.isRedeemable and GiftCard.crossCurrencyRedemptionStrategy to check whether a gift card can be redeemed and how cross-currency conversion is handled.

What to do

  1. If you create gift cards using giftCardCreate, replace initialValue with initialAmount before you upgrade to 2026-07.
  2. If you offer multi-currency stores, decide whether new gift card products should be pinned to a single issuance currency. Configure issuanceCurrency and crossCurrencyRedeemable when you create the product; you can’t change either field afterward.
  3. Update redemption flows to read GiftCard.crossCurrencyRedemptionStrategy so you can surface accurate cross-currency conversion behavior to merchants and buyers.

Related docs

We’ve updated the Shopify Payments Payouts page to make payout information easier to understand. The amount previously labeled To be paid is now labeled Payout balance, matching the language used across Finance. We’ve also added help text that explains how payout balance is calculated: payments minus refunds, disputes, and fees.

If funds are held in reserve on your account, the Payouts page continues to show the reserved amount separately, with help text explaining that reserved funds are temporarily held to help cover disputes, refunds, and chargeback risk. This update only changes how payout and reserve information is labeled and explained there is no change your payout timing, reserve terms, or payout amount.

Learn more about Shopify Payments payouts and reserves in Shopify Payments in the Shopify Help Center.

We’ve updated our headless checkout authentication docs to refer to the silent single sign-on query parameter as sso=silent instead of logged_in=true.

This is a terminology and documentation update only. Existing checkout URLs that use logged_in=true will continue to work. Going forward, Shopify docs and examples will use sso=silent when describing the silent SSO flow from a headless storefront to checkout.

Use sso=silent when you want checkout to verify the buyer’s active session on the customer accounts domain through an OIDC-compliant flow. For most headless storefronts using the Customer Account API, we continue to recommend continuous cart authentication by setting the cart’s customerAccessToken and redirecting buyers to the cart’s checkoutUrl.

Learn more about authenticating buyers in checkout.

Next Generation Events are now available in developer preview, with field-level control over when events fire, what data they carry, and what triggered each delivery.

  • Subscribe to exactly what you care about. Field-level triggers pre-qualify deliveries before they reach your endpoint. A subscription scoped to product.variants.price won't fire on title edits, tag updates, or status changes. Only when the price changes.
  • Get the payload your app needs, not a fixed schema. You define the delivery payload with a standard Admin GraphQL query. No over-fetching fields you'll discard. No extra API call to get the data you actually wanted after the webhook lands.
  • Know what fired for each delivery. Every delivery includes fields_changed: an explicit list of the fields that triggered the event, with full entity paths and IDs. That means you don't need to infer, or diff against prior state.
  • Filter on current state. query_filter narrows deliveries based on the current state of your query output. Use it to skip events that don't meet your conditions, like only delivering for active products.
  • Configure in code. Subscriptions live in shopify.app.toml alongside your other app configuration. Version-controlled, reviewable, and deployable.

As a developer preview, Events are available in the unstable API version and APIs may change. Product and Customer topics are live today.

Configuration and payload
[events]
api_version = "unstable"

[[events.subscription]]
handle = "price_sync"
topic = "Product"
actions = ["update"]
triggers = ["product.variants.price", "product.variants.compareAtPrice"]

uri = "/api/events"

query = """
	query priceSync($productId: ID!, $variantsId: ID!) {
		productVariant(id: $variantsId) {
			id
			price
			compareAtPrice
			sku
		}
		product(id: $productId) {
			id
			title
			status
		}
	}
"""
query_filter = "product.status:'ACTIVE'"

Every delivery includes fields_changed, data from your query, and query_variables used to fetch it:

{
  "topic": "Product",
  "action": "update",
  "handle": "price_sync",
  "data": {
    "productVariant": {
      "id": "gid://shopify/ProductVariant/456",
      "price": "24.99",
      "compareAtPrice": "34.99",
      "sku": "SIGNAL-NOT-NOISE"
    },
    "product": {
      "id": "gid://shopify/Product/123",
      "title": "Peace & Quiet Tee",
      "status": "ACTIVE"
    }
  },
  "fields_changed": [
    "product[id: 'gid://shopify/Product/123'].variants[id: 'gid://shopify/ProductVariant/456'].price"
  ],
  "query_variables": {
    "productId": "gid://shopify/Product/123",
    "variantsId": "gid://shopify/ProductVariant/456"
  }
}
Learn more

Learn more about how Events relate to Webhooks: https://shopify.dev/docs/apps/build/events-webhooks Get started by Creating an Events subscription.

The release of Shopify CLI 4.0 today brings clarity to CLI versioning, the introduction of automatic updates, and the announced removal of the deprecated --force flag from shopify app deploy.

Semantic Versioning

Shopify CLI is now following semantic versioning practices. Releases with new features will be minor versions, and bug fixes will be patch versions. When required, major version releases will be used to communicate breaking changes to CLI command structure or behavior.

For more information, see our announcement of the move to SemVer.

Automatic Upgrades

Starting with Shopify CLI 4.0, Shopify CLI upgrades itself automatically using the package manager you installed it with. Auto-upgrade is skipped in CI, project-local installs, and for major version releases. Automatic upgrades can be disabled with the shopify config autoupgrade off command.

For more information, see Shopify CLI documentation.

Removal of the --force flag for app releases

The --force flag on the app deploy and app release commands didn’t distinguish between low-risk operations (adding or updating extensions) and high-risk ones (deleting them). This flag has been removed in Shopify CLI 4.0. The previously released --allow-updates and --allow-deletes flags give you granular control, so your CI/CD pipelines can run unattended without the risk of accidental, irreversible deletions.

For more information, see the March 2026 changelog.

Other removed commands and flags

The following deprecated commands and flags have also been removed in Shopify CLI 4.0:

  • shopify webhook trigger (use shopify app webhook trigger)
  • shopify theme serve (use shopify theme dev)
  • shopify app generate schema (use shopify app function schema)
  • shopify app webhook trigger --shared-secret (use --client-secret)
  • shopify app generate extension --type (use --template)

You can now create your app's landing page in App Home as a Preact-based admin UI extension using the new admin.app.home.render target. This means your App Home UI extensions are bundled with your other admin UI extensions, eliminating the need for a separate web server to render your app's primary workspace.

Use this extension type when you want:

  • A persistent, full-page app workspace that's integrated into your extension bundle, rather than a separate iframe-hosted web app.
  • A unified source of truth for your app's primary UI, alongside your other admin UI extensions.
  • The performance and design-system advantages of Polaris web components without the need for hosting a web server for the App Home experience.
Availability

App Home UI extensions are available starting from API version 2026-07 and are intended for custom-distribution apps. If you're developing a public app for the Shopify App Store, you should continue using the iframe-based App Home solution.

Get started

To begin, scaffold a new extension-only app by selecting Build an extension-only app when prompted:

shopify app init

Alternatively, add an App Home UI extension to an existing app by selecting App home when prompted:

shopify app generate extension

For a comprehensive list of target APIs, web components, and configuration options, refer to the App Home UI extension reference.

Today, the customer account sign-in page has a refreshed design that gives you greater control over how it looks.

The sign-in page now offers a two-column layout, with the sign-in form shifted to the left and a customizable background image on the right, enabling you to express your brand more visually beyond the logo.

You can now customize and preview the sign-in page directly in the checkout and accounts editor. Set shared settings that apply consistently across all surfaces, and tailor styling elements to give your sign-in page a unique look. Plus merchants have more advanced customization control via the Checkout And Accounts Configuration API.

This is available exclusively on the latest version of customer accounts. If you’re using legacy customer accounts, follow our guide and complete your upgrade.

We've added cumulative metrics to Analytics so you can see how your metrics build up over time.

When you turn on the Cumulative toggle in the Visualization panel (or add WITH CUMULATIVE_VALUES to your ShopifyQL query), your time-series chart shows a running total instead of individual daily values making it easy to see progress toward a goal or how a metric is trending across a period.

Cumulative view works in three ways:
* On its own: See how a metric accumulates day by day across a date range. Useful for understanding growth patterns at a glance.
* With targets: Compare your running total against a target line to see whether you're on pace to hit your goal.
* With prior-period comparisons: Layer in a comparison to the same period last year (or another period), so you can spot how this period's trajectory compares to the last year.

Learn more here

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

Now you can automatically engage your customers with well-timed SMS messages. Send automated SMS with Shopify Messaging using pre-built templates for abandoned carts, abandoned checkouts, and browse abandonment, or create your own.

Set up your SMS marketing automations from Shopify Messaging > Automations, and manage your SMS spending threshold from Shopify Messaging > Settings.

Learn more about SMS marketing automations in the Shopify Help Center.

Merchants with more complex business structures can now sell from multiple legal entities in the same country using Shopify Payments.

Previously, merchants often needed separate stores or expansion store workarounds when different parts of their business operated under different legal entities in the same country. Now, eligible merchants can configure multiple Shopify Payments accounts within a single store using Markets.

This makes it easier to:
* Sell online and in retail under separate legal entities in the same country
* Support different legal entities for different retail locations
* Separate B2B and D2C sales under different entities
* Attribute sales, payouts, and compliance requirements to the right business entity
* Reduce duplicated admin work across multiple stores
* This update helps merchants keep their business structure flexible while managing more of their operations from one Shopify store.

This update helps merchants keep their business structure flexible while managing more of their operations from one Shopify store.

Last Checked
1h ago
Category
Tracking since Jan 7, 2015