Shopify Connector
Description
Shopify is a multinational e-commerce company. They offer a subscription-based software that allows anyone to set up an online store and sell their products. This component allows managing the products and customers connected to a Shopify account.
API Documentation
This component was built using the Shopify GraphQL Admin API Reference.
Example Shopify Integration
An example Shopify integration is available in the GitHub examples repository. Import the integration definition to try it out.
The example integration consists of four flows that demonstrate how to interact with the Shopify API:
-
Initial Product Sync runs when an instance of the integration is deployed. It loops over Shopify's paginated API, fetching pages of products and sending all products to an "Acme API" (replace with the desired API endpoint).
-
Product Update Listener subscribes to
product/create,product/updateandproduct/deleteevents from Shopify. When a product is created, updated, or deleted in Shopify, the integration receives a webhook request from Shopify and sends the create, update, or delete to the "Acme API". -
List Inventory Levels fetches inventory levels for all products in Shopify at a particular location specified as part of the deployment process. The flow is triggered synchronously, so the caller receives a response with a JSON body containing the inventory levels.
-
Create New Product is a flow that creates a new product in Shopify. To invoke the flow, send a POST request to the flow's webhook endpoint with a format that looks like this:
{"name": "Green T-Shirt","description": "A green t-shirt","product_type": "T-Shirt","vendor": "Acme"}
Connections
Access Token
key: adminApiAccessTokenAn admin API access token from an admin-created custom app can be used for testing purposes during integration development.
Admin API access tokens are recommended for testing only. For production integrations, use OAuth 2.0 to allow users to authenticate with their own credentials.
Shopify stopped allowing new admin-created custom apps on January 1, 2026. The Develop apps flow in a store's settings can no longer create one. Existing admin-created custom apps are unaffected and their tokens continue to work.
To create a new app, use the Dev Dashboard or the Shopify CLI and authenticate with the OAuth 2.0 connection instead.
Prerequisites
- A Shopify store with an existing admin-created custom app (for testing purposes)
- A staff or collaborator account with the Develop apps permission
Setup Steps
To copy the admin API access token from an existing custom app:
- Log in to the Shopify admin dashboard.
- Navigate to Apps > Develop apps.
- Click the name of the app.
- Navigate to the API credentials tab.
- Copy the Admin API access token.
The token is shown only once, when it is generated, so it may no longer be retrievable. Shopify does not support rotating the token in place: generating a new one means uninstalling and reinstalling the app from the Shopify admin, which keeps the app itself intact but disrupts its requests and webhooks until the new token is entered here.
The token will have a format similar to shpat_00000000000000000000000000000000.
Refer to Shopify's admin-created custom apps documentation for more information.
Configure the Connection
Create a connection of type Access Token and configure the following fields:
- Enter the Admin API Access Token into the connection configuration.
- Enter the Host (the Shopify domain without
https://, e.g.,example-store.myshopify.com). - Optionally set the API Version. It defaults to the version this component ships with, currently
2026-07. Refer to Shopify API versioning for the versions Shopify currently accepts and how long each remains available.
Admin API access tokens are tied to admin-created custom apps and recommended for testing only. For production integrations, OAuth 2.0 authentication provides a better user experience and allows users to authenticate with their own credentials.
| Input | Notes | Example |
|---|---|---|
| Admin API Access Token | Generate from the 'API credentials' tab of an admin-created custom app. Learn more at Shopify admin-created custom apps. | shpat_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
| API Version | Shopify API version to use. See Shopify API versioning for available versions. | 2026-07 |
| Host | The domain of the Shopify store without https:// (e.g., my-store.myshopify.com). | my-store.myshopify.com |
OAuth 2.0 (Deprecated)
key: oauth2| Input | Notes | Example |
|---|---|---|
| API Version | Shopify API version to use. See Shopify API versioning for available versions. | 2026-07 |
| Authorize URL | The OAuth 2.0 Authorization URL for Shopify. | https://YOUR-SHOPIFY-DOMAIN.myshopify.com/admin/oauth/authorize |
| Client ID (API Key) | The Client ID (also called API Key) from the Shopify app credentials. | a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
| Client Secret (API Secret) | The Client Secret (also called API Secret) from the Shopify app credentials. | shpss_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
| Host | The domain of the Shopify store without https:// (e.g., my-store.myshopify.com). | my-store.myshopify.com |
| Scopes | Space-separated list of OAuth permission scopes. See Shopify access scopes for all available scopes. | read_customers read_draft_orders read_fulfillments read_orders |
| Token URL | The OAuth 2.0 Token URL for Shopify. | https://YOUR-SHOPIFY-DOMAIN.myshopify.com/admin/oauth/access_token?expiring=1 |
OAuth 2.0
key: oauth2-dynamic-inputsShopify uses OAuth 2.0 for app authentication. This connection type simplifies configuration by using a single Shop Name input to automatically construct the authorization and token URLs.
Prerequisites
- A Shopify Partners account
- Access to the Dev Dashboard or Shopify CLI for app creation
- A development store for testing
As of January 1, 2026, merchants can no longer create new legacy custom apps. Existing apps are not affected. Partners can still create new custom apps and transfer stores to merchants, but once transferred, new custom app creation is disabled on the store. Use the Partner Dashboard or Shopify CLI to create apps going forward.
Creating a Shopify App
Choose one of the following methods to create a Shopify app.
Create App from Dev Dashboard
For backend-focused apps (API utilities, webhook handlers, sync jobs), create an app directly through the Dev Dashboard without scaffolding code.
-
Log in to the Dev Dashboard, or navigate from the Partner Dashboard via App Distribution > Visit Dev Dashboard.
-
Click Create app.
-
Select Create app manually and provide an app name.
-
Navigate to the Configuration section of the created app.
-
Under App URL, enter a valid URL (this is required but can be a placeholder).
-
Under Allowed redirection URL(s), enter:
https://oauth2.prismatic.io/callback -
Click Save.
Refer to the Dev Dashboard documentation for more details.
Create App with Shopify CLI
The Shopify CLI scaffolds a complete app project with best practices built in. This method is suitable for apps that need embedded UI, checkout extensions, or full-stack capabilities.
- Install the Shopify CLI if not already installed.
- Navigate to the desired project directory and run:
shopify app init
- When prompted, provide an app name and select a template (the React Router template is recommended for most use cases).
- Navigate to the new app directory and start the development server:
cd my-new-appshopify app dev
- The CLI prompts for login to a developer account, creates the app in the Dev Dashboard, and establishes a connection to a dev store.
- Once the dev server is running, press
pto open the preview URL and install the app on the dev store.
Refer to Shopify's scaffold app documentation for detailed instructions.
Retrieve App Credentials
Regardless of the creation method, retrieve the OAuth credentials:
- Open the app in the Dev Dashboard.
- Navigate to the Configuration section.
- Scroll to the Client credentials section.
- Copy the Client ID (labeled as API key in Shopify).
- Copy the Client secret (labeled as API secret key in Shopify).
Configure the Connection
Create a connection of type OAuth 2.0 and configure the following fields:
- Client ID (API Key): Enter the Client ID copied from the Shopify app credentials (Shopify labels this as "API key").
- Client Secret (API Secret): Enter the Client secret copied from the Shopify app credentials (Shopify labels this as "API secret key").
- Shop Name: Enter the Shopify domain without
.myshopify.com(e.g.,example-store). - Scopes: Configure based on the required permissions. Default scopes include:
Refer to Shopify's access scopes documentation for a complete list of available scopes.read_customers read_draft_orders read_fulfillments read_inventoryread_orders read_products read_locations write_customerswrite_draft_orders write_fulfillments write_inventorywrite_orders write_products write_locations
- API Version (optional): Specify the Shopify API version to use. Defaults to the version this component ships with, currently
2026-07. Shopify keeps each version available for at least 12 months, so refer to Shopify API versioning for the versions it currently accepts and how long each remains available.
Save the integration to connect and authenticate to Shopify.
The Shop Name should be the subdomain portion of the Shopify store URL. For example, if the store URL is example-store.myshopify.com, enter example-store as the Shop Name.
App Distribution
Shopify vets all apps intended for distribution to multiple merchants through a formal App Store review to ensure quality and security standards. The distribution type (custom or public) is chosen at app creation and is permanent. Understanding the difference upfront avoids having to rebuild the app later.
Shopify app distribution determines which merchants can install the app and is a permanent, non-reversible choice.
Custom apps are installed on a single Shopify store, on multiple stores belonging to the same Plus organization, or on transfer-disabled development stores. They do not appear in the Shopify App Store and cannot be installed by other merchants, which makes them the appropriate choice for single-merchant integrations. New custom apps are created through the Dev Dashboard or the Shopify CLI; the older path of creating one directly in a merchant's Shopify admin was closed on January 1, 2026.
Public apps are created through the Shopify Partners program and can be distributed to multiple merchants. Public apps must be submitted for review and listed in the Shopify App Store before other merchants can install them.
Shopify offers no option to distribute an app to many merchants without an App Store listing. For multi-merchant distribution, create a public app and submit it for App Store review.
For information on the App Store review process, refer to Shopify's app distribution documentation.
| Input | Notes | Example |
|---|---|---|
| API Version | Shopify API version to use. See Shopify API versioning for available versions. | 2026-07 |
| Authorize URL | The OAuth 2.0 Authorization URL for Shopify. | https://{{#domain}}.myshopify.com/admin/oauth/authorize/ |
| Client ID (API Key) | The Client ID (also called API Key) from the Shopify app credentials. | a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
| Client Secret (API Secret) | The Client Secret (also called API Secret) from the Shopify app credentials. | shpss_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
| Shop Name | The Shopify shop name without the .myshopify.com suffix (e.g., my-store). | my-store |
| Host | The domain of the Shopify store without the https:// prefix. | {{#domain}}.myshopify.com |
| Scopes | Space-separated list of OAuth permission scopes. See Shopify access scopes for all available scopes. | read_customers read_draft_orders read_fulfillments read_orders |
| Token URL | The OAuth 2.0 Token URL for Shopify. | https://{{#domain}}.myshopify.com/admin/oauth/access_token?expiring=1 |
Triggers
Event Topic Subscription
Receive event notifications from Shopify. Automatically creates and manages a webhook subscription for selected event topics when the instance is deployed, and removes the subscription when the instance is deleted. | key: eventTopicWebhookGql
| Input | Notes | Example |
|---|---|---|
| Secret Key | The Shopify app's client secret, viewable from the Partner Dashboard. | |
| Connection | The Shopify connection to use. | |
| Webhook Topic | The topic for the webhook. This is the event that will trigger the webhook. | APP_PURCHASES_ONE_TIME_UPDATE |
The Event Topic Webhook trigger manages Shopify webhook subscriptions for an instance. Unlike manual webhook configuration, this trigger handles the entire webhook lifecycle automatically using the Shopify GraphQL API.
When the trigger is used in a flow:
- On Instance Deploy: The trigger automatically creates webhook subscriptions in the Shopify store for the selected event topics (customer creation, order updates, product changes, etc.). The webhook callback URL is set to the instance's unique webhook URL. If subscriptions for the same topics and URL already exist, they are reused to prevent duplication.
- On Instance Deletion: The trigger automatically removes webhook subscriptions from the Shopify store that match the instance's webhook URL. This ensures no orphaned webhook configurations remain after instance cleanup.
Configuration Requirements
This trigger requires:
- Connection: A Shopify connection with appropriate API access permissions
- Secret Key: The Shopify app's client secret for HMAC signature verification, viewable from the app's Configuration section in the Shopify Partner Dashboard
- Webhook Topics: One or more event types to subscribe to (see Event Topics below)
Signature Verification
The trigger includes built-in HMAC-SHA256 signature verification to ensure webhook requests are authentic. When a webhook is received:
- The trigger extracts the
X-Shopify-Hmac-SHA256header from the request - Computes the expected signature using the configured Secret Key
- Compares the computed signature with the received signature
- Rejects requests with mismatched signatures
The signature is computed over the raw request body, base64-encoded:
const crypto = require("node:crypto");
const signature = crypto
.createHmac("sha256", secretKey) // the app's client secret
.update(rawRequestBody, "utf8") // the raw body, before JSON parsing
.digest("base64"); // Shopify sends base64, not hex
The computed value is compared against the header using a constant-time comparison, so a mismatch takes the same time to detect regardless of where the two values first differ.
The trigger automatically returns a 200 OK response with the parsed JSON body for verified webhooks.
Event Topics Configuration
Select which Shopify events should trigger the flow.
Available Event Topics (67)
Customer Events:
CUSTOMERS_CREATE,CUSTOMERS_UPDATE,CUSTOMERS_DELETECUSTOMERS_ENABLE,CUSTOMERS_DISABLE,CUSTOMERS_MERGECUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE,CUSTOMERS_MARKETING_CONSENT_UPDATE
Order Events:
ORDERS_CREATE,ORDERS_UPDATED,ORDERS_DELETE,ORDERS_CANCELLEDORDERS_FULFILLED,ORDERS_PARTIALLY_FULFILLED,ORDERS_PAID,ORDERS_EDITEDORDERS_RISK_ASSESSMENT_CHANGED,ORDERS_SHOPIFY_PROTECT_ELIGIBILITY_CHANGED
Product Events:
PRODUCTS_CREATE,PRODUCTS_UPDATE,PRODUCTS_DELETEPRODUCT_LISTINGS_ADD,PRODUCT_LISTINGS_REMOVE,PRODUCT_LISTINGS_UPDATEPRODUCT_PUBLICATIONS_CREATE,PRODUCT_PUBLICATIONS_UPDATE,PRODUCT_PUBLICATIONS_DELETE
Fulfillment Events:
FULFILLMENTS_CREATE,FULFILLMENTS_UPDATEFULFILLMENT_ORDERS_CANCELLED,FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_ACCEPTEDFULFILLMENT_ORDERS_FULFILLMENT_REQUEST_REJECTED,FULFILLMENT_ORDERS_HOLD_RELEASED
Inventory Events:
INVENTORY_ITEMS_CREATE,INVENTORY_ITEMS_UPDATE,INVENTORY_ITEMS_DELETEINVENTORY_LEVELS_CONNECT,INVENTORY_LEVELS_DISCONNECT,INVENTORY_LEVELS_UPDATE
Collection Events:
COLLECTIONS_CREATE,COLLECTIONS_UPDATE,COLLECTIONS_DELETECOLLECTION_LISTINGS_ADD,COLLECTION_LISTINGS_REMOVE,COLLECTION_LISTINGS_UPDATE
Company Events (B2B):
COMPANIES_CREATE,COMPANIES_UPDATE,COMPANIES_DELETECOMPANY_CONTACTS_CREATE,COMPANY_CONTACTS_UPDATE,COMPANY_CONTACTS_DELETECOMPANY_LOCATIONS_CREATE,COMPANY_LOCATIONS_UPDATE,COMPANY_LOCATIONS_DELETE
Draft Order Events:
DRAFT_ORDERS_CREATE,DRAFT_ORDERS_UPDATE,DRAFT_ORDERS_DELETE
Other Events:
- App lifecycle:
APP_UNINSTALLED,APP_SUBSCRIPTIONS_UPDATE,APP_SCOPES_UPDATE - Cart:
CARTS_CREATE,CARTS_UPDATE - Checkout:
CHECKOUTS_CREATE,CHECKOUTS_UPDATE,CHECKOUTS_DELETE - Disputes:
DISPUTES_CREATE,DISPUTES_UPDATE - Refunds:
REFUNDS_CREATE - Shop:
SHOP_UPDATE - Themes:
THEMES_CREATE,THEMES_UPDATE,THEMES_DELETE,THEMES_PUBLISH - Subscriptions:
SUBSCRIPTION_CONTRACTS_CREATE,SUBSCRIPTION_CONTRACTS_UPDATE,SUBSCRIPTION_BILLING_ATTEMPTS_SUCCESS
A complete list of webhook topics and their payloads is available in the Shopify Webhook Topics documentation.
Webhook Payload Example
When a webhook is received, the trigger provides the parsed JSON body.
Example: CUSTOMERS_CREATE Event
{
"id": 5940139491234,
"email": "john.doe@example.com",
"created_at": "2024-11-10T10:30:00-05:00",
"updated_at": "2024-11-10T10:30:00-05:00",
"first_name": "John",
"last_name": "Doe",
"phone": "+18005555454",
"state": "enabled",
"tags": "VIP",
"note": null,
"verified_email": true,
"multipass_identifier": null,
"tax_exempt": false,
"accepts_marketing": true,
"addresses": [],
"admin_graphql_api_id": "gid://shopify/Customer/5940139491234"
}
New and Updated Customers
Retrieves existing and ongoing customer changes from Shopify. Load history once, check for changes on a schedule, or both. | key: customersPollingTrigger
| Input | Notes | Example |
|---|---|---|
| Look-back Date | The date the initial sync starts from, in YYYY-MM-DD format. Cannot be a future date. Leave empty to start from the first recurrence with no backfill. When set, the initial sync reports every record updated on or after this date. | 2026-01-01 |
| Connection | The Shopify connection to use. |
Retrieves existing and ongoing customer changes from a Shopify store. Load history once, check for changes on a schedule, or both.
How It Works
The trigger operates by:
- Running on the configured schedule (e.g., every 5 minutes)
- Querying the Shopify GraphQL API for customers whose
updated_atfalls inside the window this round covers, sorted byupdated_atso the filter and the sort key match - Categorizing customers as "created" or "updated" by comparing their
createdAttimestamp against the start of that window, which stays frozen for the whole window so one customer is classified the same way on every page - Reading a single page per round and remembering where that page ended, rather than holding an entire window in memory at once
- Advancing its committed position only once a window is fully drained, so an interrupted drain resumes instead of skipping what it had not reported yet
If more customers changed than one page holds, the trigger continues from where the page ended instead of dropping the rest. With batching enabled it drains the remaining pages inside the same recurrence; without batching it continues on each following scheduled recurrence.
The first recurrence
- Look-back Date empty: the trigger records the current time and reports nothing. Incremental polling begins on the next recurrence.
- Look-back Date set: the trigger begins a one-time initial sync covering every customer updated on or after that date, then hands off to incremental polling. An instance that already carries a committed position is never sent back through an initial sync, so setting the date on a running instance does not replay its history.
The initial sync seeds each customer exactly once. The window it covers is half-open, so a customer whose updated_at falls on the window's upper bound belongs to the next window rather than this one, and no customer is reported twice across the handoff. That upper bound is fixed at the moment the sync begins and does not move as the sync progresses, so a sync spanning several recurrences covers the range it started with rather than growing to follow the clock.
No field in the payload marks the handoff from the initial sync to incremental polling. A downstream step cannot distinguish a backfilled customer from one picked up by ordinary polling, and does not need to: the shape is identical in both phases.
Batching
Batching is enabled per flow on this trigger. Once enabled, each changed record is dispatched as its own execution, or grouped by the configured batch size. Batch size and the number of batches dispatched concurrently can both be overridden per instance. Raising concurrency increases the request volume sent to Shopify.
To turn it on, select the flow's trigger, open the Flow control tab, and switch on Enable Batching. Under Batch Size, keep Trigger default to use the size this trigger ships with, or choose Custom batch size to set a specific size. Batch Concurrency is optional; leave it blank to use the limit this trigger ships with, which dispatches one batch at a time.
Enabling batching changes the payload a downstream step receives. With batching off a step reads data.created and data.updated; with batching on those arrays do not exist and data is a single changeType/record item, or an array of them (see Returned Data). Any step reading the older shape must be updated before batching is turned on. Because batching is per flow, this affects only that flow, not the component or other flows using the same trigger.
Returned Data
Fields shown are representative. The full response object includes additional properties.
What arrives in data depends on whether batching is enabled on the flow.
Without batching, data is a single object holding the customers categorized by change type.
Example Payload: batching disabled
{
"data": {
"created": [
{
"id": "gid://shopify/Customer/5940139491234",
"displayName": "John Doe",
"email": "john.doe@example.com",
"phone": "+18005555454",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"state": "ENABLED",
"tags": ["VIP"]
}
],
"updated": [
{
"id": "gid://shopify/Customer/5940139491235",
"displayName": "Jane Smith",
"email": "jane.smith@example.com",
"phone": "+18005555455",
"createdAt": "2024-11-08T09:00:00Z",
"updatedAt": "2024-11-10T14:22:00Z",
"state": "ENABLED",
"tags": []
}
]
}
}
With batching enabled, data holds one slice of the batch instead of those two arrays. Every customer becomes its own item, shaped as changeType plus record. changeType is created or updated, and record is the polled customer.
With a batch size of 1, data is a single item.
Example Payload: batching enabled, batch size 1
{
"data": {
"changeType": "created",
"record": {
"id": "gid://shopify/Customer/5940139491234",
"displayName": "John Doe",
"email": "john.doe@example.com",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"state": "ENABLED"
}
}
}
With a batch size greater than 1, data is an array of those items.
Example Payload: batching enabled, batch size greater than 1
{
"data": [
{
"changeType": "created",
"record": {
"id": "gid://shopify/Customer/5940139491234",
"displayName": "John Doe",
"email": "john.doe@example.com",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"state": "ENABLED"
}
},
{
"changeType": "updated",
"record": {
"id": "gid://shopify/Customer/5940139491235",
"displayName": "Jane Smith",
"email": "jane.smith@example.com",
"createdAt": "2024-11-08T09:00:00Z",
"updatedAt": "2024-11-10T14:22:00Z",
"state": "ENABLED"
}
}
]
}
New and Updated Orders
Retrieves existing and ongoing order changes from Shopify. Load history once, check for changes on a schedule, or both. | key: ordersPollingTrigger
| Input | Notes | Example |
|---|---|---|
| Look-back Date | The date the initial sync starts from, in YYYY-MM-DD format. Cannot be a future date. Leave empty to start from the first recurrence with no backfill. When set, the initial sync reports every record updated on or after this date. | 2026-01-01 |
| Connection | The Shopify connection to use. |
Retrieves existing and ongoing order changes from a Shopify store. Load history once, check for changes on a schedule, or both.
How It Works
The trigger operates by:
- Running on the configured schedule (e.g., every 5 minutes)
- Querying the Shopify GraphQL API for orders whose
updated_atfalls inside the window this round covers, sorted byupdated_atso the filter and the sort key match - Categorizing orders as "created" or "updated" by comparing their
createdAttimestamp against the start of that window, which stays frozen for the whole window so one order is classified the same way on every page - Reading a single page per round and remembering where that page ended, rather than holding an entire window in memory at once
- Advancing its committed position only once a window is fully drained, so an interrupted drain resumes instead of skipping what it had not reported yet
If more orders changed than one page holds, the trigger continues from where the page ended instead of dropping the rest. With batching enabled it drains the remaining pages inside the same recurrence; without batching it continues on each following scheduled recurrence.
The first recurrence
- Look-back Date empty: the trigger records the current time and reports nothing. Incremental polling begins on the next recurrence.
- Look-back Date set: the trigger begins a one-time initial sync covering every order updated on or after that date, then hands off to incremental polling. An instance that already carries a committed position is never sent back through an initial sync, so setting the date on a running instance does not replay its history.
The initial sync seeds each order exactly once. The window it covers is half-open, so a order whose updated_at falls on the window's upper bound belongs to the next window rather than this one, and no order is reported twice across the handoff. That upper bound is fixed at the moment the sync begins and does not move as the sync progresses, so a sync spanning several recurrences covers the range it started with rather than growing to follow the clock.
No field in the payload marks the handoff from the initial sync to incremental polling. A downstream step cannot distinguish a backfilled order from one picked up by ordinary polling, and does not need to: the shape is identical in both phases.
Batching
Batching is enabled per flow on this trigger. Once enabled, each changed record is dispatched as its own execution, or grouped by the configured batch size. Batch size and the number of batches dispatched concurrently can both be overridden per instance. Raising concurrency increases the request volume sent to Shopify.
To turn it on, select the flow's trigger, open the Flow control tab, and switch on Enable Batching. Under Batch Size, keep Trigger default to use the size this trigger ships with, or choose Custom batch size to set a specific size. Batch Concurrency is optional; leave it blank to use the limit this trigger ships with, which dispatches one batch at a time.
Enabling batching changes the payload a downstream step receives. With batching off a step reads data.created and data.updated; with batching on those arrays do not exist and data is a single changeType/record item, or an array of them (see Returned Data). Any step reading the older shape must be updated before batching is turned on. Because batching is per flow, this affects only that flow, not the component or other flows using the same trigger.
Returned Data
Fields shown are representative. The full response object includes additional properties.
What arrives in data depends on whether batching is enabled on the flow.
Without batching, data is a single object holding the orders categorized by change type.
Example Payload: batching disabled
{
"data": {
"created": [
{
"id": "gid://shopify/Order/10079785100",
"name": "#1001",
"email": "customer@example.com",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"displayFinancialStatus": "PAID",
"displayFulfillmentStatus": "UNFULFILLED",
"totalPriceSet": {
"shopMoney": {
"amount": "199.99",
"currencyCode": "USD"
}
}
}
],
"updated": [
{
"id": "gid://shopify/Order/10079785101",
"name": "#1002",
"email": "customer2@example.com",
"createdAt": "2024-11-08T09:00:00Z",
"updatedAt": "2024-11-10T14:22:00Z",
"displayFinancialStatus": "PAID",
"displayFulfillmentStatus": "FULFILLED",
"totalPriceSet": {
"shopMoney": {
"amount": "299.99",
"currencyCode": "USD"
}
}
}
]
}
}
With batching enabled, data holds one slice of the batch instead of those two arrays. Every order becomes its own item, shaped as changeType plus record. changeType is created or updated, and record is the polled order.
With a batch size of 1, data is a single item.
Example Payload: batching enabled, batch size 1
{
"data": {
"changeType": "created",
"record": {
"id": "gid://shopify/Order/10079785100",
"name": "#1001",
"email": "customer@example.com",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"displayFinancialStatus": "PAID"
}
}
}
With a batch size greater than 1, data is an array of those items.
Example Payload: batching enabled, batch size greater than 1
{
"data": [
{
"changeType": "created",
"record": {
"id": "gid://shopify/Order/10079785100",
"name": "#1001",
"email": "customer@example.com",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"displayFinancialStatus": "PAID"
}
},
{
"changeType": "updated",
"record": {
"id": "gid://shopify/Order/10079785101",
"name": "#1002",
"email": "customer2@example.com",
"createdAt": "2024-11-08T09:00:00Z",
"updatedAt": "2024-11-10T14:22:00Z",
"displayFinancialStatus": "PAID"
}
}
]
}
New and Updated Products
Retrieves existing and ongoing product changes from Shopify. Load history once, check for changes on a schedule, or both. | key: productsPollingTrigger
| Input | Notes | Example |
|---|---|---|
| Look-back Date | The date the initial sync starts from, in YYYY-MM-DD format. Cannot be a future date. Leave empty to start from the first recurrence with no backfill. When set, the initial sync reports every record updated on or after this date. | 2026-01-01 |
| Connection | The Shopify connection to use. |
Retrieves existing and ongoing product changes from a Shopify store. Load history once, check for changes on a schedule, or both.
How It Works
The trigger operates by:
- Running on the configured schedule (e.g., every 5 minutes)
- Querying the Shopify GraphQL API for products whose
updated_atfalls inside the window this round covers, sorted byupdated_atso the filter and the sort key match - Categorizing products as "created" or "updated" by comparing their
createdAttimestamp against the start of that window, which stays frozen for the whole window so one product is classified the same way on every page - Reading a single page per round and remembering where that page ended, rather than holding an entire window in memory at once
- Advancing its committed position only once a window is fully drained, so an interrupted drain resumes instead of skipping what it had not reported yet
If more products changed than one page holds, the trigger continues from where the page ended instead of dropping the rest. With batching enabled it drains the remaining pages inside the same recurrence; without batching it continues on each following scheduled recurrence.
The first recurrence
- Look-back Date empty: the trigger records the current time and reports nothing. Incremental polling begins on the next recurrence.
- Look-back Date set: the trigger begins a one-time initial sync covering every product updated on or after that date, then hands off to incremental polling. An instance that already carries a committed position is never sent back through an initial sync, so setting the date on a running instance does not replay its history.
The initial sync seeds each product exactly once. The window it covers is half-open, so a product whose updated_at falls on the window's upper bound belongs to the next window rather than this one, and no product is reported twice across the handoff. That upper bound is fixed at the moment the sync begins and does not move as the sync progresses, so a sync spanning several recurrences covers the range it started with rather than growing to follow the clock.
No field in the payload marks the handoff from the initial sync to incremental polling. A downstream step cannot distinguish a backfilled product from one picked up by ordinary polling, and does not need to: the shape is identical in both phases.
Batching
Batching is enabled per flow on this trigger. Once enabled, each changed record is dispatched as its own execution, or grouped by the configured batch size. Batch size and the number of batches dispatched concurrently can both be overridden per instance. Raising concurrency increases the request volume sent to Shopify.
To turn it on, select the flow's trigger, open the Flow control tab, and switch on Enable Batching. Under Batch Size, keep Trigger default to use the size this trigger ships with, or choose Custom batch size to set a specific size. Batch Concurrency is optional; leave it blank to use the limit this trigger ships with, which dispatches one batch at a time.
Enabling batching changes the payload a downstream step receives. With batching off a step reads data.created and data.updated; with batching on those arrays do not exist and data is a single changeType/record item, or an array of them (see Returned Data). Any step reading the older shape must be updated before batching is turned on. Because batching is per flow, this affects only that flow, not the component or other flows using the same trigger.
Returned Data
Fields shown are representative. The full response object includes additional properties.
What arrives in data depends on whether batching is enabled on the flow.
Without batching, data is a single object holding the products categorized by change type.
Example Payload: batching disabled
{
"data": {
"created": [
{
"id": "gid://shopify/Product/108828309",
"title": "Example Product",
"handle": "example-product",
"vendor": "Burton Inc.",
"productType": "T-shirt",
"status": "ACTIVE",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z",
"tags": ["Style", "New"],
"variants": {
"nodes": [
{
"id": "gid://shopify/ProductVariant/1070325177",
"price": "19.99",
"sku": "EXAMPLE-SKU"
}
]
}
}
],
"updated": [
{
"id": "gid://shopify/Product/108828310",
"title": "Updated Product",
"handle": "updated-product",
"vendor": "Acme Corp.",
"productType": "Shoes",
"status": "ACTIVE",
"createdAt": "2024-11-08T09:00:00Z",
"updatedAt": "2024-11-10T14:22:00Z",
"tags": ["Sale"],
"variants": {
"nodes": [
{
"id": "gid://shopify/ProductVariant/1070325178",
"price": "49.99",
"sku": "UPDATED-SKU"
}
]
}
}
]
}
}
With batching enabled, data holds one slice of the batch instead of those two arrays. Every product becomes its own item, shaped as changeType plus record. changeType is created or updated, and record is the polled product.
With a batch size of 1, data is a single item.
Example Payload: batching enabled, batch size 1
{
"data": {
"changeType": "created",
"record": {
"id": "gid://shopify/Product/108828309",
"title": "Example Product",
"handle": "example-product",
"status": "ACTIVE",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z"
}
}
}
With a batch size greater than 1, data is an array of those items.
Example Payload: batching enabled, batch size greater than 1
{
"data": [
{
"changeType": "created",
"record": {
"id": "gid://shopify/Product/108828309",
"title": "Example Product",
"handle": "example-product",
"status": "ACTIVE",
"createdAt": "2024-11-10T10:30:00Z",
"updatedAt": "2024-11-10T10:30:00Z"
}
},
{
"changeType": "updated",
"record": {
"id": "gid://shopify/Product/108828310",
"title": "Another Product",
"handle": "another-product",
"status": "ACTIVE",
"createdAt": "2024-11-08T09:00:00Z",
"updatedAt": "2024-11-10T14:22:00Z"
}
}
]
}
Webhook
Receive and validate webhook requests from Shopify for manually configured webhook subscriptions. | key: webhook
| Input | Notes | Example |
|---|---|---|
| Secret Key | The Shopify app's client secret, viewable from the Partner Dashboard. |
A Shopify webhook can be configured manually to send information to a flow's webhook URL when specific events occur (a customer is created, an order is shipped, etc.).
This trigger receives and validates webhook requests from Shopify for manually configured webhook subscriptions.
How It Works
When a webhook request is received, the trigger performs HMAC-SHA256 signature verification to ensure the request originated from Shopify:
- The trigger extracts the
X-Shopify-Hmac-SHA256header from the incoming request - It computes the expected signature using the configured Secret Key and the request body
- If the signatures match, the trigger returns a 200 OK response with the parsed JSON body
- If the signatures do not match, the request is rejected
The signature is computed over the raw request body, base64-encoded:
const crypto = require("node:crypto");
const signature = crypto
.createHmac("sha256", secretKey) // the app's client secret
.update(rawRequestBody, "utf8") // the raw body, before JSON parsing
.digest("base64"); // Shopify sends base64, not hex
The computed value is compared against the header using a constant-time comparison, so a mismatch takes the same time to detect regardless of where the two values first differ.
Configuration
- Secret Key: The Shopify app's client secret, used for HMAC signature verification. This value is available in the app's credentials section of the Shopify Dev Dashboard.
Event Types
A full list of configurable webhook topics is available in the Shopify Webhook Topics documentation.
Data Sources
Select Collection
Selects a collection from a list of all collections. | key: listCollections | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Customer
Selects a customer from a list of all customers. | key: listCustomers | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Draft Order
Selects a draft order from a list of all draft orders. | key: listDraftOrders | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Fulfillment
Selects a fulfillment from a list of all fulfillments. | key: listFulfillments | type: picklist
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique ID of the order. | 450789469 |
| Connection | The Shopify connection to use. |
Select Fulfillment Order
Selects a fulfillment order from a list of all fulfillment orders. | key: listFulfillmentOrders | type: picklist
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique ID of the order. | 450789469 |
| Connection | The Shopify connection to use. |
Select Fulfillment Service
Selects a fulfillment service from a list of all fulfillment services. | key: listFulfillmentServices | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Inventory Item
Selects an inventory item from a list of all inventory items. | key: listInventoryItems | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Location
Selects a location from a list of all locations. | key: listLocations | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Order
Selects an order from a list of all orders. | key: listOrders | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Product
Selects a product from a list of all products. | key: listProducts | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Select Product Image
Selects a product image from a list of images for the specified product. | key: listProductImages | type: picklist
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique ID of the product. | 74020090 |
| Connection | The Shopify connection to use. |
Select Variant
Selects a product variant from a list of variants for the specified product. | key: listVariants | type: picklist
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique ID of the product. | 74020090 |
| Connection | The Shopify connection to use. |
Actions
Cancel Order
Cancels an existing order. | key: cancelOrderGql
| Input | Notes | Example |
|---|---|---|
| Notify Customer | Whether the customer should be notified of the cancellation. | false |
| Order ID | The unique identifier for the order. | 10079785100 or gid://shopify/Order/10079785100 |
| Reason | The reason for the cancellation. | CUSTOMER |
| Refund | Whether to refund the amount paid by the customer. | false |
| Restock | Whether to restock the inventory committed to the order. | false |
| Connection | The Shopify connection to use. | |
| Staff Note | A staff-facing note about the order cancellation. This is not visible to the customer. | This is a staff note. |
Example Payload for Cancel Order⤓
Close Order
Closes an existing order. | key: closeOrderGql
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique identifier for the order. | 10079785100 or gid://shopify/Order/10079785100 |
| Connection | The Shopify connection to use. |
Example Payload for Close Order⤓
Complete Draft Order
Marks a draft order as complete. | key: completeDraftOrderGql
| Input | Notes | Example |
|---|---|---|
| Draft Order Id | The unique identifier for the draft order. | 916042021234 or gid://shopify/DraftOrder/916042021234 |
| Connection | The Shopify connection to use. |
Example Payload for Complete Draft Order⤓
Connect Inventory Item To Location
Connects an existing inventory item to a location. | key: connectInventoryLevelGql
| Input | Notes | Example |
|---|---|---|
| Inventory Item Id | The unique identifier for the inventory item. | gid://shopify/InventoryItem/43933612241234 |
| Location ID | The ID of the location that the inventory level belongs to. | 346779380 or gid://shopify/Location/346779380 |
| Connection | The Shopify connection to use. |
Example Payload for Connect Inventory Item To Location⤓
Count Collections
Returns a count of all collections. | key: countCollectionsGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Collections⤓
Count Customers
Returns a count of all customers. | key: countCustomersGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Customers⤓
Count Draft Orders
Returns a count of all draft orders. Note: this action currently utilizes an unstable version of the Shopify Admin GraphQL API and is subject to change. | key: countDraftOrdersGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Draft Orders⤓
Count Locations
Returns a count of all locations. | key: countLocationsGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Locations⤓
Count Orders
Returns a count of all orders. | key: countOrdersGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Orders⤓
Count Product Images
Returns a count of all product images for the specified product. | key: countProductImagesGql
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. |
Example Payload for Count Product Images⤓
Count Products
Returns a count of all products. | key: countProducts
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Products⤓
Count Variants
Returns a count of all product variants. | key: countVariantsGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Count Variants⤓
Create Account Activation URL
Creates an account activation URL for an existing customer. | key: createAccountActivationURLGql
| Input | Notes | Example |
|---|---|---|
| Customer | The unique identifier for the customer. | 5940139491234 or gid://shopify/Customer/5940139491234 |
| Connection | The Shopify connection to use. |
Example Payload for Create Account Activation URL⤓
Create Customer
Creates a new customer. | key: createCustomer
| Input | Notes | Example |
|---|---|---|
| Additional Fields | Additional optional fields: includes Phone, Notes, Currency Format, Tax Exempt, and Metafields. | |
| Address List | A JSON array of address objects for the customer. Each object should include fields like address1, city, province, country, and zip. | |
The email address of the customer. | john.doe@example.com | |
| Values | Key-value pairs for creating or updating a record. Specify any property key and value. | |
| First Name | The first name of the customer. | John |
| Last Name | The last name of the customer. | Doe |
| Connection | The Shopify connection to use. | |
| Tags | Tags for the product. Each list item is a tag string. | Style |
| Verified Email | When true, emails will be sent to the customer. | false |
Example Payload for Create Customer⤓
Create Draft Order
Creates a new draft order. | key: createDraftOrderGql
| Input | Notes | Example |
|---|---|---|
| Additional Fields | Additional fields that might not be covered by the standard inputs. This is a JSON object. | |
| Customer | The unique identifier for the customer. | 5940139491234 or gid://shopify/Customer/5940139491234 |
| Line items | Provide a JSON array containing line item objects. | |
| Note | A note on the draft order. | Test draft order |
| Connection | The Shopify connection to use. | |
| Tags | Provide a list of tags for the draft order. | Style |
| Tax Exempt | Whether or not taxes are exempt for the draft order. | false |
| Use Customer Address | This flag determines if the order will use the customers default address. | true |
Example Payload for Create Draft Order⤓
Create Fulfillment Service
Creates a new fulfillment service. | key: createFulfillmentServiceGql
| Input | Notes | Example |
|---|---|---|
| Callback URL | The callback URL that the fulfillment service has registered for request. | https://example.com |
| Fulfillment Service Name | The name of the fulfillment service. | MyFulfillmentService |
| Inventory Management | Whether the fulfillment services tracks product inventory and provides updates to Shopify. | false |
| Connection | The Shopify connection to use. | |
| Tracking Support | Whether the fulfillment service supports tracking numbers for packages. | false |
Example Payload for Create Fulfillment Service⤓
Create Order
Creates a new order. | key: createOrderGql
| Input | Notes | Example |
|---|---|---|
| Order Data | JSON data to be sent as the Order payload. | |
| Connection | The Shopify connection to use. |
Example Payload for Create Order⤓
Create Product
Creates a new product. | key: createProductGql
| Input | Notes | Example |
|---|---|---|
| Additional Fields | Additional fields that might not be covered by the standard inputs. This is a JSON object. | |
| Description HTML | Provide an HTML string for the description of the product. | <p>This is an example product.</p> |
| Image Alt Text | Provide the alt text for the image of the product. | Alt text |
| Image URL | Provide a URL for the image of the product. | https://example.com/image.jpg |
| Product Status | Specify the status of the product. | |
| Product Type | Provide a value for the type of product. | T-shirt |
| Connection | The Shopify connection to use. | |
| Tags | Provide a list of tags for the product. | Style |
| Title | Provide a string value for the title of the product. | Example Product |
| Vendor | Provide a value for the vendor of the product. | Burton inc. |
Example Payload for Create Product⤓
Create Product Image
Creates a new image for an existing product. | key: createProductImageGql
| Input | Notes | Example |
|---|---|---|
| Image Alt Text | Provide the alt text for the image. | Alt text |
| Image URL | Provide the URL of the image. | https://example.com/image.jpg |
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. |
Example Payload for Create Product Image⤓
Create Variant
Creates a new variant for the specified product. | key: createVariantGql
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. | |
| Variant | Provide a JSON object containing the variant data. |
Example Payload for Create Variant⤓
Create Webhook
Creates a webhook for the specified topic. | key: createWebhook
| Input | Notes | Example |
|---|---|---|
| Post URL | The URL where the newly created webhook will post to. Used to configure the Shopify trigger. | https://example.com/webhook |
| Connection | The Shopify connection to use. | |
| Webhook Format | The format for the webhook response. | json |
| Webhook Topic | The event topic for the webhook. See Shopify webhook topics for all available topics. | products/create |
Example Payload for Create Webhook⤓
Delete Collection
Deletes a collection by ID. | key: deleteCollectionGql
| Input | Notes | Example |
|---|---|---|
| Collection ID | The unique identifier for the collection. | gid://shopify/Collection/841564295 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Collection⤓
Delete Customer
Deletes an existing customer. | key: deleteCustomerGql
| Input | Notes | Example |
|---|---|---|
| Customer | The unique identifier for the customer. | 5940139491234 or gid://shopify/Customer/5940139491234 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Customer⤓
Delete Draft Order
Deletes an existing draft order. | key: deleteDraftOrderGql
| Input | Notes | Example |
|---|---|---|
| Draft Order Id | The unique identifier for the draft order. | 916042021234 or gid://shopify/DraftOrder/916042021234 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Draft Order⤓
Delete Fulfillment Service
Deletes an existing fulfillment service. | key: deleteFulfillmentServiceGql
| Input | Notes | Example |
|---|---|---|
| Fulfillment Service ID | The unique identifier for the fulfillment service. | gid://shopify/FulfillmentService/18961920?id=true |
| Connection | The Shopify connection to use. |
Example Payload for Delete Fulfillment Service⤓
Delete Instance Webhooks
Deletes all webhooks related to the current instance. | key: deleteInstanceWebhooks
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Delete Inventory Levels
Deletes an inventory level. | key: deleteInventoryLevelsGql
| Input | Notes | Example |
|---|---|---|
| Inventory Level Id | The unique identifier for the inventory level. | gid://shopify/InventoryLevel/820859520?inventory_item_id=826867926 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Inventory Levels⤓
Delete Metafield
Deletes a resource metafield. Note: This action currently utilizes an unstable version of the Shopify Admin GraphQL API and is subject to change. | key: deleteMetafieldGql
| Input | Notes | Example |
|---|---|---|
| Key | Provide the key of the metafield to delete. | myKey |
| Namespace | Provide the namespace of the metafield to delete. | global |
| Owner ID | Provide the owner ID of the metafield to delete. | gid://shopify/Product/20995642 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Metafield⤓
Delete Order
Deletes an existing order by ID. | key: deleteOrderGql
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique identifier for the order. | 10079785100 or gid://shopify/Order/10079785100 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Order⤓
Delete Product
Deletes an existing product. | key: deleteProductGql
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Product⤓
Delete Product Image
Deletes a product image. | key: deleteProductImageGql
| Input | Notes | Example |
|---|---|---|
| Image ID | The unique identifier for the product image. | gid://shopify/MediaImage/916933471 |
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. |
Example Payload for Delete Product Image⤓
Delete Variant
Deletes an existing variant by ID. | key: deleteVariantGql
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. | |
| Variant ID | The unique identifier for the product variant. | gid://shopify/ProductVariant/1070325177 |
Example Payload for Delete Variant⤓
Delete Webhook
Deletes a webhook by ID. | key: deleteWebhook
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. | |
| Webhook ID | The ID of an existing webhook. | 450789469 |
Example Payload for Delete Webhook⤓
Get Collection
Retrieves a collection by ID. | key: getCollectionGql
| Input | Notes | Example |
|---|---|---|
| Collection ID | The unique identifier for the collection. | gid://shopify/Collection/841564295 |
| Connection | The Shopify connection to use. |
Example Payload for Get Collection⤓
Get Customer
Retrieves a customer by ID. | key: getCustomer
| Input | Notes | Example |
|---|---|---|
| Customer | The unique ID of the customer. | 207119551 |
| Connection | The Shopify connection to use. |
Example Payload for Get Customer⤓
Get Draft Order
Retrieves a draft order by ID. | key: getDraftOrderGql
| Input | Notes | Example |
|---|---|---|
| Draft Order Id | The unique identifier for the draft order. | 916042021234 or gid://shopify/DraftOrder/916042021234 |
| Connection | The Shopify connection to use. |
Example Payload for Get Draft Order⤓
Get Fulfillment
Retrieves a fulfillment by ID. | key: getFulfillmentGql
| Input | Notes | Example |
|---|---|---|
| Fulfillment Id | The unique identifier for the fulfillment. | 5154544124321 or gid://shopify/Fulfillment/5154544124321 |
| Connection | The Shopify connection to use. |
Example Payload for Get Fulfillment⤓
Get Fulfillment Order
Retrieves a specific fulfillment order by ID. | key: getFulfillmentOrder
| Input | Notes | Example |
|---|---|---|
| Fulfillment Order ID | The unique identifier for the fulfillment order. | 1046000820 |
| Connection | The Shopify connection to use. |
Example Payload for Get Fulfillment Order⤓
Get Fulfillment Service
Retrieves a fulfillment service by ID. | key: getFulfillmentServiceGql
| Input | Notes | Example |
|---|---|---|
| Fulfillment Service ID | The unique identifier for the fulfillment service. | gid://shopify/FulfillmentService/18961920?id=true |
| Connection | The Shopify connection to use. |
Example Payload for Get Fulfillment Service⤓
Get Inventory Item
Retrieves an inventory item by ID. | key: getInventoryItemsGql
| Input | Notes | Example |
|---|---|---|
| Inventory Item Id | The unique identifier for the inventory item. | gid://shopify/InventoryItem/43933612241234 |
| Connection | The Shopify connection to use. |
Example Payload for Get Inventory Item⤓
Get Inventory Levels
Retrieves an inventory level by ID. | key: getInventoryLevelsGql
| Input | Notes | Example |
|---|---|---|
| Inventory Level Id | The unique identifier for the inventory level. | gid://shopify/InventoryLevel/100340760123?inventory_item_id=43933612245123 |
| Connection | The Shopify connection to use. |
Example Payload for Get Inventory Levels⤓
Get Location
Retrieves a location by ID. | key: getLocationsGql
| Input | Notes | Example |
|---|---|---|
| Location ID | The ID of the location that the inventory level belongs to. | 346779380 or gid://shopify/Location/346779380 |
| Connection | The Shopify connection to use. |
Example Payload for Get Location⤓
Get Order
Retrieves an order by ID. | key: getOrderGql
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique identifier for the order. | 10079785100 or gid://shopify/Order/10079785100 |
| Connection | The Shopify connection to use. |
Example Payload for Get Order⤓
Get Order (Deprecated)
Get the information and metadata about an order. This version of the action is being deprecated. Please replace action with Get Order. | key: getOrder
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique ID of the order. | 450789469 |
| Connection | The Shopify connection to use. |
Example Payload for Get Order (Deprecated)⤓
Get Product
Retrieves a product by ID. | key: getProduct
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique ID of the product. | 74020090 |
| Connection | The Shopify connection to use. |
Example Payload for Get Product⤓
Get Product Image
Retrieves a product image by ID. | key: getProductImageGql
| Input | Notes | Example |
|---|---|---|
| Image ID | Provide a unique ID of a product image. Use only the ID number. | 916933471 |
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. |
Example Payload for Get Product Image⤓
Get Shop Configuration
Retrieves the shop configuration. | key: getShopConfig
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for Get Shop Configuration⤓
Get Variant
Retrieves a product variant by ID. | key: getVariantGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. | |
| Variant ID | The unique identifier for the product variant. | gid://shopify/ProductVariant/1070325177 |
Example Payload for Get Variant⤓
List Collections
Lists all collections. | key: listCollectionsGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Collections⤓
List Currencies
Lists all enabled currencies. | key: listCurrenciesGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Currencies⤓
List Customers
Lists all customers. | key: listCustomers
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, fetches all pages of results instead of a single page. The API returns up to 250 records per page, and the Limit input is ignored. | false |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Customers⤓
List Draft Orders
Lists all draft orders. | key: listDraftOrders
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, fetches all pages of results instead of a single page. The API returns up to 250 records per page, and the Limit input is ignored. | false |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Draft Orders⤓
List Fulfillment Orders
Lists all fulfillment orders for a specific order. | key: listFulfillmentOrders
| Input | Notes | Example |
|---|---|---|
| Order ID | The unique ID of the order. | 450789469 |
| Connection | The Shopify connection to use. |
Example Payload for List Fulfillment Orders⤓
List Fulfillment Services
Lists all fulfillment services. | key: listFulfillmentServicesGql
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. |
Example Payload for List Fulfillment Services⤓
List Fulfillments
Lists all fulfillments for a specified order. | key: listFulfillments
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, fetches all pages of results instead of a single page. The API returns up to 250 records per page, and the Limit input is ignored. | false |
| Order ID | The unique ID of the order. | 450789469 |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Fulfillments⤓
List Inventory Items
Lists all inventory items. | key: listInventoryItemsGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Query | The query to filter the inventory items. | id:>=30322695 |
| Connection | The Shopify connection to use. |
Example Payload for List Inventory Items⤓
List Inventory Levels At Location
Lists all inventory levels at a specified location. | key: listInventoryLevelsGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Location ID | The ID of the location that the inventory level belongs to. | 346779380 or gid://shopify/Location/346779380 |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Inventory Levels At Location⤓
List Locations
Lists all locations. | key: listLocationsGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Locations⤓
List Metafields
Lists resource metafields. Note: This action currently utilizes an unstable version of the Shopify Admin GraphQL API and is subject to change. | key: listMetafieldsGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Resource | The unique identifier for the resource. | gid://shopify/Product/20995642 |
| Connection | The Shopify connection to use. |
Example Payload for List Metafields⤓
List Orders
Lists all orders. | key: listOrdersGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Query | The query to filter the orders. | updated_at:>2019-12-01 |
| Connection | The Shopify connection to use. |
Example Payload for List Orders⤓
List Product Images
Lists all product images for the specified product. | key: listProductImages
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique ID of the product. | 74020090 |
| Connection | The Shopify connection to use. |
Example Payload for List Product Images⤓
List Products
Lists all products. | key: listProducts
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, fetches all pages of results instead of a single page. The API returns up to 250 records per page, and the Limit input is ignored. | false |
| Pagination | Page and page-size controls. | |
| Connection | The Shopify connection to use. |
Example Payload for List Products⤓
List Variants
Lists all variants for the specified product. | key: listVariantsGql
| Input | Notes | Example |
|---|---|---|
| Fetch All | When true, automatically fetches all pages of results using pagination. The API is limited to 250 records per page max. | false |
| Pagination | Page and page-size controls. | |
| Product ID | The unique identifier for the product. | 108828309 |
| Connection | The Shopify connection to use. |
Example Payload for List Variants⤓
List Webhooks
Lists all webhooks or webhooks for the current instance. | key: listWebhooks
| Input | Notes | Example |
|---|---|---|
| Connection | The Shopify connection to use. | |
| Show Only Instance Webhooks | When true, only webhooks that point to this instance are returned. | true |
Example Payload for List Webhooks⤓
Raw Request
Sends a raw GraphQL request to Shopify. | key: graphQlRawRequest
| Input | Notes | Example |
|---|---|---|
| API Version | Shopify versions its API. See Shopify API release notes for a list of available versions. | 2026-07 |
| Connection | The Shopify connection to use. | |
| Query or Mutation | GraphQL query or mutation. See Shopify's GraphQL API documentation for examples. Ex: { shop { name } } | |
| Variables | Variables to pass to the query or mutation. | key1: value1, key2: value2 |
| Variables Object | Variables to pass to the query or mutation. |
Raw Request (Deprecated)
Send raw HTTP request to Shopify. This version of the action uses REST and is being deprecated. Please replace action with the Raw Request utilizing GraphQL. | key: rawRequest
| Input | Notes | Example |
|---|---|---|
| API Version | Shopify versions its API. See Shopify API release notes for a list of available versions. | 2026-07 |
| Connection | The Shopify connection to use. | |
| Data | The HTTP body payload to send to the URL. | {"exampleKey": "Example Data"} |
| Debug Request | Enabling this flag will log out the current request. | false |
| File Data | File Data to be sent as a multipart form upload. | [{key: "example.txt", value: "My File Contents"}] |
| File Data File Names | File names to apply to the file data inputs. Keys must match the file data keys above. | |
| Form Data | The Form Data to be sent as a multipart form upload. | [{"key": "Example Key", "value": new Buffer("Hello World")}] |
| Header | A list of headers to send with the request. | User-Agent: curl/7.64.1 |
| Max Retry Count | The maximum number of retries to attempt. Specify 0 for no retries. | 0 |
| Method | The HTTP method to use. | |
| Query Parameter | A list of query parameters to send with the request. This is the portion at the end of the URL similar to ?key1=value1&key2=value2. | |
| Response Type | The type of data you expect in the response. You can request json, text, or binary data. | json |
| Retry On All Errors | If true, retries on all erroneous responses regardless of type. This is helpful when retrying after HTTP 429 or other 3xx or 4xx errors. Otherwise, only retries on HTTP 5xx and network errors. | false |
| Retry Delay (ms) | The delay in milliseconds between retries. This is used when 'Use Exponential Backoff' is disabled. | 0 |
| Return Headers | When true, response headers will be included in the output object. | false |
| Timeout | The maximum time that a client will await a response to its request | 2000 |
| URL | Input the path only (/users/current.json), The base URL is already included (https://YOUR-DOMAIN.myshopify.com/admin/api/API-VERSION). For example, to connect to https://YOUR-DOMAIN.myshopify.com/admin/api/API-VERSION/users/current.json, only /users/current.json is entered in this field. | /users/current.json |
| Use Exponential Backoff | Specifies whether to use a pre-defined exponential backoff strategy for retries. When enabled, 'Retry Delay (ms)' is ignored. | false |
Set Metafield
Sets a resource metafield. Note: This action currently utilizes an unstable version of the Shopify Admin GraphQL API and is subject to change. | key: setMetafieldGql
| Input | Notes | Example |
|---|---|---|
| Key | The key for the metafield. | myKey |
| Namespace | The namespace for the metafield. | global |
| Owner ID | The unique ID of the owner of the metafield. | gid://shopify/Product/20995642 |
| Connection | The Shopify connection to use. | |
| Type | Provide a type for the metafield. Required when there is no corresponding definition for the given namespace, key, and owner resource type. | single_line_text_field |
| Value | The value for the metafield. | myValue |
Example Payload for Set Metafield⤓
Update Customer
Updates an existing customer by ID. | key: updateCustomerGql
| Input | Notes | Example |
|---|---|---|
| Additional Fields | Additional fields that might not be covered by the standard inputs. This is a JSON object. | |
| Address List | Provide a JSON array containing address objects. | |
| Customer | The unique identifier for the customer. | 5940139491234 or gid://shopify/Customer/5940139491234 |
The email address of the customer. | someone@example.com | |
| First Name | The first name of the customer. | John |
| Last Name | The last name of the customer. | Doe |
| Metafields | Provide a JSON array containing metadata objects. | |
| Notes | A note about the customer. | This is an example note. |
| Phone | The phone number of the customer. | +18005555454 |
| Connection | The Shopify connection to use. | |
| Tags | For each list item, provide a string to tag the product with. | Style |
| Tax Exempt | Determines if the customer is tax exempt. |
Example Payload for Update Customer⤓
Update Fulfillment Service
Updates an existing fulfillment service. | key: updateFulfillmentServiceGql
| Input | Notes | Example |
|---|---|---|
| Callback URL | The callback URL that the fulfillment service has registered for request. | https://example.com |
| Fulfillment Service ID | The unique identifier for the fulfillment service. | gid://shopify/FulfillmentService/18961920?id=true |
| Fulfillment Service Name | The name of the fulfillment service. | MyFulfillmentService |
| Inventory Management | Whether the fulfillment services tracks product inventory and provides updates to Shopify. | |
| Connection | The Shopify connection to use. | |
| Tracking Support | Whether the fulfillment service supports tracking numbers for packages. |
Example Payload for Update Fulfillment Service⤓
Update Inventory Item
Updates an existing inventory item. | key: updateInventoryItemsGql
| Input | Notes | Example |
|---|---|---|
| Cost | Unit cost associated with the inventory item, the currency is the shop's default currency. | 1.00 |
| Inventory Item Id | The unique identifier for the inventory item. | gid://shopify/InventoryItem/43933612241234 |
| Connection | The Shopify connection to use. | |
| SKU | The SKU (stock keeping unit) of the inventory item. | 97802837847 |
| Tracked | Whether the inventory item is tracked. |
Example Payload for Update Inventory Item⤓
Update Product
Updates an existing product by ID. | key: updateProductGql
| Input | Notes | Example |
|---|---|---|
| Additional Fields | Additional fields that might not be covered by the standard inputs. This is a JSON object. | |
| Description HTML | Provide an HTML string for the description of the product. | <p>This is an example product.</p> |
| Image Alt Text | Provide the alt text for the image of the product. | Alt text |
| Image URL | Provide a URL for the image of the product. | https://example.com/image.jpg |
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Product Status | Specify the status of the product. | |
| Product Type | Provide a value for the type of product. | T-shirt |
| Connection | The Shopify connection to use. | |
| Tags | For each list item, provide a string to tag the product with. | Style |
| Title | Provide a string value for the title of the product. | Example Product |
| Vendor | Provide a value for the vendor of the product. | Burton inc. |
Example Payload for Update Product⤓
Update Variant
Updates an existing product variant by ID. | key: updateVariantGql
| Input | Notes | Example |
|---|---|---|
| Product ID | The unique identifier for the product. | 108828309 or gid://shopify/Product/108828309 |
| Connection | The Shopify connection to use. | |
| Update Variant | Provide a JSON object containing the variant data to update. |
Example Payload for Update Variant⤓
Changelog
2026-09-14
Removed the List Orders (Deprecated) action and the Event Topic Webhook (Deprecated) trigger that are no longer in use; use List Orders and Event Topic Subscription instead
2026-09-03
- Added opt-in batching across all polling triggers, dispatching each changed record individually or in configured batches so large backlogs drain in one recurrence; enabling it changes the shape a downstream step receives
- Added an optional Look-back Date input for performing an initial sync of records across all polling triggers. The initial sync backfills every record modified on or after the specified date, seeding each once; later recurrences are unaffected. Leave it empty to start from the first recurrence with no backfill
- Updated all polling triggers to deliver a large backlog across recurrences, continuing from where the previous recurrence left off rather than holding every changed record before any of it reaches a flow
- Updated the default Shopify API version to 2026-07
- Fixed the Secret Key input on the Event Topic Subscription trigger displaying the app's client secret in plain text; it is now masked, matching the other webhook triggers
2026-07-15
Updated the OAuth 2.0 connections to request expiring access tokens so authentication continues to work with newer Shopify apps
2026-07-06
Restructured action inputs into structured objects for an improved user experience.
- The GraphQL list actions (List Currencies, List Collections, List Customers, List Draft Orders, List Fulfillment Orders, List Inventory Items, List Inventory Levels At Location, List Locations, List Orders, List Product Images, List Products, List Variants, List Webhooks, and List Metafields) group their Limit and Page Offset Cursor inputs into a Pagination structured object
- Create Customer groups its Phone, Notes, Currency Format, Tax Exempt, and Metafields inputs into an Additional Fields structured object; the required Address List input moves up beside the other required inputs
2026-04-30
Updated spectral version
2026-03-31
Various modernizations and documentation updates
2026-03-05
Added inline data sources for draft orders, collections, and fulfillment services to enable dynamic dropdown selection
2026-02-26
Added inline data sources for variants, product images, and inventory items to enhance data selection capabilities
2026-01-27
Added New and Updated Customers, New and Updated Orders, and New and Updated Products polling triggers.
2025-10-17
Enhanced webhook lifecycle management with improved event topic webhook handling and automated cleanup
2025-05-05
Added inline datasources and global debug to all actions for improved integration capabilities