Skip to main content
Order confirmations, abandoned-cart reminders and digests all show a list whose length changes from one email to the next. Two blocks handle this for you: Both are in the Advanced blocks group of the block palette. Both read an array at a dotted path in the email’s data, usually under data.*, so they’re filled in for transactional emails and journeys. See Personalization for where that data comes from.
Campaign emails have no data, so a Repeater or Item List whose path starts with data. shows its “empty” text in a campaign. Campaigns can use data feeds instead: point the path at an array in global_feed or recipient_feed and the block fills in.

Item List

1

Add the block

Open Advanced blocks in the palette and add Item List.
2

Point it at your data

Under Data Source, set Items path to the array to list. It defaults to data.cart.items. For a Shopify order in a journey, use data.order.line_items.
3

Set the total and button

Under Total Row, set Total path (default data.cart.total). Under CTA Button, set the link. It can be a merge tag or Liquid, for example {{ data.cart.url }}.
4

Style it

Choose which columns to show (Show Image, Show Variant, Show Quantity), whether to show the header row, and fonts and colors for items and prices. Set the Currency symbol and the Text when there are no items.
Each item in the array can have these fields: title, variant_title, quantity, price and image_url.
On the canvas, the block uses its own Sample Items (Preview). Click + Add Sample Item to add more. View Sample JSON Payload shows the shape your API should send.

Repeater

A Repeater is a container: whatever you put inside it is repeated once per item.
1

Add a Repeater

Open Advanced blocks and add Repeater.
2

Choose the array

Set Repeats over to the path of the array, for example data.order.line_items (the default) or data.articles.
3

Add blocks inside it

Drop blocks into the Repeater’s area on the canvas (Drop the blocks to repeat here).
4

Insert item fields

Select a text block inside the Repeater and open Merge Tag. A Current item group lists every field of your sample data’s first item as {{ item.<field> }}.
Other settings:
  • Item variable: the name used inside the loop. It’s item by default, so fields are written {{ item.title }}.
  • Layout: Rows or Cards.
  • Max items (0 = all): limit how many items are shown.
  • Text when empty: shown once if the array is missing or empty.
  • Gap between items, background, border and padding.
You can also use {{ forloop.index }} inside a Repeater to print the item’s position (1, 2, 3…).

Sample data for the canvas

Both blocks need sample data to show something useful while you design:
  • The Repeater badge shows ×N with sample data when it finds an array at its path, and No sample data at this path when it doesn’t.
  • Set sample data in Preview as… under Template data. See Personalization.
  • If the template has no sample data of its own, the Preview data section of the block offers Copy sample order to this template, which saves a ready-made example order you can edit.
Paste a real payload from one of your recent sends with Load from a recent send… in the Preview as… panel. The field names in the Current item group then match your real data exactly.

Limits

  • The path must be a plain dotted path such as data.order.line_items. Liquid filters or expressions aren’t accepted there.
  • In the AMP version of an email, a Repeater’s contents are shown once, not per item.
  • The data sent with one email can be up to 256 KB and 32 levels deep.

Troubleshooting

A plain test send uses the sample data saved on the template. Open Preview as…, add sample data and click Save, or click Send test with this preview context to use it without saving.
The picker shows it only for blocks inside a Repeater. Inside one, the group always appears with at least {{ forloop.index }}. The item’s own fields appear only when the sample data (yours, or the built-in sample order when the template has none) has an array at the Repeater’s path.
The Item List prints the Currency symbol you set on the block before each price. It doesn’t read a currency from your data.