---
schema_version: 1
route: /t/shopify.md
tool: "shopify"
---

# sincecutoff.com /t/shopify — Shopify CLI

- name: Shopify CLI
- kind: cli
- children: none
- homepage: <https://github.com/Shopify/cli>

Changes to the tools coding agents drive, since a model's training cutoff, each linked to its first-party source. Check installed versions and limitations before acting; a cutoff date does not establish what a model knows.
Original editorial content: [Apache 2.0](https://sincecutoff.com/v1/data-license.txt), by [0xPatrick](https://0xpatrick.dev). Preserve applicable license and [NOTICE](https://sincecutoff.com/notice.txt) attribution when redistributing. Third-party source text and examples retain their own rights. [License scope and attribution](https://sincecutoff.com/v1/license.json).
To stay current, read the changes feed: [`/v1/changes.md?tool=shopify`](https://sincecutoff.com/v1/changes.md?tool=shopify) (or `.json`), adding `since=YYYY-MM-DD` for your training cutoff. Entries for registered children are included; the registry itself is `/v1/tools.json`. How to page and save your place: [llms.txt](https://sincecutoff.com/llms.txt).

### shopify app Flow trigger lifecycle callback relative urls (2026-10-08)
- slug: shopify-app-flow-trigger-lifecycle-callback-relative-urls-8dcdaa37ce2e
- score: 0.92

How to use it:

When the app hosts the Flow trigger lifecycle callback, set its `url` to a single-slash relative path; Shopify CLI resolves it against the dev tunnel during `app dev` and the HTTPS `application_url` during deploy. Implement the callback route, run `shopify app dev` and create a workflow using the trigger, then run `shopify app deploy`.

Examples:

```
[[extensions]]
name = "My lifecycle callback"
handle = "my-lifecycle-callback"
type = "flow_trigger_lifecycle_callback"
uid = "<generated-uid>"
url = "/flow/lifecycle-callback"
```

```
shopify app dev
```

```
shopify app deploy
```

- why_it_matters: Configure a Flow trigger lifecycle callback extension to call a route in the app during development and deployment.
- sources: <https://github.com/Shopify/cli/releases/tag/4.9.0>, <https://github.com/Shopify/cli/pull/8362>, <https://shopify.dev/docs/apps/build/flow/track-lifecycle-events>, <https://shopify.dev/docs/apps/build/cli-for-apps/test-apps-locally>
- gotchas: "Version: 4.9.0"; "url (required): Callback endpoint; use an absolute HTTPS URL or a relative path starting with one `/`. Relative paths resolve against the dev tunnel during `app dev` and `application_url` during deploy; the server must respond within five seconds with a `2xx` status."; "application_url (required): App configuration URL. Must be HTTPS when `url` is relative, so the path resolves to an HTTPS URL during deploy."; "Prerequisite: For a relative callback path, set an HTTPS `application_url` before deploying."; "Prerequisite: Configure the web server to receive the callback, verify its `x-shopify-hmac-sha256` header using the app client secret, and respond within five seconds."; "Prerequisite: Run `shopify app dev` from the app directory and select a dev store if prompted."; "Applies to Flow trigger lifecycle callback extensions."; "A corresponding route file must exist in `/app/routes`."

### shopify app function target-level input variables (2026-10-08)
- slug: shopify-app-function-target-level-input-variables-1fcf69de3ff2
- score: 0.97

How to use it:

When a function target’s input query declares variables, set `input_variables` on that target to identify its JSON metafield. Don’t also configure extension-level variables in the same function.

Examples:

```
[[extensions.targeting]]
target = "<function-target>"
input_query = "<path-to-input-query.graphql>"
input_variables = { namespace = "$app:<namespace>", key = "<key>" }
export = "<function-export>"
```

- why_it_matters: Configure different input query variables for targets in a Shopify function extension.
- before: Extension-level `[extensions.input.variables]` applied one metafield to every target; older configuration files used `[input.variables]`.
- sources: <https://github.com/Shopify/cli/releases/tag/4.9.0>, <https://github.com/Shopify/cli/pull/8471>, <https://shopify.dev/docs/apps/build/functions/input-queries/use-variables-input-queries>
- gotchas: "Version: 4.9.0"; "input_variables (required): Target-level setting for the metafield used to populate that target’s query variables; required when the query declares variables."; "input_variables.namespace (required): Metafield namespace."; "input_variables.key (required): Metafield key."; "[extensions.input.variables]: Extension-level variable placement; cannot be combined with target-level `input_variables` in the same function. For older configuration files without `[[extensions]]`, the section is `[input.variables]`."; "Prerequisite: Shopify CLI 4.9.0 or higher."; "Prerequisite: The referenced metafield must be JSON type; set it on the function owner."; "Target-level and extension-level variable placements cannot be mixed."

### shopify app security commands check and review app source (2026-10-08)
- slug: shopify-app-security-commands-check-and-review-app-source-3697a64ba141
- score: 0.94

How to use it:

When reviewing a Shopify app for Shopify-specific security issues, run the deterministic scan, have a coding agent investigate and record its findings, then review the combined results. Use the same app-selection flags throughout; `instructions` prints the workflow and `clean` deletes stored results.

Examples:

```
shopify app security check
```

```
shopify app security record < findings.json
```

```
shopify app security review
```

- why_it_matters: Review an app’s source for Shopify-specific security issues and record coding-agent findings.
- sources: <https://github.com/Shopify/cli/releases/tag/4.9.0>, <https://shopify.dev/docs/api/shopify-cli/app/app-security-check>, <https://shopify.dev/docs/api/shopify-cli/app/app-security-record>, <https://shopify.dev/docs/api/shopify-cli/app/app-security-review>, <https://shopify.dev/docs/api/shopify-cli/app/app-security-clean>
- gotchas: "Version: 4.9.0"; "--path <value>: Select the app directory; pass the same value to related commands to use the same results."; "-c, --config <value>: Select the app configuration; pass the same value to related commands."; "--client-id <value>: The app's Client ID; required with `--without-app-config`."; "--without-app-config: Scan `--path` without an app config file; skips config checks and requires `--client-id`."; "< findings.json (required): Redirect the agent's complete findings document to `record` via standard input."; "--print-instructions: Print coding-agent instructions without prompting how to deliver them."; "--check-id <value>: Show only the named check in review; repeat to select multiple checks."; "--all: For `clean`, delete results for every app configuration."; "Prerequisite: Use Shopify CLI 4.9.0 or later; the release added these commands."; "Prerequisite: The command scans an app source directory; results are stored under `.shopify/app-security/`."

### shopify CLI commands accept --no-input (2026-10-08)
- slug: shopify-cli-commands-accept-no-input-770a660b8e47
- score: 0.96

How to use it:

When running a Shopify CLI command without interactive behavior, append `--no-input`; it disables prompts and browser authentication. If required input is unavailable, the CLI returns an actionable error.

Examples:

```
shopify app deploy --no-input
```

- why_it_matters: Run a Shopify CLI command without interactive input.
- sources: <https://github.com/Shopify/cli/releases/tag/4.9.0>, <https://github.com/Shopify/cli/pull/8407>, <https://shopify.dev/docs/api/shopify-cli/store/store-open>, <https://github.com/Shopify/cli/blob/main/packages/cli/CHANGELOG.md>
- gotchas: "Version: 4.9.0"; "--no-input: Disables interactive prompts and browser authentication; available as a global flag. The CLI returns an actionable error when required input is unavailable."; "--no-input: For `store open`, disables interactive prompts and browser authentication. Environment variable: `SHOPIFY_FLAG_NO_INPUT`."; "Prerequisite: Use Shopify CLI version 4.9.0 or later for this flag."; "Available on all commands."

### Shopify UI extension metafields accept owner_type (2026-10-08)
- slug: shopify-ui-extension-metafields-accept-owner-type-b4483ece6377
- score: 0.96

How to use it:

When configuring metafields for a checkout or customer account UI extension, add `owner_type` to each declaration to identify the resource that owns it. On API version 2026-10 it is optional; Shopify's docs list `PRODUCTVARIANT` and `CUSTOMER` as supported values.

Examples:

```
[[extensions.metafields]]
namespace = "$app"
key = "energy-rating"
owner_type = "PRODUCTVARIANT"

[[extensions.metafields]]
namespace = "custom"
key = "age-verification-required"
owner_type = "CUSTOMER"
```

- why_it_matters: Configure metafield declarations for a checkout or customer account UI extension with an owner type.
- sources: <https://github.com/Shopify/cli/releases/tag/4.9.0>, <https://github.com/Shopify/cli/pull/8534>, <https://shopify.dev/docs/apps/build/checkout/metafields>
- gotchas: "Version: 4.9.0"; "extensions.metafields.namespace (required): Metafield namespace."; "extensions.metafields.key (required): Metafield key."; "extensions.metafields.owner_type: Resource type that owns the metafield. Supported values include `PRODUCTVARIANT` and `CUSTOMER`."; "Prerequisite: `owner_type` is accepted from API version `2026-10`; it is optional in that version."; "The change applies to checkout and customer account UI extensions."; "`owner_type` is optional."

### shopify theme init defaults to stable Skeleton releases (2026-10-06)
- slug: shopify-theme-init-defaults-to-stable-skeleton-releases-445290e01fc4
- score: 0.95

How to use it:

When initializing a theme without interactive input, run `shopify theme init` with `--no-input` to use the latest stable Skeleton release. With interactive input, the CLI prompts for the Skeleton theme version.

Examples:

```
shopify theme init --no-input
```

```
shopify theme init
```

- why_it_matters: Initialize a Shopify theme with the Skeleton theme when running `theme init` noninteractively.
- sources: <https://github.com/Shopify/cli/releases/tag/4.8.5>, <https://github.com/Shopify/cli/pull/8785>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-init>, <https://shopify.dev/docs/storefronts/themes/tools/cli>
- gotchas: "Version: 4.8.5"; "--no-input: Disables interactive prompts and browser authentication; use it for noninteractive initialization."; "[name]: Optional theme name; if omitted, the CLI prompts for one when input is interactive."; "Prerequisite: Shopify CLI installed; the official theme guide links to installation instructions."; "Prerequisite: Use CLI version 4.8.5 or later for the behavior in this card."; "Docs conflict: The current command reference describes `--latest` as downloading the latest release of the clone URL, but does not document the stable Skeleton selection behavior from the 4.8.5 release note. The invocation above does not use `--latest`. https://shopify.dev/docs/api/shopify-cli/theme/theme-init"

### shopify app dev creates dev stores inline (2026-09-09)
- slug: shopify-app-dev-creates-dev-stores-inline-3748e53bd9da
- score: 0.98

How to use it:

When using App Management with no usable development store, run `shopify app dev` and create a store in its interactive flow. When stores already exist, choose “Create a new dev store” in the picker to create one and continue the preview; the official CLI docs describe the interactive picker but do not document this new choice.

Examples:

```
shopify app dev
```

- why_it_matters: Start `app dev` for an App Management organization that has no usable development store, or select another store when the organization already has stores.
- before: With no usable development store, interactive `app dev` dead-ended at the Developer Dashboard; with existing stores, developers had to leave the CLI to create another store.
- sources: <https://github.com/Shopify/cli/releases/tag/4.8.0>, <https://github.com/Shopify/cli/pull/8323>, <https://github.com/Shopify/cli/pull/8397>, <https://shopify.dev/docs/api/shopify-cli/app/app-dev>, <https://shopify.dev/docs/api/shopify-cli>
- gotchas: "Version: 4.8.0"; "Prerequisite: Shopify CLI requirements: Node.js 22.12 or higher, a Node.js package manager, and Git 2.28.0 or higher."; "The inline flow is for interactive `app dev` using App Management."; "Only `app dev` opts into store creation; other `storeContext` callers default to `disabled`."; "The store-picker create option applies to organizations that already have stores and depends on the inline creation flow from PR #8323."

### Shopify UI extensions support intercepts target capabilities (2026-09-09)
- slug: shopify-ui-extensions-support-intercepts-target-capabilities-ea2a7466e3e4
- score: 0.92

How to use it:

When a UI extension target needs interception behavior, add an `intercepts` target capability with its documented fields; the CLI 4.8.0 release also says `ExtensionPoint` exposes target capabilities separately from extension-level capabilities.

- why_it_matters: Configure a UI extension target to declare interception behavior and expose its target capabilities through the server kit extension point.
- before: Before the change, UI extension target configuration did not recognize `intercepts`, so parsing could remove the capability; the server kit `ExtensionPoint` type omitted target capabilities.
- sources: <https://github.com/Shopify/cli/releases/tag/4.8.0>, <https://github.com/Shopify/cli/pull/8345>
- gotchas: "Version: 4.8.0"; "intercepts.event (required): String event value. The official release note does not document allowed values."; "intercepts.blocking (required): Boolean blocking value."; "intercepts.applies_to: Array of strings."; "`event` is a string, `blocking` is a boolean, and `applies_to` is an optional string array."; "Existing `allow_direct_linking` target capability validation is preserved."

### shopify app function run supports --profile (2026-08-19)
- slug: shopify-app-function-run-supports-profile-8ce125e52ace
- score: 0.97

How to use it:

When you have a built function and valid JSON input, run it with `--profile` to generate a WebAssembly performance profile. Open the `.perf` file from the function directory in Speedscope.

Examples:

```
shopify app function build
shopify app function run --export <export> --input <input.json> --profile
```

```
shopify app function run --export run --input input.json --profile
```

- why_it_matters: Inspect WebAssembly performance for a function you are running locally.
- before: Run `shopify app function run` without generating a WebAssembly performance profile.
- sources: <https://github.com/Shopify/cli/releases/tag/4.7.0>, <https://github.com/Shopify/cli/pull/8226>, <https://shopify.dev/docs/apps/build/functions/optimize-instruction-counts>, <https://shopify.dev/docs/api/shopify-cli/app/app-function-run>
- gotchas: "Version: 4.7.0"; "--profile: Generate a WebAssembly performance profile for the run; profile can be viewed in Speedscope. Environment variable: `SHOPIFY_FLAG_PROFILE`."; "--input, -i <value>: JSON input to pass to the function; if omitted, standard input is used. A valid input is needed for this profiling task."; "--export, -e <value>: Name of the WebAssembly export to invoke."; "Prerequisite: Build the function first; `app function run` executes the already-built WebAssembly module."; "Prerequisite: Provide valid JSON input; the command accepts input via `--input` or standard input."; "Prerequisite: Load the generated `.perf` file in Speedscope. Shopify CLI writes it to the function directory, named after the WebAssembly module."; "A valid input is required."; "The built WebAssembly module may lack a function name section, which makes profiles difficult to interpret and triggers a warning before profiling."; "JavaScript functions' Javy output does not include function names regardless of the `wasm_opt` setting."; "Docs conflict: The current Shopify CLI docs show `--profile` and a profiling example, but do not state the CLI version. The release note establishes that the flag was added in 4.7.0."

### Shopify app and theme commands accept an auth alias (2026-07-31)
- slug: shopify-app-and-theme-commands-accept-an-auth-alias-4a08c42c94bf
- score: 0.95

How to use it:

When running a supported app or theme development command, pass `--auth-alias <alias>` or set `SHOPIFY_FLAG_AUTH_ALIAS` to use that account alias for the command without changing the current CLI session.

Examples:

```
shopify app dev --auth-alias <alias>
```

```
shopify theme dev --auth-alias <alias>
```

```
SHOPIFY_FLAG_AUTH_ALIAS=<alias> shopify app dev
```

- why_it_matters: Run app or theme development commands using a stored Shopify account alias without changing the current CLI session.
- sources: <https://github.com/Shopify/cli/releases/tag/4.6.0>, <https://github.com/Shopify/cli/pull/8026>, <https://github.com/Shopify/cli/blob/4.6.0/packages/cli/README.md>
- gotchas: "Version: 4.6.0"; "--auth-alias <value>: Alias of the Shopify account to use for authentication; provide a value when using the flag."; "SHOPIFY_FLAG_AUTH_ALIAS: Environment variable equivalent of `--auth-alias`; set it to the account alias to use."; "The flag is opted into `AppCommand`, `ThemeCommand`, and `organization list` only."

### shopify app config link adds noninteractive file selection and overwrite flags (2026-07-31)
- slug: shopify-app-config-link-adds-noninteractive-file-selection-and-overwrite-flags-b26ce4d6aed1
- score: 0.98

How to use it:

When the destination filename can't be inferred, link the app with `--client-id` and `--file-name`. If that file already exists, add `--force` to overwrite it without prompting.

Examples:

```
shopify app config link --client-id <client-id> --file-name <name>
```

```
shopify app config link --client-id <client-id> --file-name <name> --force
```

- why_it_matters: Link an app configuration by client ID in automation when its filename is not inferable or the target file already exists.
- before: The release note says `shopify app config link --client-id <id>` could prompt for a local filename when the target could not be inferred.
- sources: <https://github.com/Shopify/cli/releases/tag/4.6.0>, <https://github.com/Shopify/cli/pull/7630>, <https://shopify.dev/docs/api/shopify-cli/app/app-config-link>
- gotchas: "Version: 4.6.0"; "--client-id <value> (required): Client ID of the remote app to link; required if non-interactive."; "--file-name <value>: Name of the configuration file to create or overwrite; requires `--force` to overwrite an existing file."; "--force: Overwrite an existing configuration file without prompting."; "`--force` overwrites an existing configuration file without prompting."

### shopify theme dev adds JSON reconciliation strategy (2026-07-31)
- slug: shopify-theme-dev-adds-json-reconciliation-strategy-f6f0b25b32b5
- score: 0.96

How to use it:

When `shopify theme dev` is run with `--theme-editor-sync` and JSON files conflict, set `--reconciliation-strategy` to `keep-local`, `keep-remote`, or `abort`.

Examples:

```
shopify theme dev --theme-editor-sync --reconciliation-strategy keep-local
```

```
shopify theme dev --theme-editor-sync --reconciliation-strategy keep-remote
```

```
shopify theme dev --theme-editor-sync --reconciliation-strategy abort
```

- why_it_matters: Run theme editor sync when local and remote JSON theme files conflict in automation.
- before: With `--theme-editor-sync`, conflicts could prompt for a reconciliation strategy; the release note says this change makes the strategy configurable to resolve that prompt in automation.
- sources: <https://github.com/Shopify/cli/releases/tag/4.6.0>, <https://github.com/Shopify/cli/pull/7634>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-dev>
- gotchas: "Version: 4.6.0"; "--theme-editor-sync: Synchronizes Theme Editor updates in local theme files; reconciliation strategy applies when this flag is enabled."; "--reconciliation-strategy: Chooses how to resolve JSON conflicts when `--theme-editor-sync` is enabled. Allowed values: `keep-local`, `keep-remote`, `abort`. The docs do not state these values are mutually exclusive."; "SHOPIFY_FLAG_RECONCILIATION_STRATEGY: Environment variable for `--reconciliation-strategy`."; "Prerequisite: Run the command from a directory matching the default Shopify theme folder structure."; "The strategy applies when `--theme-editor-sync` is enabled."

### shopify store create preview is publicly available (2026-07-13)
- slug: shopify-store-create-preview-is-publicly-available-39c2cd2b51b9
- score: 0.95

How to use it:

When you need a development store and have no existing Shopify account, run `shopify store create preview` to create a preview Shopify store.

Examples:

```
shopify store create preview
```

```
shopify store create preview --name "<store name>" --country <two-letter country code>
```

- why_it_matters: Create a preview Shopify store for repository development when no existing Shopify account is available.
- before: The command was hidden from public release.
- sources: <https://github.com/Shopify/cli/releases/tag/4.5.0>, <https://github.com/Shopify/cli/pull/7976>, <https://github.com/Shopify/cli/blob/4.5.0/packages/cli/README.md>
- gotchas: "Version: 4.5.0"; "--country <value>: Two-letter country code for the store, such as US, CA, or GB."; "--name <value>: The name of the store."; "-j, --json: Output result as JSON; automatically disables color output."; "--no-color: Disable color output."; "--verbose: Increase output verbosity."; "Prerequisite: No existing account is needed for preview-store creation."; "No existing account is required for this preview-store creation workflow."; "This change affects command visibility only; command behavior is unchanged."

### shopify app and store graphiql commands open authenticated local sessions (2026-07-06)
- slug: shopify-app-and-store-graphiql-commands-open-authenticated-local-sessions-02f99870aa01
- score: 0.98

How to use it:

When inspecting Admin API queries for an app, run `shopify app graphiql` with the selected store; the app must be installed there. For store authentication, first run `shopify store auth`, then run `shopify store graphiql`; pass `--allow-mutations` if mutations should be allowed.

Examples:

```
shopify app graphiql --store <store>.myshopify.com
```

```
shopify store auth --store <store>.myshopify.com --scopes <comma-separated-scopes>
shopify store graphiql --store <store>.myshopify.com
```

```
shopify store graphiql --store <store>.myshopify.com --allow-mutations
```

- why_it_matters: Inspect or test Admin API queries for an app or store from a local GraphiQL session.
- sources: <https://github.com/Shopify/cli/releases/tag/4.4.0>, <https://github.com/Shopify/cli/pull/7382>, <https://shopify.dev/docs/api/shopify-cli/app/app-graphiql>, <https://shopify.dev/docs/api/shopify-cli/store/store-auth>, <https://shopify.dev/docs/api/shopify-cli/store/store-graphiql>
- gotchas: "Version: 4.4.0"; "app graphiql --store <value>: The myshopify.com domain; if omitted, CLI prompts for a store. The app must be installed on it."; "app graphiql --port <value>: Local GraphiQL server port; must be between 1 and 65535."; "app graphiql --path <value>: Path to the app directory."; "app graphiql --version <value>: GraphiQL API version; defaults to latest stable."; "app graphiql --variables <value>: GraphQL variable values in JSON format."; "store graphiql --store <value> (required): The myshopify.com domain of the store."; "store graphiql --allow-mutations: Allow GraphQL mutations against the target store; mutations are blocked by default."; "store graphiql --port <value>: Local GraphiQL server port; must be between 1 and 65535."; "store graphiql --version <value>: GraphiQL API version; defaults to latest stable."; "store graphiql --variables <value>: GraphQL variable values in JSON format."; "store auth --store <value> (required): The myshopify.com domain of the store."; "store auth --scopes <value> (required): Comma-separated Admin API scopes to request for the app."; "Prerequisite: For app GraphiQL, the app must be installed on the selected store."; "Prerequisite: For store GraphiQL, run `shopify store auth` first to create stored authentication."; "The app must be installed on the store for app-backed GraphiQL."; "Store GraphiQL uses authentication created by `shopify store auth`; mutations are blocked unless `--allow-mutations` is passed."; "The local port must be between 1 and 65535."

### shopify store bulk execute, status, and cancel commands (2026-07-06)
- slug: shopify-store-bulk-execute-status-and-cancel-commands-51881e674968
- score: 0.96

How to use it:

For a store with stored authentication, use `shopify store bulk execute` to run an Admin API GraphQL bulk operation; mutations require `--allow-mutations`. Use `shopify store bulk status` to check operations or `shopify store bulk cancel` to cancel a running operation.

Examples:

```
shopify store bulk execute --store <store>.myshopify.com --query '<GraphQL query or mutation>'
```

```
shopify store bulk status --store <store>.myshopify.com [--id <numeric ID or full GID>]
```

```
shopify store bulk cancel --store <store>.myshopify.com --id <numeric ID or full GID>
```

- why_it_matters: Run or manage a bulk Admin API operation against a store without an app.
- sources: <https://github.com/Shopify/cli/releases/tag/4.4.0>, <https://github.com/Shopify/cli/pull/7897>, <https://shopify.dev/docs/api/shopify-cli/store/store-bulk-execute>, <https://shopify.dev/docs/api/shopify-cli/store/store-bulk-status>, <https://shopify.dev/docs/api/shopify-cli/store/store-bulk-cancel>
- gotchas: "Version: 4.4.0"; "execute --store (required): The store’s myshopify.com domain."; "execute --query: GraphQL query or mutation to run; cannot be used with `--query-file`."; "execute --query-file: Path to a file containing the GraphQL query or mutation; cannot be used with `--query`."; "execute --variables: GraphQL variable values in JSON format; may be specified multiple times and cannot be used with `--variable-file`."; "execute --variable-file: Path to JSONL file containing GraphQL variables, one JSON object per line; cannot be used with `--variables`."; "execute --allow-mutations: Allows GraphQL mutations to run against the store; mutations are disabled by default."; "execute --output-file: File path for results when `--watch` is specified; otherwise results go to STDOUT."; "execute --watch: Wait for bulk operation results before exiting; defaults to false."; "execute --version: API version for the bulk operation; defaults to the latest stable version."; "status --store (required): The store’s myshopify.com domain."; "status --id: Bulk operation ID (numeric ID or full GID); when omitted, lists operations from the last 7 days."; "cancel --store (required): The store’s myshopify.com domain."; "cancel --id (required): Bulk operation ID to cancel (numeric ID or full GID)."; "Prerequisite: Run `shopify store auth` first to create stored authentication for the store."; "Mutations are disabled by default and require `--allow-mutations`."; "The commands use stored store authentication; run `shopify store auth` first."

### shopify theme pull and push can use matching store auth sessions (2026-07-06)
- slug: shopify-theme-pull-and-push-can-use-matching-store-auth-sessions-612b1de2f43f
- score: 0.93

How to use it:

When pulling or pushing a theme, if no `--password` is provided and a cached store-auth session matches the target store, run the theme command without `--password` to use that session’s Admin API token. An explicit `--password` takes precedence. [Release note](https://github.com/Shopify/cli/releases/tag/4.4.0)

Examples:

```
shopify theme pull --store <store.myshopify.com> --theme <theme-id-or-name>
```

```
shopify theme push --store <store.myshopify.com> --theme <theme-id-or-name>
```

```
shopify store auth --store <store.myshopify.com> --scopes <comma-separated-admin-api-scopes>
```

- why_it_matters: Pull or push a theme for a store with a matching cached store-auth session and no theme password configured.
- before: Authenticate theme commands through normal theme authentication; cached store-auth Admin API tokens were not used as a fallback.
- sources: <https://github.com/Shopify/cli/releases/tag/4.4.0>, <https://github.com/Shopify/cli/pull/7783>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-pull>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-push>, <https://shopify.dev/docs/api/shopify-cli/store/store-auth>
- gotchas: "Version: 4.4.0"; "--store <value>: Theme commands: target store URL; supply the store matching the cached session. Store auth: required; the store’s myshopify.com domain."; "--theme <value>: Theme ID or remote theme name; use to select the target theme for a non-interactive command."; "--password <value>: Theme Access password or Admin API token. The release note says an explicit value takes precedence over cached store auth."; "--scopes <value> (required): Comma-separated Admin API scopes to request when creating the stored store-auth token."; "Prerequisite: A cached `shopify store auth` session must match the target store for theme pull/push to use its Admin API token when `--password` is omitted."; "Prerequisite: `shopify store auth` stores an online access token for later reuse; rerun it if the token is missing, expired, or lacks needed scopes."; "The store-auth session must match the store."; "An explicit `--password` takes precedence over the cached store-auth token."; "Multi-environment theme configs can omit `password` when the matching store-auth cache session satisfies the requirement."

### shopify doc fetch downloads Shopify.dev Markdown documentation (2026-06-23)
- slug: shopify-doc-fetch-downloads-shopify-dev-markdown-documentation-fd118c81e747
- score: 0.96

How to use it:

When implementing or debugging a Shopify project and you need a Shopify.dev document, run `shopify doc fetch --url <shopify.dev-url>` to print its Markdown; use `--output <path>` to save it to a file.

Examples:

```
shopify doc fetch --url https://shopify.dev/docs/api/shopify-cli
```

```
shopify doc fetch --url https://shopify.dev/docs/api/shopify-cli --output docs/shopify-cli.md
```

- why_it_matters: Fetch Shopify.dev documentation in Markdown while implementing or debugging code in a Shopify project.
- sources: <https://github.com/Shopify/cli/releases/tag/4.3.0>, <https://github.com/Shopify/cli/pull/7766>
- gotchas: "Version: 4.3.0"; "--url <url> (required): Shopify.dev URL of the document to fetch; only shopify.dev and its subdomains are allowed."; "--output <path>: Write the Markdown to a file instead of stdout; creates missing parent directories."; "Prerequisite: Requires network access. The public endpoint needs no authentication, app, or login."

### shopify app init supports non-interactive setup (2026-04-02)
- slug: shopify-app-init-supports-non-interactive-setup-6634e9da40cf
- score: 0.99

How to use it:

When initializing an app without prompts, provide `--name` and `--organization-id`; with a Partners token, `--name` can be used without the organization ID. Add `--template` and, for a multi-flavor template, `--flavor`.

Examples:

```
shopify app init --organization-id <org-id> --name test --template remix --flavor javascript | cat
```

```
shopify app init --organization-id <org-id> --name test --template none | cat
```

```
export SHOPIFY_CLI_PARTNERS_TOKEN=<your-cli-token>
shopify app init --name test --template none | cat
```

- why_it_matters: Initialize a new Shopify app in a script or agent workflow that must avoid interactive prompts.
- before: `app init` had interactive prompts for organization selection, app selection/linking, and app naming that could not be bypassed.
- sources: <https://github.com/Shopify/cli/releases/tag/3.93.0>, <https://github.com/Shopify/cli/pull/6640>, <https://github.com/Shopify/cli/blob/3.93.0/packages/cli/README.md>, <https://github.com/Shopify/cli/tree/3.93.0>
- gotchas: "Version: 3.93.0"; "--name=<value> / SHOPIFY_FLAG_NAME (required): Name for the new app; skips app selection and creates a new app with this name."; "--organization-id=<value> / SHOPIFY_FLAG_ORGANIZATION_ID (required): Organization ID; suppresses organization selection. Use the ID in the Dev Dashboard URL. Omit when using a Partners token."; "--template=<value> / SHOPIFY_FLAG_TEMPLATE (required): Template to use; accepts `reactRouter`, `remix`, `none`, or a GitHub repository reference."; "--flavor=<value> / SHOPIFY_FLAG_TEMPLATE_FLAVOR: Selects a flavor of the chosen template; provide it when the template offers multiple flavors."; "SHOPIFY_CLI_PARTNERS_TOKEN: Partners token that permits omitting `--organization-id` with `--name`."; "Prerequisite: Use Shopify CLI 3.93.0 or later for this change."; "Prerequisite: Install Node.js and npm or another package manager to use Shopify CLI."; "The organization ID must be supplied unless using a partners token."; "The organization ID can be found in the Dev Dashboard URL."; "Docs conflict: Current Shopify docs describe non-interactive requirements that differ from the 3.93.0 release: they say `--name` and `--organization-id` are required unless `--client-id` is supplied, and list different template options. This card reflects version 3.93.0."

### shopify app validate checks app and extension configuration (2026-04-02)
- slug: shopify-app-validate-checks-app-and-extension-configuration-c01622f103f5
- score: 0.97

How to use it:

When you need to check an app configuration and extension configurations against their schemas, run `shopify app validate` with the selected app context; use the listed flags to choose the app directory, config, or client ID, or reset settings.

Examples:

```
shopify app validate [--client-id <client-id> | -c <config>] [--no-color] [--path <app-directory>] [--reset] [--verbose]
```

- why_it_matters: Check an app repository's configuration and extension TOML files for schema errors without running `dev` or `deploy`.
- before: Run `shopify app dev` or `shopify app deploy` to trigger configuration validation as part of those workflows.
- sources: <https://github.com/Shopify/cli/releases/tag/3.93.0>, <https://github.com/Shopify/cli/pull/6934>, <https://github.com/Shopify/cli/blob/3.93.0/packages/cli/README.md>, <https://shopify.dev/docs/api/shopify-cli>
- gotchas: "Version: 3.93.0"; "--client-id <value>: Client ID of your app."; "-c, --config <value>: Name of the app configuration; environment variable: SHOPIFY_FLAG_APP_CONFIG."; "--path <value>: Path to your app directory."; "--reset: Reset all your settings."; "--no-color: Disable color output."; "--verbose: Increase output verbosity."; "Prerequisite: Shopify CLI installed. General CLI requirements: Node.js 22.12 or higher, a Node.js package manager (npm, Yarn 1.x, or pnpm), and Git 2.28.0 or higher."; "The command links to the user's app using the linked app context."; "Docs conflict: Current Shopify docs use `shopify app config validate`; the 3.93.0 release documentation specifies `shopify app validate`. Current docs also list flags absent from 3.93.0. Used the versioned 3.93.0 README for the card’s command and flags."

### shopify store auth and execute run store-scoped Admin API GraphQL (2026-04-02)
- slug: shopify-store-auth-and-execute-run-store-scoped-admin-api-graphql-7519fe0db2bf
- score: 0.98

How to use it:

When a repository has no local Shopify app project, authenticate the store with the required Admin API scopes, then execute the GraphQL query using that stored auth. Add `--allow-mutations` for write operations.

Examples:

```
shopify store auth --store <store.myshopify.com> --scopes <comma-separated-scopes>
```

```
shopify store execute --store <store.myshopify.com> --query '<GraphQL query or mutation>'
```

- why_it_matters: Run a store-scoped Admin API GraphQL query or mutation from a repository that does not contain a local Shopify app project.
- sources: <https://github.com/Shopify/cli/releases/tag/3.93.0>, <https://github.com/Shopify/cli/pull/7122>, <https://shopify.dev/docs/api/shopify-cli/store/store-auth>, <https://shopify.dev/docs/api/shopify-cli/store/store-execute>
- gotchas: "Version: 3.93.0"; "`store auth --store` (required): The store’s myshopify.com domain."; "`store auth --scopes` (required): Comma-separated Admin API scopes to request for the app."; "`store execute --store` (required): The store’s myshopify.com domain."; "`store execute --query` / `-q`: GraphQL query or mutation as a string. Mutually exclusive with `--query-file`."; "`store execute --query-file`: Path to a file containing the GraphQL query or mutation. Mutually exclusive with `--query`."; "`store execute --variables` / `-v`: GraphQL variable values in JSON format. Mutually exclusive with `--variable-file`."; "`store execute --variable-file`: Path to a JSON file containing GraphQL variables. Mutually exclusive with `--variables`."; "`store execute --allow-mutations`: Allows GraphQL mutations to run against the store; required for write operations."; "Prerequisite: Run `shopify store auth` first to create stored authentication. Re-run it if the token is missing, expired, or lacks required scopes."; "Prerequisite: Request the Admin API scopes needed by the operation during authentication."; "Authentication uses a PKCE OAuth flow and stores online per-user auth for later store commands."; "Re-run `shopify store auth` if the stored token is missing, expires, or no longer has the required scopes."; "Write operations require `--allow-mutations`."

### shopify theme commands accept --listing (2026-02-20)
- slug: shopify-theme-commands-accept-listing-b94bfdab8b21
- score: 0.92

How to use it:

For multi-preset themes, use `--listing <preset-name>` to apply preset files from `listings/[preset-name]` when running `theme dev`, `theme push`, or `theme share`.

Examples:

```
shopify theme dev --listing <preset-name>
```

```
shopify theme push --listing <preset-name>
```

```
shopify theme share --listing <preset-name>
```

- why_it_matters: Develop, publish, or share a theme listing using the Shopify theme CLI.
- sources: <https://github.com/Shopify/cli/releases/tag/3.91.0>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-dev>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-push>, <https://shopify.dev/docs/api/shopify-cli/theme/theme-share>, <https://shopify.dev/docs/storefronts/themes/tools/cli>
- gotchas: "Version: 3.91.0"; "--listing <value>: Listing preset for multi-preset themes; applies preset files from `listings/[preset-name]`."; "Prerequisite: Run `theme dev` and `theme push` from a directory matching Shopify's default theme folder structure."; "Prerequisite: For custom app token authentication, the app needs `read_themes` and `write_themes` scopes. Theme Access passwords or Shopify account credentials are also documented authentication methods."

### Shopify CLI adds app execute and app bulk commands (2026-02-11)
- slug: shopify-cli-adds-app-execute-and-app-bulk-commands-fd5fc939230c
- score: 0.96

How to use it:

When you’re working in a Shopify app and need to query the Admin API, run `shopify app execute` from the app directory with a GraphQL query and, optionally, a store domain. For large data sets, use `shopify app bulk execute` instead.

Examples:

```
shopify app execute --query '<GraphQL query>' [--store <store.myshopify.com>]
```

```
shopify app bulk execute --watch --query '<bulk GraphQL query>' [--store <store.myshopify.com>]
```

- why_it_matters: Run an Admin API query while working on a Shopify app.
- sources: <https://github.com/Shopify/cli/releases/tag/3.90.1>, <https://shopify.dev/docs/apps/build/apis/graphql-admin/api-exploration/admin-cli-app-execute>, <https://shopify.dev/docs/api/shopify-cli/app/app-execute>, <https://shopify.dev/docs/api/shopify-cli/app/app-bulk-execute>
- gotchas: "Version: 3.90.1"; "--query <value> (required): GraphQL query or mutation as a string; use either this or `--query-file`."; "--query-file <value> (required): Path to a file containing the GraphQL query or mutation; mutually exclusive with `--query`."; "--store <value>: Store’s myshopify.com domain. The app must be installed there; if omitted, the CLI prompts for a store. The guide says the default is the last-used dev store."; "--variables <value>: GraphQL variable values in JSON format; mutually exclusive with `--variable-file`."; "--variable-file <value>: Path to a JSON file containing GraphQL variables; mutually exclusive with `--variables`."; "--version <value>: Admin API version; defaults to the latest stable version."; "--watch: For `app bulk execute`, wait for the bulk operation results before exiting; defaults to false."; "Prerequisite: Run the command from the root of the app directory. Shopify’s guide requires Shopify CLI, the necessary API access scopes, and the app installed on the store."; "Prerequisite: The guide currently says to install the latest Shopify CLI; it does not give a minimum CLI version."

### Shopify CLI can skip the local dev console when opening a preview link (2026-01-29)
- slug: shopify-cli-can-skip-the-local-dev-console-when-opening-a-preview-link-30b1afadff95
- score: 0.90

How to use it:

When running `shopify app dev`, set `SHOPIFY_SKIP_LOCAL_DEV_CONSOLE=1` and leave `SHOPIFY_CLI_1P_DEV` unset to open Admin from the preview link. [Shopify CLI PR #6786](https://github.com/Shopify/cli/pull/6786)

Examples:

```
SHOPIFY_SKIP_LOCAL_DEV_CONSOLE=1 pnpm shopify app dev
```

```
shopify app dev [flags]
```

- why_it_matters: When running `shopify app dev` and opening its preview link, open Admin instead of the local dev console.
- sources: <https://github.com/Shopify/cli/releases/tag/3.90.0>, <https://github.com/Shopify/cli/pull/6786>, <https://shopify.dev/docs/api/shopify-cli/app/app-dev>, <https://shopify.dev/docs/api/shopify-cli>
- gotchas: "Version: 3.90.0"; "SHOPIFY_SKIP_LOCAL_DEV_CONSOLE=1: Skips opening the local dev console from the preview link."; "SHOPIFY_CLI_1P_DEV: Must not be set for the skip behavior described in the PR to apply."; "Prerequisite: Shopify CLI requirements: Node.js 22.12+, a Node.js package manager (npm, Yarn 1.x, or pnpm), and Git 2.28.0+."; "Prerequisite: `shopify app dev` previews on a development store."; "The behavior is conditional on `SHOPIFY_CLI_1P_DEV=1` not being set."

### Shopify CLI GraphiQL allows custom Admin API headers (2026-01-29)
- slug: shopify-cli-graphiql-allows-custom-admin-api-headers-626e89a607a8
- score: 0.97

How to use it:

When debugging an Admin API query in Shopify CLI GraphiQL, add `Shopify-Search-Query-Debug=1` in the header editor to forward that custom header to the Admin API. The editor is enabled in CLI GraphiQL; safe custom headers are forwarded while filtered headers are blocked.

Examples:

```
shopify app dev
# In GraphiQL, add Shopify-Search-Query-Debug: 1 in the header editor.
```

- why_it_matters: When debugging an Admin API query from the CLI's GraphiQL interface, pass a custom debugging header.
- before: CLI GraphiQL did not allow passing custom headers; its header editor had been disabled.
- sources: <https://github.com/Shopify/cli/releases/tag/3.90.0>, <https://github.com/Shopify/cli/pull/6703>, <https://shopify.dev/docs/apps/build/apis/graphql-admin/api-exploration/admin-graphiql-explorer>, <https://shopify.dev/docs/api/shopify-cli/app/app-graphiql>
- gotchas: "Version: 3.90.0"; "Shopify-Search-Query-Debug: Example custom header allowed through to the Admin API for debugging."; "isHeadersEditorEnabled (required): GraphiQL component setting enabled to show the header editor."; "Prerequisite: Use Shopify CLI's local GraphiQL instance while running `shopify app dev`; it authenticates as the app and has the app's access scopes."; "Prerequisite: The app must be installed on the store."; "Problematic browser and hop-by-hop headers are filtered; proxy-controlled headers are not forwarded."

### Shopify CLI reads `extensions.supported_features.offline_mode` from TOML (2026-01-29)
- slug: shopify-cli-reads-extensions-supported-features-offline-mode-from-toml-01d14171d421
- score: 0.93

How to use it:

For a POS extension that supports offline mode, set `offline_mode = true` under `[extensions.supported_features]` in its TOML, then deploy the app with `pnpm shopify app deploy --path <PATH_TO_APP>`.

Examples:

```
[extensions.supported_features]
offline_mode = true
```

```
pnpm shopify app deploy --path <PATH_TO_APP>
```

- why_it_matters: When declaring that a POS extension supports offline mode, set the feature in its TOML and deploy the app.
- sources: <https://github.com/Shopify/cli/releases/tag/3.90.0>, <https://github.com/Shopify/cli/pull/6765>, <https://shopify.dev/docs/api/shopify-cli/app/app-deploy>, <https://shopify.dev/docs/api/shopify-cli>
- gotchas: "Version: 3.90.0"; "extensions.supported_features.offline_mode: Boolean indicating whether the extension supports offline mode; the release note describes this for POS extensions."; "--path <value>: Path to the app directory."; "Prerequisite: Shopify CLI requirements: Node.js 22.12 or higher, a Node.js package manager (npm, Yarn 1.x, or pnpm), and Git 2.28.0 or higher."; "Prerequisite: The CLI deploy command builds the app, then deploys its configuration and extensions."; "The described `offline_mode` support is for POS extensions."; "The supplied text says the backend is already wired up to support this."

### shopify.app.toml webhook subscriptions accept an optional name (2026-01-20)
- slug: shopify-app-toml-webhook-subscriptions-accept-an-optional-name-c5bf7c44ad46
- score: 0.94

How to use it:

When configuring a webhook subscription in `shopify.app.toml`, add a non-empty `name` to label it; then run `shopify app deploy` to deploy the configuration. [Webhook docs](https://shopify.dev/docs/apps/build/webhooks/subscribe)

Examples:

```
[[webhooks.subscriptions]]
name = "products-create"
topics = ["products/create"]
uri = "https://example.com/webhooks"

shopify app deploy
```

- why_it_matters: Configure a webhook subscription with a name in an app's `shopify.app.toml`.
- sources: <https://github.com/Shopify/cli/releases/tag/3.89.0>, <https://github.com/Shopify/cli/pull/6576>, <https://shopify.dev/docs/apps/build/webhooks/subscribe>
- gotchas: "Version: 3.89.0"; "name: Subscription label; Shopify echoes it in the `X-Shopify-Name` header. The current docs specify alphanumeric characters, hyphens, or underscores, up to 50 characters."; "topics (required): One or more webhook topic names to subscribe to."; "uri (required): Delivery destination: HTTPS URL, AWS EventBridge ARN, or Google Pub/Sub URI."; "Prerequisite: Each subscribed topic requires its corresponding access scope."; "The `name` field is optional and must be a non-empty string if provided."; "Docs conflict: The current docs limit `name` to 50 characters and allow only alphanumeric characters, hyphens, and underscores; the 3.89.0 release note only specifies a non-empty string. These added constraints are documented for a later/current version and are not applied here."
