Expanded discount filters, actor arg for subscription mutations, metaobject upsert

5/9/2026, 12:00:28 AM

The discountNodes query now supports a richer filter set—context, customerIds, marketIds and segmentIds—allowing tighter scoping of discount discovery. The metaobjectUpsert mutation gains a new JSON values input; it can replace the entire metaobject while the metaobject input remains optional, and the description clarifies the exclusive use of each. All subscription‑contract related mutations now accept an additional actor enum argument that records whether the shop owner, employee or app initiated the action. AnalyticsTarget changes include a CurrencyCode enum for currencyCode and a nullable presentmentExpectedValue that is only returned for money metrics. BillingPlanFeature now exposes a requiresShopifyPayments boolean indicating whether a feature mandates Shopify Payments. The Market type now includes discounts and discountsCount, while ProductVariant gains a suite of publication‑related fields; deprecated older publication flags are marked and new status indicators are introduced.

Query Changes

🔄 Modified Queries (7)

analyticsTargets

Returns a paginated list of analytics targets
for the shop. Each target represents a merchant-defined goal for a specific metric over a date range.

Results can be filtered by metric, name, date range, or filter expression, and sorted by fields
such as start_date, expected_value, or metric.

Use the analyticsTargetCreate
mutation to add new targets.

~ 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
shopPayPaymentRequestReceipt

Returns a single Shop Pay payment request receipt by its ID. Payment request receipts document completed Shop Pay transactions, including the amount, customer details, and payment status. Use this to look up a specific Shop Pay transaction for order reconciliation or customer support.

shopPayPaymentRequestReceipts

Returns a paginated list of Shop Pay payment request receipts for the shop. Each receipt documents a completed Shop Pay transaction. Use this to review Shop Pay transaction history, generate reports, or audit Shop Pay payment activity.

subscriptionGateway

Returns the payment gateway currently used for subscription charges on the shop. Subscription orders may use a dedicated gateway separate from the shop's primary payment provider.

subscriptionMigrationGateways

Returns the list of payment gateways available for subscription contract migrations, allowing merchants to move existing subscriptions from one payment gateway to another.

Mutation Changes

🔄 Modified Mutations (18)

inventoryTransferRemoveItems

This mutation removes InventoryTransferLineItems,
or portions of them, from a DRAFT or READY_TO_SHIP Transfer.

For each referenced line item, if its entire quantity is still unallocated to a
shipment, the line item is removed; otherwise the line item remains on the
transfer with its quantity reduced to the allocated portion. Quantity allocated
to a shipment (whether the shipment is in draft, in transit, or already
received) is preserved.

On READY_TO_SHIP transfers, removing items also returns the affected reserved
quantity to available inventory at the origin location.

To change the quantity of a line item without removing it, use
inventoryTransferSetItems.

inventoryTransferSetItems

This mutation sets the quantity for one or more line items on a Transfer.

Only the items you include in the lineItems field are updated. Items already on
the transfer but not referenced in your update will stay unchanged. Each inventory
item may appear at most once in lineItems; duplicate inventoryItemId entries
are rejected.

For each entry in lineItems:

  • If the inventory item isn't yet on the transfer, a new line item is added with
    the provided quantity.
  • If the inventory item is already on the transfer, the provided quantity
    replaces the line item's processableQuantity.
    Any quantity outside the processable portion (for example, already shipped or
    picked for shipment) is preserved, so the resulting total quantity equals the
    preserved portion plus the provided quantity.

Passing a quantity of 0 is only allowed for transfers in DRAFT status; on
READY_TO_SHIP or IN_PROGRESS transfers it returns an INVALID_QUANTITY error.
On DRAFT transfers, quantity: 0 leaves a zero-quantity line item on the
transfer; it does not remove the item. To remove a line item from a transfer, use
inventoryTransferRemoveItems.

Caution:
As of 2026-01, this mutation supports an optional idempotency key using the @idempotent directive.
As of 2026-04, the idempotency key is required and must be provided using the @idempotent directive.
For more information, see the idempotency documentation.

metaobjectUpsert

Creates or updates a Metaobject based on its handle. If a metaobject with the specified handle exists, the mutation updates it with the provided field values. If no matching metaobject exists, the mutation creates a new one.

The handle serves as a unique identifier within a metaobject type. Field values map to the MetaobjectDefinition's field keys and overwrite existing values during updates.

~ Modified argument: metaobject
+ New argument: values
orderEditAddVariant

Adds a ProductVariant as a line item to an Order that's being edited. The mutation respects the variant's contextual pricing.

You can specify a Location to check for inventory availability and control whether duplicate variants are allowed. The quantity must be a positive value.

Learn more about editing existing orders.

~ Modified argument: locationId
orderRiskAssessmentCreate

Creates a fraud risk assessment for a specific order, evaluating the likelihood that the order is fraudulent based on various risk signals. Use this to trigger risk analysis on orders that need manual review or to integrate custom risk scoring into order processing workflows.

paymentCustomizationActivation

Activates or deactivates payment customizations for the shop. Payment customizations allow apps to hide, reorder, or rename payment methods at checkout based on cart contents, customer attributes, or other conditions. Use this to toggle customizations on or off without deleting them.

paymentCustomizationCreate

Creates a new payment customization for the shop. Payment customizations let apps modify the payment methods shown at checkout — hiding, reordering, or renaming options based on cart contents, customer attributes, or other business logic.

paymentCustomizationDelete

Permanently deletes a payment customization. Once deleted, the customization will no longer affect which payment methods appear at checkout.

paymentCustomizationUpdate

Updates an existing payment customization, modifying its configuration for how payment methods are displayed at checkout. Use this to change the customization's title or enabled state. The customization's function can't be changed once set; create a new payment customization to use a different function.

returnCreate

Creates a return from an existing order that has at least one fulfilled
line item
that hasn't yet been refunded. If you create a return on an archived order, then the order is automatically
unarchived.

Use the returnCreate mutation when your workflow involves
approving or
declining requested returns
outside of the Shopify platform.

The returnCreate mutation performs the following actions:

  • Creates a return in the OPEN state, and assumes that the return request from the customer has already been
    approved
  • Creates a reverse fulfillment order,
    and enables you to create a reverse delivery
    for the reverse fulfillment order

After you've created a return, use the
return query to retrieve the
return by its ID. Learn more about providing a
return management workflow
for merchants.

subscriptionBillingCycleContractEdit

Edit the contents of a subscription contract for the specified billing cycle.

+ New argument: actor
subscriptionContractActivate

Activates a Subscription Contract. Contract status must be either active, paused, or failed.

+ New argument: actor
subscriptionContractCancel

Cancels a Subscription Contract.

+ New argument: actor
subscriptionContractExpire

Expires a Subscription Contract.

+ New argument: actor
subscriptionContractFail

Fails a Subscription Contract.

+ New argument: actor
subscriptionContractPause

Pauses a Subscription Contract.

+ New argument: actor
subscriptionContractProductChange

Allows for the easy change of a Product in a Contract or a Product price change.

+ New argument: actor
subscriptionContractUpdate

Creates a draft of an existing SubscriptionContract. The draft captures the current state of the contract and allows incremental modifications through draft mutations such as subscriptionDraftLineAdd, subscriptionDraftDiscountAdd, and subscriptionDraftUpdate.

Changes remain in draft state and don't affect the live contract until committed. After you've made all necessary changes to the draft, commit it using subscriptionDraftCommit to apply the updates to the original contract.

Learn more about updating subscription contracts.

+ New argument: actor

Type Changes

➕ Added Types (3)

🏗️DiscountCustomerSelectionUnknown➕ AddedOBJECT

An unrecognized customer selection type. Use the context field on the parent discount type instead.

Fields: customerSelectionType
🏗️DiscountMarkets➕ AddedOBJECT

Markets where the discount is available.

Fields: markets, marketsCount
📥DiscountMarketsInput➕ AddedINPUT_OBJECT

The input fields for the markets where the discount is available.

🔄 Modified Types (10)

🏗️AnalyticsTarget🔄 Modified
🔄 Field modified: currencyCode
🔄 Field modified: presentmentExpectedValue
🏗️BillingPlanFeature🔄 Modified
Field added: requiresShopifyPayments

Whether the feature requires Shopify Payments to be enabled.

🏗️DiscountCombinesWith🔄 Modified
🔄 Field modified: productDiscountsWithTagsOnSameCartLine
🏗️Market🔄 Modified
Field added: discounts

The discounts that are available in this market.

Field added: discountsCount

The number of discounts that are assigned to this market.

🏗️MarketUserErrorCode🔄 Modified
Enum value added: DISCOUNT_NOT_MARKET_CONTEXTUAL
Enum value added: DISCOUNT_EXCEEDS_MARKET_LIMIT
Enum value added: DISCOUNT_NOT_COMPATIBLE_WITH_B2B_MARKET
🏗️Metafield🔄 Modified
Field added: sizeInBytes

The size of the metafield value in bytes.

🏗️Metaobject🔄 Modified
Field added: values

The values of the metaobject.

🏗️ProductVariant🔄 Modified
Field added: availablePublicationsCount

The number of
publications
that a resource is published to, without
feedback errors.

Field added: publicationCount

The number of
publications
that a resource is published to, without
feedback errors.

Field added: publishedOnChannel

Whether the resource is published to a specific channel.

Field added: publishedOnCurrentChannel

Whether the resource is published to a
channel.
For example, the resource might be published to the online store channel.

Field added: publishedOnCurrentPublication

Whether the resource is published to the app's
publication.
For example, the resource might be published to the app's online store channel.

Field added: publishedOnPublication

Whether the resource is published to a specified
publication.

Field added: resourcePublications

The list of resources that are published to a
publication.

Field added: resourcePublicationsCount

The number of
publications
that a resource is published to, without
feedback errors.

Field added: resourcePublicationsV2

The list of resources that are either published or staged to be published to a
publication.

Field added: unpublishedChannels

The list of channels that the resource is not published to.

Field added: unpublishedPublications

The list of publications
that the resource isn't published to.

🏗️PublicationUserErrorCode🔄 Modified
Enum value added: CANNOT_COMBINE_PRODUCTS_AND_VARIANTS
Enum value added: VARIANTS_BELONG_TO_MULTIPLE_PRODUCTS
Enum value added: PRODUCT_LOCK_ERROR
Enum value added: VARIANT_PUBLISHING_UNSUPPORTED_PRODUCT_TYPE
🏗️ShopifyqlQueryResponse🔄 Modified
🔄 Field modified: analyticsTargets