> ## 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.

# EmailTemplateProductsSection

> Product recommendations. The template trigger must provide Cart Context. `schemaFieldName` defaults to `cartContext`. `recommendedProductFilterId` is a product filter id, or `00000000feedb10cfeedb10c` to show the products this trigger already carries. Shoppable products cannot use that sentinel.

<ResponseField name="checkoutButton" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-inline-button">EmailTemplateInlineButton!</a>} required>
  Checkout button. Shown on abandonment triggers.

  <Expandable title="fields" lazyRender>
    <ResponseField name="buttonLink" type="String">
      Optional fixed URL. Null when unset.
    </ResponseField>

    <ResponseField name="buttonText" type="String!" required>
      Label shown on the button.
    </ResponseField>

    <ResponseField name="cornerRadius" type="Int!" required>
      Corner radius in pixels.
    </ResponseField>

    <ResponseField name="fillColor" type="String!" required>
      Button fill color.
    </ResponseField>

    <ResponseField name="fontFamily" type="String!" required>
      One of the email builder's fonts (Arial, Courier New, Georgia, Lucida Sans Unicode, Tahoma, Times New Roman, Trebuchet MS, Verdana, Nunito, Poppins, Raleway, Inter, Pacifico) or a font from the store's brand kit. A single name gets a fallback of the same kind; a comma-separated list is used as written.
    </ResponseField>

    <ResponseField name="fontSize" type="Int!" required>
      Label font size in pixels.
    </ResponseField>

    <ResponseField name="fullWidth" type="Boolean!" required>
      Whether the button stretches to the card width.
    </ResponseField>

    <ResponseField name="horizontalAlignment" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-alignment">EmailTemplateAlignment!</a>} required>
      Horizontal alignment of the button.
    </ResponseField>

    <ResponseField name="padding" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-padding">EmailTemplatePadding!</a>} required>
      Padding inside the button.

      <Expandable title="fields" lazyRender>
        <ResponseField name="bottom" type="Int!" required>
          Bottom padding in pixels.
        </ResponseField>

        <ResponseField name="left" type="Int!" required>
          Left padding in pixels.
        </ResponseField>

        <ResponseField name="right" type="Int!" required>
          Right padding in pixels.
        </ResponseField>

        <ResponseField name="top" type="Int!" required>
          Top padding in pixels.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="strokeColor" type="String!" required>
      Button border color.
    </ResponseField>

    <ResponseField name="strokeWeight" type="Int!" required>
      Border width in pixels.
    </ResponseField>

    <ResponseField name="textColor" type="String!" required>
      Label color.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="columnCount" type="Int!" required>
  How many products sit in a row when layout is columns.
</ResponseField>

<ResponseField name="fontFamily" type="String!" required>
  One of the email builder's fonts (Arial, Courier New, Georgia, Lucida Sans Unicode, Tahoma, Times New Roman, Trebuchet MS, Verdana, Nunito, Poppins, Raleway, Inter, Pacifico) or a font from the store's brand kit. A single name gets a fallback of the same kind; a comma-separated list is used as written.
</ResponseField>

<ResponseField name="horizontalAlignment" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-alignment">EmailTemplateAlignment!</a>} required>
  Card alignment when the layout is columns.
</ResponseField>

<ResponseField name="id" type="ID!" required>
  Stable id of this section (`blockId` in storage).
</ResponseField>

<ResponseField name="imageAspectRatio" type="Float">
  Width divided by height. Null keeps the image default.
</ResponseField>

<ResponseField name="imageCornerRadius" type="Int!" required>
  Image corner radius in pixels.
</ResponseField>

<ResponseField name="imageObjectFit" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-object-fit">EmailTemplateObjectFit</a>}>
  How the image fills its box. Null if unset.
</ResponseField>

<ResponseField name="imageSize" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-image-size">EmailTemplateImageSize!</a>} required>
  Image size when the layout is rows.
</ResponseField>

<ResponseField name="kind" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-section-kind">EmailTemplateSectionKind!</a>} required>
  Always PRODUCTS.
</ResponseField>

<ResponseField name="layoutType" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-cart-layout-type">EmailTemplateCartLayoutType</a>}>
  Rows or columns. Null if unset.
</ResponseField>

<ResponseField name="lineItemButtons" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-inline-button">EmailTemplateInlineButton!</a>} required>
  Button on each product.

  <Expandable title="fields" lazyRender>
    <ResponseField name="buttonLink" type="String">
      Optional fixed URL. Null when unset.
    </ResponseField>

    <ResponseField name="buttonText" type="String!" required>
      Label shown on the button.
    </ResponseField>

    <ResponseField name="cornerRadius" type="Int!" required>
      Corner radius in pixels.
    </ResponseField>

    <ResponseField name="fillColor" type="String!" required>
      Button fill color.
    </ResponseField>

    <ResponseField name="fontFamily" type="String!" required>
      One of the email builder's fonts (Arial, Courier New, Georgia, Lucida Sans Unicode, Tahoma, Times New Roman, Trebuchet MS, Verdana, Nunito, Poppins, Raleway, Inter, Pacifico) or a font from the store's brand kit. A single name gets a fallback of the same kind; a comma-separated list is used as written.
    </ResponseField>

    <ResponseField name="fontSize" type="Int!" required>
      Label font size in pixels.
    </ResponseField>

    <ResponseField name="fullWidth" type="Boolean!" required>
      Whether the button stretches to the card width.
    </ResponseField>

    <ResponseField name="horizontalAlignment" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-alignment">EmailTemplateAlignment!</a>} required>
      Horizontal alignment of the button.
    </ResponseField>

    <ResponseField name="padding" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-padding">EmailTemplatePadding!</a>} required>
      Padding inside the button.

      <Expandable title="fields" lazyRender>
        <ResponseField name="bottom" type="Int!" required>
          Bottom padding in pixels.
        </ResponseField>

        <ResponseField name="left" type="Int!" required>
          Left padding in pixels.
        </ResponseField>

        <ResponseField name="right" type="Int!" required>
          Right padding in pixels.
        </ResponseField>

        <ResponseField name="top" type="Int!" required>
          Top padding in pixels.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="strokeColor" type="String!" required>
      Button border color.
    </ResponseField>

    <ResponseField name="strokeWeight" type="Int!" required>
      Border width in pixels.
    </ResponseField>

    <ResponseField name="textColor" type="String!" required>
      Label color.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="manuallySelectedProducts" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-manual-product">[EmailTemplateManualProduct!]!</a>} required>
  Products used when productSelectionType is MANUAL.

  <Expandable title="fields" lazyRender>
    <ResponseField name="productId" type="String!" required>
      Store product id.
    </ResponseField>

    <ResponseField name="variantId" type="String!" required>
      Store variant id.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="numberOfProducts" type="Int!" required>
  How many dynamic products to show. Ignored when the block uses products from this trigger.
</ResponseField>

<ResponseField name="productSelectionType" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-product-selection-type">EmailTemplateProductSelectionType!</a>} required>
  Dynamic recommendations or a hand-picked list.
</ResponseField>

<ResponseField name="provider" type={<a href="/docs/api-reference/v3/reference/marketing/product-filter-provider">ProductFilterProvider!</a>} required>
  Which of this account's stores the products come from.
</ResponseField>

<ResponseField name="recommendedProductFilterId" type="ID">
  Saved product filter id from productFilters, or 00000000feedb10cfeedb10c for the products this trigger already carries. Null when unset. Omit on update to leave it unchanged.
</ResponseField>

<ResponseField name="schemaFieldName" type="String">
  Cart Context key on this template's trigger. Defaults to cartContext.
</ResponseField>

<ResponseField name="sectionColor" type="String!" required>
  Section background color.
</ResponseField>

<ResponseField name="sectionPadding" type={<a href="/docs/api-reference/v3/reference/marketing/email-template-padding">EmailTemplatePadding!</a>} required>
  Padding around the section.

  <Expandable title="fields" lazyRender>
    <ResponseField name="bottom" type="Int!" required>
      Bottom padding in pixels.
    </ResponseField>

    <ResponseField name="left" type="Int!" required>
      Left padding in pixels.
    </ResponseField>

    <ResponseField name="right" type="Int!" required>
      Right padding in pixels.
    </ResponseField>

    <ResponseField name="top" type="Int!" required>
      Top padding in pixels.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="showButton" type="Boolean">
  Show the per-product button. Null if unset.
</ResponseField>

<ResponseField name="showCheckoutButton" type="Boolean">
  Show the checkout button on abandonment triggers that support it. Null if unset.
</ResponseField>

<ResponseField name="showImage" type="Boolean">
  Show product images. Null if unset.
</ResponseField>

<ResponseField name="showPrice" type="Boolean">
  Show prices. Null if unset.
</ResponseField>

<ResponseField name="showQuantity" type="Boolean">
  Show quantity. Null if unset.
</ResponseField>

<ResponseField name="showTitle" type="Boolean">
  Show product titles. Null if unset.
</ResponseField>

<ResponseField name="stackOnMobile" type="Boolean!" required>
  Stack columns on a narrow screen.
</ResponseField>

<ResponseField name="textColor" type="String!" required>
  Text color.
</ResponseField>

<ResponseField name="titleFontSize" type="Int">
  Title font size in pixels. Null if unset.
</ResponseField>


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