A product feed is a rule that picks products for each recipient at the moment their email is sent: what they looked at, what is in their cart, what people like them bought, or simply your best sellers. You design the email once; every subscriber gets their own products. Feeds work the same for Shopify and WooCommerce stores.
What you need
- A connected store with synced products (Integrations → your store → Sync products). Images, names, prices and links in the email come from this catalog.
- For "Recently viewed" and "Recommended for you": product views must be tracked. The Shopify app (web pixel) and the WooCommerce plugin do this automatically, and the website tracking script does it for any other site. Views are only tied to a subscriber once the visitor is identified: they arrived through a link in one of your emails or submitted one of your forms.
The built-in feeds
Every account with a connected store gets these feeds. Find them under Integrations → Product feeds.
| Feed | Slug | What each recipient gets |
|---|---|---|
| Recently viewed | recently_viewed | Products they looked at in the last 30 days, newest first. Products they have since bought are left out. |
| In their cart | cart | Items in their latest open cart or checkout, with quantity and line total. Empty when the cart is empty. |
| Recommended for you | recommended | Products from the categories and brands they have viewed, carted or bought in the last 90 days. Never includes what they already own. |
| Best sellers | best_sellers | Your most-sold products over the last 90 days. Same for everyone. |
| New arrivals | new_arrivals | Newest products in your catalog. Same for everyone. |
Look-back windows, product counts and the in-stock rule can be changed on each feed.
The feeds fall back automatically: "Recently viewed" falls back to "Recommended for you", which falls back to "Best sellers", which falls back to "New arrivals". A brand-new subscriber with no history still gets a full block of relevant products. "In their cart" has no fallback on purpose: an empty cart hides the block instead of showing unrelated products.
Custom feeds
Click New feed to create your own:
- Category or brand: products from chosen categories or brands, most popular first. Categories come from your store (Shopify collections, product type and tags; WooCommerce product categories).
- Hand-picked: exactly the products you choose, in the order you choose.
- Any type can be limited with Min price / Max price, Only in-stock products, and a Max products cap.
- When this feed has nothing to show sets the fallback feed, or "Hide the block".
Each feed has a slug (for example accessories_under_50) which is what you reference in templates.
Test a feed on a real subscriber
At the top of the Product feeds page, type a subscriber's email and click Preview. You see exactly which products each feed would give that person right now, and which feed actually supplied them when a fallback kicked in. Leave the field empty to see what an unknown recipient gets.
Use a feed in the drag-and-drop editor
- Drag the Product feed (dynamic) block onto the canvas.
- Pick the feed, set the heading, number of products, columns (1 to 3) and image shape.
- Toggle price, "was" price for items on sale, and the button.
- Hide block when feed is empty is on by default, so a recipient with no matching products (and no fallback) never sees an empty gap.
Use Preview as subscriber in the block's panel to render the canvas for a real subscriber. The block, and {{firstName}}, update to that person's data. Clear it to go back to sample products. When a preview subscriber is set, Send test also renders the feeds for that subscriber.
If the same product would appear in two feed blocks in one email, it is only shown in the first one. Each block gets fresh products.
Use a feed in HTML templates
In the HTML editor, the merge tag menu has a Product feeds group that inserts a ready-made loop. The syntax is the same as for cart items, with feed.<slug> as the collection:
{% if feed.recently_viewed %}
<h2>Still thinking about these?</h2>
{% for item in feed.recently_viewed limit:4 %}
<a href="{{ item.url }}">
<img src="{{ item.image }}" width="140" alt="">
<p>{{ item.name }}</p>
<p>{{ item.price }} {{ item.currency }}</p>
</a>
{% endfor %}
{% endif %}
Fields on each item: name, url, image, price, compare_at_price, currency, vendor, category, product_id. The cart feed also has quantity and line_total. Wrap the loop in {% if feed.<slug> %} so the heading disappears when there is nothing to show.
Stores in more than one language
If your store runs in several languages (WooCommerce with WPML or Polylang, or Shopify with published translations), Sync products imports every language version and links them as one product. Views, carts and orders on any language version count for that product, and a product is never shown twice because it exists in three languages.
Each recipient gets product names and links in one language, decided in this order:
- The language fixed on the block (editor) or in the template (
{% for item in feed.recently_viewed lang:en %}) - The language set in the feed's rules (custom feeds)
- The subscriber's language field: a custom field named
language,lang,locale,preferred_language(or the local word, such assprog,keel,sprache) with a value likeen,en-US,English (EN)orEnglish - The language they last browsed your store in
- The store's default language
If a product has no version in that language, it is shown in the store's default language rather than left out.
The Product feeds page shows which languages your catalog is synced in, and the Preview language selector lets you check any subscriber in any language. In the editor the Product feed block gets a Language setting (only for multilingual stores): leave it on automatic for one email that adapts to every recipient, or fix it when you send separate campaigns per language.
Where feeds work
- Campaigns and automation emails built in the drag-and-drop editor
- HTML templates used in campaigns and on Send Email steps
- Test emails from the editor
The Browse Abandonment automation template is built around feeds: it triggers on repeated product views and its emails are meant to use the "Recently viewed" and "Recommended for you" blocks.
Common questions
Why does a subscriber get best sellers instead of their viewed products? We have no product views linked to that subscriber in the look-back window (30 days for "Recently viewed"). Either the views happened before they were identified, or the tracking script is not installed on the product pages. The Preview on the Product feeds page shows which feed supplied the products.
A product I deleted from the store still shows up. Run Sync products. A full sync marks products the store no longer returns as out of stock, so feeds stop using them, and removes them after 30 days. If the same product appears twice because it was deleted and re-created in the store, feeds treat rows with the same product URL as one product.
Do feeds slow down sending? No. Feed resolution runs inside the normal send and only the feeds a template actually references are resolved.