> ## Documentation Index
> Fetch the complete documentation index at: https://developers.redo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# emailTemplateVariableCatalog

> The static email-template variable grammar for a trigger: template variable names, Url keys, context objects, and table collection paths. Does not include this store's discounts, saved sections, or product filters. UNKNOWN returns empty lists.

**Required scopes:** [`marketing_templates_read`](/docs/api-reference/v3/reference/scopes#scope-marketing_templates_read)

## Arguments

<ResponseField name="trigger" type={<a href="/docs/api-reference/v3/reference/marketing/marketing-trigger">MarketingTrigger!</a>} required>
  Template trigger to list variables for. UNKNOWN is not a picker and returns empty lists.
</ResponseField>

## Returns

<ResponseField name="emailTemplateVariableCatalog" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-variable-catalog">EmailTemplateVariableCatalog!</a>} required>
  Static trigger grammar for email templates: template variable names, Url keys, context objects, and table collection paths. Same for every store. Does not list discounts, saved sections, or product filters.

  <Expandable title="fields" lazyRender>
    <ResponseField name="contextObjects" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-context-object">[EmailTemplateContextObject!]!</a>} required>
      Structured objects blocks bind (`cartContext`, `reviewRequest`, `tracker`, `orderSummary`).

      <Expandable title="fields" lazyRender>
        <ResponseField name="blockBindings" type="[String!]!" required>
          Typed or upcoming block payload keys that bind this object (`trackableSummary`, `products`, `qrCode`, …).
        </ResponseField>

        <ResponseField name="dataType" type="String!" required>
          Schema data type, e.g. `Trackable Summary` or `Cart Context`.
        </ResponseField>

        <ResponseField name="description" type="String!" required>
          What the object holds.
        </ResponseField>

        <ResponseField name="key" type="String!" required>
          CamelCase key to store on the block's `schemaFieldName`, e.g. `orderSummary`.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="tableCollections" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-table-collection">[EmailTemplateTableCollection!]!</a>} required>
      Paths a DYNAMIC table may use as `rowCollection`. Cell bindings stay empty until nested item schemas exist.

      <Expandable title="fields" lazyRender>
        <ResponseField name="cellBindings" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-table-cell-binding">[EmailTemplateTableCellBinding!]!</a>} required>
          Known `{{ }}` paths on each row. Empty until nested item schemas exist; empty when `openEnded` is true.

          <Expandable title="fields" lazyRender>
            <ResponseField name="description" type="String!" required>
              What the path resolves to on each row.
            </ResponseField>

            <ResponseField name="expression" type="String!" required>
              Expression to put in a dynamic cell, including the `item` alias, e.g. `item.product.title`. Write `{{ item.product.title }}`.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="description" type="String!" required>
          What the collection holds.
        </ResponseField>

        <ResponseField name="itemAlias" type="String!" required>
          Row alias each row is bound as. Always `item`; cells must use `{{ item.… }}`.
        </ResponseField>

        <ResponseField name="itemDataType" type="String!" required>
          Element type, e.g. `Line Item`, `Trackable Line Item`, or `Object`.
        </ResponseField>

        <ResponseField name="openEnded" type="Boolean!" required>
          True when nested array paths under this object are merchant-defined (custom-event `properties`). Append the array key to `path`.
        </ResponseField>

        <ResponseField name="path" type="String!" required>
          Value for `rowCollection`, e.g. `relevantLineItems` or `properties.order_products`.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="trigger" type={<a href="/docs/api-reference/v3/reference/marketing/marketing-trigger">MarketingTrigger!</a>} required>
      The trigger this catalog was built for.
    </ResponseField>

    <ResponseField name="urlKeys" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-url-key">[EmailTemplateUrlKey!]!</a>} required>
      CamelCase Url / Maybe Url keys for DYNAMIC\_VARIABLE button and image bindings.

      <Expandable title="fields" lazyRender>
        <ResponseField name="dataType" type="String!" required>
          `Url` or `Maybe Url`.
        </ResponseField>

        <ResponseField name="description" type="String!" required>
          What the URL points at.
        </ResponseField>

        <ResponseField name="key" type="String!" required>
          CamelCase key to store on `schemaFieldName` / `clickthroughSchemaFieldName`, e.g. `trackingLink`.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="variables" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-variable">[EmailTemplateVariable!]!</a>} required>
      Names for `{{ }}` in subject, preview text, text blocks, and other authored strings.

      <Expandable title="fields" lazyRender>
        <ResponseField name="dataType" type="String!" required>
          Schema data type, including Maybe/Multiple prefixes, e.g. `Maybe Text`.
        </ResponseField>

        <ResponseField name="description" type="String!" required>
          What the value holds at send time.
        </ResponseField>

        <ResponseField name="displayName" type="String!" required>
          Merchant-facing label.
        </ResponseField>

        <ResponseField name="insertable" type="Boolean!" required>
          True when the email/SMS insert-variable picker would show this name. Hidden and structured fields still resolve if authored.
        </ResponseField>

        <ResponseField name="integrationGated" type="Boolean!" required>
          True when send-time resolution depends on a connected integration. The name is still listed; a missing integration yields an empty value.
        </ResponseField>

        <ResponseField name="key" type="String!" required>
          CamelCase schema key this name came from, e.g. `customerFirstName`.
        </ResponseField>

        <ResponseField name="name" type="String!" required>
          Snake\_case identifier, e.g. `customer_first_name`. Write `{{ name }}`.
        </ResponseField>

        <ResponseField name="source" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-variable-source">EmailTemplateVariableSource!</a>} required>
          Whether this name comes from the trigger, renderer, or store.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Example

```graphql theme={null}
query {
  emailTemplateVariableCatalog(trigger: ADDRESS_VERIFICATION_FAILED) {
    trigger
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.