Add discount tags, bulk ops, merchant targets; deprecate checkout branding

3/31/2026, 12:00:21 AM

Shopify now exposes a new discountTags query that returns a paginated list of all tags applied to discount price rules and offers standard pagination and filtering. A merchantTargets query and associated CRUD mutations enable creating, updating, deleting, and listing merchant‑defined KPI targets, with full filtering, sorting, and pagination. All discount node types (DiscountAutomatic*, DiscountCode*) now include a tags field, and the main discountNodes query accepts a tag filter value, letting clients query discounts by tag. Corresponding bulk queue mutation types (discountBulkTagsAdd and discountBulkTagsRemove) allow asynchronously adding or removing tags on many discounts simultaneously, returning a Job and a list of DiscountUserErrors. The channel.resourceFeedback field documentation now clarifies that it may return null after a SUCCESS/ACCEPTED state; the shopResourceFeedbackCreate mutation’s feedback payload similarly returns null when a state of ACCEPTED clears the signal. Additionally, legacy checkout branding mutations and fields (checkoutBrandingUpsert, checkoutBranding, checkoutProfile, checkoutProfiles) are deprecated, replaced by the checkoutAndAccountsConfiguration* family. Developers should migrate to the new tags APIs for discount filtering, use the merchant targets flow for KPI tracking, and adjust any checkout branding code to the new conventions.

Query Changes

➕ Added Queries (2)

discountTags

List of tags associated to discounts.

merchantTargets

A list of merchant targets for the shop.

🔄 Modified Queries (8)

automaticDiscountNodes

Returns a list of automatic discounts.

~ Modified argument: query
automaticDiscounts

Returns a list of automatic discounts that are applied in the cart and at checkout without requiring a discount code.

~ Modified argument: query
checkoutBranding

Returns the visual customizations for checkout for a given checkout profile.

To update checkout branding settings, use the checkoutBrandingUpsert mutation. Learn more about customizing checkout's appearance.

⚠️ Deprecated: Use `checkoutAndAccountsConfiguration` instead.
checkoutProfile

Returns a CheckoutProfile. Checkout profiles define the branding settings and UI extensions for a store's checkout experience. Stores can have one published profile that renders on their live checkout and multiple draft profiles for testing customizations in the checkout editor.

⚠️ Deprecated: Use `checkoutAndAccountsConfiguration` instead.
checkoutProfiles

List of checkout profiles on a shop.

⚠️ Deprecated: Use `checkoutAndAccountsConfigurations` instead.
codeDiscountNodes

Returns a list of code-based discounts.

~ Modified argument: query
discountNodes

Returns a list of discounts.

~ Modified argument: query
discountNodesCount

The total number of discounts for the shop. Limited to a maximum of 10000 by default.

~ Modified argument: query

Mutation Changes

➕ Added Mutations (5)

discountBulkTagsAdd

Adds tags to multiple discounts asynchronously using one of the following:

  • A search query
  • A saved search ID
  • A list of discount IDs

For example, you can add tags to price rules that match a search criteria, or add tags to a predefined set of price rules.

discountBulkTagsRemove

Removes tags from multiple discounts asynchronously using one of the following:

  • A search query
  • A saved search ID
  • A list of discount IDs

For example, you can delete tags from price rules that match a search criteria, or delete tags from a predefined set of price rules.

merchantTargetCreate

Create a new merchant target.

merchantTargetUpdate

Updates a merchant target.

merchantTargetsDelete

Deletes one or more merchant targets.

🔄 Modified Mutations (4)

checkoutBrandingUpsert

Updates the visual branding for a CheckoutProfile, customizing how checkout displays to customers. Creates new branding settings if none exist, or modifies existing settings.

The mutation accepts two levels of customization through the CheckoutBrandingInput input object. designSystem defines foundational brand attributes like colors, typography, and corner radius that apply consistently throughout checkout. customizations defines styles for specific parts of the UI, individual components, or groups of components like the header, buttons, form fields, and sections.

Changes to a published checkout profile display immediately in the store's checkout. You can preview draft profiles in the Shopify admin's checkout editor before publishing.

Learn more about checkout styling.

⚠️ Deprecated: Use `checkoutAndAccountsConfigurationUpdate` instead.
collectionCreate

Creates a collection
to group products together
in the online store and
other sales channels.
For example, an athletics store might create different collections for running attire, shoes, and accessories.

There are two types of collections:

Use the collectionCreate mutation when you need to:

  • Create a new collection for a product launch or campaign
  • Organize products by category, season, or promotion
  • Automate product grouping using rules (for example, by tag, type, or price)

Note:
The created collection is unpublished by default. To make it available to customers,
use the publishablePublish
mutation after creation.

Learn more about using metafields with smart collections.

+ New argument: input
collectionUpdate

Updates a collection,
modifying its properties, products, or publication settings. Collections help organize
products together
in the online store and
other sales channels.

Use the collectionUpdate mutation to programmatically modify collections in scenarios such as:

  • Updating collection details, like title, description, or image
  • Modifying SEO metadata for better search visibility
  • Changing which products are included (using rule updates for smart collections)
  • Publishing or unpublishing collections across different sales channels
  • Updating custom data using metafields

There are two types of collections with different update capabilities:

  • Custom (manual) collections: You can update collection properties, but rule sets can't be modified since products are manually selected.
  • Smart (automated) collections: You can update both collection properties and the rules that automatically determine which products are included.
    When updating rule sets for smart collections, the operation might be processed asynchronously. In these cases, the mutation returns a job object that you can use to track the progress of the update.

To publish or unpublish collections to specific sales channels, use the dedicated
publishablePublish and
publishableUnpublish mutations.

Learn more about using metafields with smart collections.

+ New argument: input
shopResourceFeedbackCreate

The ResourceFeedback object lets your app report the status of shops and their resources. For example, if
your app is a marketplace channel, then you can use resource feedback to alert merchants that they need to connect their marketplace account by signing in.

Resource feedback notifications are displayed to the merchant on the home screen of their Shopify admin, and in the product details view for any products that are published to your app.

This resource should be used only in cases where you're describing steps that a merchant is required to complete. If your app offers optional or promotional set-up steps, or if it makes recommendations, then don't use resource feedback to let merchants know about them.

Sending feedback on a shop

You can send resource feedback on a shop to let the merchant know what steps they need to take to make sure that your app is set up correctly. Feedback can have one of two states: REQUIRES_ACTION or ACCEPTED. You need to send a REQUIRES_ACTION feedback request for each step that the merchant is required to complete.

If there are multiple set-up steps that require merchant action, then send feedback with a state of REQUIRES_ACTION as merchants complete prior steps. When all required actions are resolved, send an ACCEPTED feedback request to clear the active feedback signal.

Clearing feedback with ACCEPTED

Sending state: ACCEPTED removes the active feedback entry. After this mutation succeeds, reading channel.resourceFeedback, app.feedback, or the feedback field on this payload may return null—this is expected behavior, not a mutation failure. A null result means no outstanding feedback exists for the channel.

Important

Sending feedback replaces previously sent feedback for the shop. Send a new shopResourceFeedbackCreate mutation to push the latest state of a shop or its resources to Shopify.

Type Changes

➕ Added Types (10)

🏗️DiscountBulkTagsAddPayload➕ AddedOBJECT

Return type for discountBulkTagsAdd mutation.

Fields: job, userErrors
🏗️DiscountBulkTagsRemovePayload➕ AddedOBJECT

Return type for discountBulkTagsRemove mutation.

Fields: job, userErrors
📋DiscountTagSortKeys➕ AddedENUM

The set of valid sort keys for the DiscountTag query.

Values: ID, TITLE
🏗️MerchantTarget➕ AddedOBJECT

A merchant created target for an analytics metric.

Fields: createdAt, currencyCode, endDate, expectedValue, filters ... +6 more
🏗️MerchantTargetConnection➕ AddedOBJECT

An auto-generated type for paginating through multiple MerchantTargets.

Fields: edges, nodes, pageInfo
🏗️MerchantTargetCreatePayload➕ AddedOBJECT

Return type for merchantTargetCreate mutation.

Fields: merchantTarget, userErrors
🏗️MerchantTargetEdge➕ AddedOBJECT

An auto-generated type which holds one MerchantTarget and a cursor during pagination.

Fields: cursor, node
📋MerchantTargetSortKeys➕ AddedENUM

The set of valid sort keys for the MerchantTarget query.

Values: CREATED_AT, END_DATE, EXPECTED_VALUE, ID, METRIC, NAME, START_DATE
🏗️MerchantTargetUpdatePayload➕ AddedOBJECT

Return type for merchantTargetUpdate mutation.

Fields: merchantTarget, userErrors
🏗️MerchantTargetsDeletePayload➕ AddedOBJECT

Return type for merchantTargetsDelete mutation.

Fields: deletedIds, userErrors

🔄 Modified Types (14)

🏗️BulkProductResourceFeedbackCreateUserErrorCode🔄 Modified
Enum value added: NOT_FOUND
🏗️CashCountActivity🔄 Modified
Field added: note

A note associated with the activity.

Field added: reasonCode

The reason code for the activity.

🏗️Channel🔄 Modified
🔄 Field modified: resourceFeedback
🏗️DelegateAccessToken🔄 Modified
Field added: expiresIn

The number of seconds until the delegate access token expires.

🏗️DiscountAutomaticApp🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountAutomaticBasic🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountAutomaticBxgy🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountAutomaticFreeShipping🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountCodeApp🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountCodeBasic🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountCodeBxgy🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountCodeFreeShipping🔄 Modified
Field added: tags

A list of searchable keywords that are associated with the discount.
For example, a merchant might apply the loyalty tag to discounts
that are associated with their loyalty program.

🏗️DiscountErrorCode🔄 Modified
Enum value added: INVALID_TAG_LENGTH
Enum value added: TOO_MANY_TAGS
🏗️ShopResourceFeedbackCreatePayload🔄 Modified
🔄 Field modified: feedback