Skip to main content

Configure app extensions

When you generate an app extension, Shopify CLI creates a TOML configuration file named shopify.extension.toml in the extension's directory. This file defines how Shopify builds, serves, and deploys your extension.

This page describes the configuration that's common across extension types. Each extension type also documents its own configuration properties — refer to Configuration for each extension type to find the reference for the type you're building.

Extension configuration is separate from app configuration. App-level settings, such as access scopes, authentication, webhook subscriptions, and app proxies, are defined in shopify.app.toml. For those settings, refer to App configuration.


Shopify CLI builds and serves app extensions using information defined in a TOML file named shopify.extension.toml. The TOML file is located in a directory within the extensions/ directory of your app project.

The following example shows a shopify.extension.toml file that contains configuration settings for a checkout UI extension.

shopify.extension.toml

api_version = "2025-10"

[[extensions]]
name = "My UI extension"
description = "A UI extension"
handle = "my-ui-extension"
type = "ui_extension"
uid = "1aafc25d-8448-218e-9373-b3d91ac2a0af75f73e12"

[extensions.capabilities]
api_access = true
block_progress = true
network_access = true

[[extensions.targeting]]
module = "./src/CheckoutDynamicRender.js"
target = "purchase.checkout.block.render"

[[extensions.targeting.metafields]]
key = "my-key"
namespace = "my-namespace"

[settings]
[[settings.fields]]
key = "banner_title"
type = "single_line_text_field"
name = "Banner title"
description = "Enter a title for the banner"

Anchor to Tables and nested propertiesTables and nested properties

A shopify.extension.toml file is organized into tables, where each table is a group of related key-value pairs. A table's header tells you two things:

  • Single table or array: Single brackets around a header (for example, [extensions.capabilities]) define a single table that appears once. Double brackets (like [[extensions]] or [[extensions.targeting]]) define an array of tables that can repeat, where each header of the same name adds another entry. A key with no header, like api_version = "2025-10", is top-level.

  • How properties are nested: A dotted header denotes a parent-child relationship. For example, [extensions.capabilities] is the capabilities table inside an extension. When the parent repeats, a nested table attaches to the most recent parent entry, so [[extensions.targeting.metafields]] belongs to [[extensions.targeting]] above it.

Indentation is optional and ignored by Shopify CLI. Generated files indent nested tables only for readability.


Anchor to Configuration for each extension typeConfiguration for each extension type

Each extension type documents its own configuration properties, along with an annotated example shopify.extension.toml. Use the following list to find the configuration reference for the extension type that you're building.


For some extension types, you can define fields in [[settings.fields]] that merchants use to configure your extension in the editor. Each of these settings can include validation options, which apply additional constraints to the value that the setting can store, such as a minimum or maximum value, or a regular expression. A setting's type determines the available validation options.

Include a validation option for a setting using the validation name and a corresponding value. The appropriate value depends on the setting type that the validation applies to.

Validation optionDescriptionSupported typesExample
Minimum lengthThe minimum length of a text value.single_line_text_field, multi_line_text_fieldname = "min" value = "8"
Maximum lengthThe maximum length of a text value.single_line_text_field, multi_line_text_fieldname = "max" value = "25"
Regular expressionA regular expression. Shopify supports RE2.single_line_text_field, multi_line_text_fieldname = "regex" value = "(@)(.+)$"
ChoicesA list of up to 128 predefined options that limits the values allowed for the setting.single_line_text_fieldname = "choices" value = '["red", "green", "blue"]'
Minimum dateThe minimum date in ISO 8601 format.datename = "min" value = "2022-01-01"
Maximum dateThe maximum date in ISO 8601 format.datename = "max" value = "2022-03-03"
Minimum datetimeThe minimum date and time in ISO 8601 format.date_timename = "min" value = "2022-01-01T00:00:00"
Maximum datetimeThe maximum date and time in ISO 8601 format.date_timename = "max" value = "2022-03-03T00:00:00"
Minimum integerThe minimum value of an integer.number_integername = "min" value = "0"
Maximum integerThe maximum value of an integer.number_integername = "max" value = "100"
Minimum decimalThe minimum value of a decimal number.number_decimalname = "min" value = "0.5"
Maximum decimalThe maximum value of a decimal number.number_decimalname = "max" value = "99.99"
Maximum precisionThe maximum number of decimal places to store for a decimal number.number_decimalname = "max_precision" value = "2"

A target is an identifier in shopify.extension.toml that specifies where you're injecting code into Shopify APIs, or other parts of the Shopify platform.

Each target is composed of three to four namespaces. The name begins with a broad Shopify context and ends with the behavior of the extensible element. For example, a checkout UI extension that renders a shipping address form has a target named purchase.checkout.delivery-address.render-before:

  • purchase: The broad Shopify context.
  • checkout: The targeted page.
  • delivery-address: The element that the extension will be positioned near.
  • render-before: An action verb that describes the behavior of the extensible element.

The following table provides links to documentation on the supported targets associated with each app extension type.

Extension typeDocumentation on supported targets
Admin UIAdmin UI targets
App Home UIadmin.app.home.render
Checkout UICheckout UI targets
Customer Account UICustomer Account UI targets
POS UIPOS UI targets
Product configurationProduct configuration app extensions use the admin.product-details.configuration.render or admin.product-variant-details.configuration.render target.
FunctionsFunctions targets

Anchor to Differences in TOML file namesDifferences in TOML file names

TOML file names can differ, depending on when you generated an extension:

  • If you generated an extension before July 26, 2023, then your TOML file maps to one of the following names:

    • Checkout UI: shopify.ui.extension.toml
    • Bundles UI extension: shopify.ui.extension.toml (maps to a product configuration extension)
    • Post-purchase UI: shopify.ui.extension.toml
    • Product subscription: shopify.ui.extension.toml
    • Web pixel: shopify.ui.extension.toml
    • Shopify POS UI: shopify.ui.extension.toml
    • Theme app extensions: shopify.theme.extension.toml
  • If you generated an extension after July 26, 2023, then the TOML file is named shopify.extension.toml.


Was this page helpful?