Intents API
The Intents API launches Shopify's native admin interfaces for creating and editing resources. When your extension calls an intent, merchants complete their changes using the standard Shopify admin UI, and your app receives the result. This means you don't need to build custom forms.
Use this API to build workflows like adding products to collections, creating multiple related resources in a sequence (like a product, collection, and discount for a promotion), opening specific resources for editing, or launching discount creation with pre-selected types.
Anchor to Use casesUse cases
- Resource creation: Invoke admin workflows to create products, collections, discounts, or other Shopify resources.
- Resource editing: Open existing Shopify resources for editing using their admin workflows.
- Workflow completion: Await the result of an intent to determine whether the merchant completed or cancelled the operation.
- Admin consistency: Use native Shopify admin workflows instead of building custom forms for resource management.
Anchor to invoke methodinvoke method
The invoke method launches a Shopify admin workflow for creating or editing resources. The method returns a promise that resolves to an activity handle you can await to get the workflow result.
The method accepts either:
- String query:
${action}:${type},${value}with optional second parameter () - Object: Properties for
action,type,value, anddata
IntentQueryOptions parameters
Optional parameters for the invoke method when using the string query format:
value(string): The resource identifier for edit operations (for example,). Required when editing existing resources. Omit for create operations.data({ [key: string]: unknown }): Additional context required by specific resource types. For example, discounts require a type, variants require a product ID, and metaobjects require a definition type.
Supported resources
The following tables show which resource types you can create or edit, and what values you need to pass for value and data for each operation.
Article
Articles are blog posts published on the Online Store. Use this to create or edit articles for merchant blogs.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Catalog
Catalogs are product groupings that organize products for different markets or channels. Use this to create or edit catalogs for B2B or multi-market selling.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Collection
Collections are groups of products organized manually or by automated rules. Use this to create or edit product collections.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Customer
Customers are profiles with contact information, order history, and metadata. Use this to create or edit customer accounts.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Delivery profile
Delivery profiles define shipping rates and rules for products across locations and zones. Use this to create or edit shipping configurations for different product groups.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Discount
Discounts are price reductions applied to products, orders, or shipping. Use this to create or edit discount codes and automatic discounts. Creating discounts requires specifying a discount type.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | { type: 'amount-off-product' | 'amount-off-order' | 'buy-x-get-y' | 'free-shipping' } |
edit | | | — |
Location
Locations are physical or virtual places where merchants store inventory and fulfill orders. Use this to create or edit locations for managing stock and fulfillment.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Market
Markets are geographic regions with customized pricing, languages, and domains. Use this to create or edit markets for international selling.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Menu
Menus are navigation structures for the Online Store. Use this to create or edit menu structures and links.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Metafield definition
Metafield definitions are schemas that define custom data fields for resources. Use this to create or edit metafield definitions that merchants can use to add structured data to products, customers, and other resources.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | |
edit | | | |
Metaobject
Metaobjects are custom structured data entries based on metaobject definitions. Use this to create or edit metaobject instances that store complex custom data. Requires a definition type.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | { type: 'shopify--color-pattern' } |
edit | | | { type: 'shopify--color-pattern' } |
Metaobject definition
Metaobject definitions are schemas that define the structure for metaobjects. Use this to create or edit metaobject definitions that determine the fields and data types for custom structured data.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | — | |
Page
Pages are static content pages for the Online Store. Use this to create or edit pages like About Us, Contact, or custom informational pages.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Product
Products are items sold in the store with pricing, inventory, and variants. Use this to create or edit products.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | — |
edit | | | — |
Product variant
Product variants are specific combinations of product options like size and color. Use this to create or edit product variants. Creating variants requires a parent product ID.
| Action | Type | Value | Data |
|---|---|---|---|
create | | — | |
edit | | | |
Note: When editing products with variants, query the <a href="/docs/api/admin-graphql/latest/objects/Product#field-Product.fields.hasOnlyDefaultVariant"><code><span class="PreventFireFoxApplyingGapToWBR">product.has<wbr/>Only<wbr/>Default<wbr/>Variant</span></code></a> field first. If <code>true</code>, then use the <code><span class="PreventFireFoxApplyingGapToWBR">shopify<wbr/>/Product</span></code> edit intent. If <code>false</code>, then use the <code><span class="PreventFireFoxApplyingGapToWBR">shopify<wbr/>/Product<wbr/>Variant</span></code> edit intent for specific variants.
Settings
Settings are the configuration options for the store. Use this to invoke and edit settings.
| Action | Type | Value | Data |
|---|---|---|---|
edit | | — | — |
edit | | — | — |
edit | | — | — |
edit | | — | — |
edit | | — | — |
edit | | — | — |
edit | | — | — |
edit | | — | — |
edit | | — | — |
- Anchor to invokeinvokeinvoke{ (query: IntentQuery): Promise<IntentActivity>; (intentURL: string, options?: IntentQueryOptions): Promise<IntentActivity>; }{ (query: IntentQuery): Promise<IntentActivity>; (intentURL: string, options?: IntentQueryOptions): Promise<IntentActivity>; }
Invoke an intent using the object syntax.
Invoke an intent using the URL syntax.
URL format:
action:type[,value][?params].- Anchor to responseresponseresponseIntentResponseApiIntentResponseApi
If in an intent workflow, provides mechanisms to resolve the intent with a given response.
IntentQuery
- action
IntentAction - data
Additional data required for certain intent types. For example: - Discount creation requires { type: 'amount-off-product' | 'amount-off-order' | 'buy-x-get-y' | 'free-shipping' } - ProductVariant creation requires { productId: 'gid://shopify/Product/123' } - Metaobject creation requires { type: 'shopify--color-pattern' }
{ [key: string]: unknown; } - type
IntentType - value
The resource identifier for edit actions (e.g., 'gid://shopify/Product/123').
string
IntentAction
Supported actions that can be performed on resources. - `create`: Opens a creation workflow for a new resource - `edit`: Opens an editing workflow for an existing resource (requires `value` parameter)
'create' | 'edit'IntentType
Supported resource types that can be targeted by intents.
'shopify/Article' | 'shopify/Catalog' | 'shopify/Collection' | 'shopify/Customer' | 'shopify/Discount' | 'shopify/Market' | 'shopify/Menu' | 'shopify/MetafieldDefinition' | 'shopify/Metaobject' | 'shopify/MetaobjectDefinition' | 'shopify/Page' | 'shopify/Product' | 'shopify/ProductVariant'IntentActivity
Activity handle for tracking intent workflow progress.
- complete
A Promise that resolves when the intent workflow completes, returning the response.
Promise<IntentResponse>
IntentResponse
Response object returned when the intent workflow completes.
ClosedIntentResponse | SuccessIntentResponse | ErrorIntentResponseClosedIntentResponse
User dismissed or closed the workflow without completing it.
- code
'closed'
SuccessIntentResponse
Successful intent completion.
- code
'ok' - data
{ [key: string]: unknown; }
ErrorIntentResponse
Failed intent completion.
- code
'error' - issues
Issue[] - message
string
IntentQueryOptions
Options for invoking intents when using the query string format.
- data
Additional data required for certain intent types. For example: - Discount creation requires { type: 'amount-off-product' | 'amount-off-order' | 'buy-x-get-y' | 'free-shipping' } - ProductVariant creation requires { productId: 'gid://shopify/Product/123' } - Metaobject creation requires { type: 'shopify--color-pattern' }
{ [key: string]: unknown; } - value
The resource identifier for edit actions (e.g., 'gid://shopify/Product/123').
string
IntentResponseApi
- closed
If in an intent workflow, resolves the intent with a closed response.
() => Promise<void> - error
If in an intent workflow, resolves the intent with an error response and the provided message and issues, if any.
(message: string, issues?: Issue[]) => Promise<void> - ok
If in an intent workflow, resolves the intent with a success response and the provided data, if any.
(data?: { [key: string]: unknown; }) => Promise<void>
Anchor to IntentResponseIntent Response
The result returned when an intent workflow completes. Check the code property to determine the outcome:
'ok': The merchant completed the workflow successfully.'error': The workflow failed due to validation or other errors.'closed': The merchant cancelled without completing.
ClosedIntentResponse | SuccessIntentResponse | ErrorIntentResponseClosedIntentResponse | SuccessIntentResponse | ErrorIntentResponseClosedIntentResponse
- Anchor to codecodecode'closed''closed'
ErrorIntentResponse
- Anchor to codecodecode'error''error'
- Anchor to issuesissuesissuesIssue[]Issue[]
- Anchor to messagemessagemessagestringstring
SuccessIntentResponse
- Anchor to codecodecode'ok''ok'
- Anchor to datadatadata{ [key: string]: unknown; }{ [key: string]: unknown; }
Anchor to requestrequest
When your app is opened through an app intent (for example, via an admin.app.intent.link target), the platform delivers the incoming intent to your embedded app in two complementary ways:
shopify.intents.request: A subscribable that exposes the current intent request to your app. Read the current request synchronously fromshopify.intents.request.value. When your app isn't running inside an intent workflow, the value isnull. Useshopify.intents.request.subscribe(callback)to react to changes if the host updates the current intent without reloading the iframe (for example, when a single-page app navigates between intent targets).?intent=<URL-encoded JSON>: On the initial page load, the same payload is appended to your app's URL as a singleintentquery parameter. Read it from the incoming request URL when server-side rendering (for example, in a Remix loader or Next.jsgetServerSideProps), or fromwindow.locationin client-side code before App Bridge is ready.
Both paths expose the same action, type, value, and data fields. The exact contents of data differ slightly between the two paths. See the data row of the table for details.
| Field | Type | Description |
|---|---|---|
action | string | The operation the merchant is performing (for example, 'create' or 'edit'). |
type | string | The intent type declared under [[extensions.targeting.intents]] in your extension's shopify.extension.toml. See Register your extension as an intent. For example, application/email. |
value | unknown | The primary resource identifier when present. The exact shape is defined by your intent schema's value field; for an application/email intent that might be a campaign ID like '42'. Optional. |
data | { [key: string]: unknown } | Additional input fields defined by your intent's schema. From shopify.intents.request.value: the raw data from the original invocation, with no merging.From the URL intent= JSON: the same data, additionally merged with any input-schema fields whose mapTo is 'form_data' (or the schema default). Fields declared with mapTo: 'query_param' arrive as separate query parameters on the launch URL (not inside the intent= JSON); fields with mapTo: 'param' land in the URL path. Optional. |
Note: Read the intent payload once on load and store it in your app's state, or subscribe to it if your app stays mounted across intent transitions. The request tells you what to render. The merchant then completes the workflow in your UI, and you report the result through
shopify.intents.response.The URL
intent=JSON may include additional internal fields beyond the four documented above. Those are runtime-only and not part of the public contract; treat them as Shopify-internal and don't rely on them in your app.
Anchor to response methodsresponse methods
The response methods resolve an app intent from inside the extension that's handling it. When your extension implements an app intent (for example, through an admin.app.intent.link target), call one of these methods to return control to the invoker with the appropriate outcome.
ok(data?): Resolves the intent with a success response. The optionaldataobject is returned to the invoker asresponse.data.error(message, issues?): Resolves the intent with an error response. Themessagedescribes the failure, andissuesis an optional array of Standard Schema validation issues.closed(): Resolves the intent as closed, indicating the merchant cancelled the workflow without completing it.
Each method returns a promise that resolves once the response has been delivered.
- Anchor to closedclosedclosed() => Promise<void>() => Promise<void>requiredrequired
If in an intent workflow, resolves the intent with a closed response.
- Anchor to errorerrorerror(message: string, issues?: Issue[]) => Promise<void>(message: string, issues?: Issue[]) => Promise<void>requiredrequired
If in an intent workflow, resolves the intent with an error response and the provided message and issues, if any.
- Anchor to okokok(data?: { [key: string]: unknown; }) => Promise<void>(data?: { [key: string]: unknown; }) => Promise<void>requiredrequired
If in an intent workflow, resolves the intent with a success response and the provided data, if any.