Build more relevant product feeds
Generated by Klaviyo AI
Custom product feeds combine Klaviyo’s AI-powered recommendations with catalog lookups and Django templates to control how products appear in emails. The approach supports richer imagery, dynamic pricing, additional catalog data, and reusable layouts across flows and campaigns.
- Personalized recommendations: Klaviyo uses browsing, click, and purchase behavior to rank products each subscriber is likely to want next.
- Flexible presentation: Catalog lookups and Django templates provide control over images, titles, prices, descriptions, vendor names, and variants.
- Dynamic merchandising: Custom logic can display sale details automatically and exclude out-of-stock, discontinued, or otherwise unsuitable products.
As head of email and retention at FABO, a holistic ecommerce growth partner for lifestyle and apparel brands, I spend a lot of my time inside brands’ product feeds.
Most of them are showing customers less than they could be.
First, a level-set: product feeds take in data from your product catalog and subscriber behavior (both purchasing and onsite behavior) and use this information to provide custom product recommendations for your subscribers.
The approach I’ll walk you through both is and isn’t AI. The customization itself runs on Klaviyo’s catalog lookups and templating tools. But the data behind it, the part that decides which products actually show up for each person is Klaviyo's built-in AI.
Put those two pieces together and you get product feeds that feel hand-built for every subscriber, without spending hours designing every email.
Start with Klaviyo’s default product feed block
Klaviyo’s default drag-and-drop product feed block is a solid foundation. You can choose how many products to show, where the button sits, and what the button says. For a lot of brands, that’s enough.
But for lifestyle and apparel brands specifically, it usually isn’t. Klaviyo pulls the first image in a product’s photo array, and for most apparel brands, that first image is a plain product shot on a white background. The same brand usually has a full library of images showing that product on a model, in a real setting, and styled the way it’s meant to be worn. But none of that ends up in the default feed.
The default block also places a hard ceiling on what you can customize. You can move elements around and change the copy on the button, but you can’t restyle the product name or price, or add another data point, like a brand name or a short description. If your merchandising needs anything more specific than that, you’ve hit the edge of what the default block can do.
Send personalized product recommendations even if you don’t know your subscribers
Here’s where the actual intelligence comes in. When you build a product feed in Klaviyo, you can pull from personalized product recommendations, a feature that uses AI to surface the items a specific person is most likely to want next, based on what they’ve browsed, clicked, and bought.
This feature improves rapidly: what it recommends now is sharper than it was even a few months ago, and it’s the piece that makes personalization possible at scale. You don’t need to know anything about a brand-new subscriber to send them something relevant. Klaviyo already knows what they’ve looked at, and it can hand you a ranked list of what they’re likely to want next.
That’s the data source. Everything else is about how you choose to display it.
You don’t need to know anything about a brand-new subscriber to send them something relevant.
How to build a custom product feed with catalog lookups and Django
Instead of dropping in the standard block, I build my own tables using Klaviyo’s catalog lookups, paired with Django, the templating language behind them. It sounds more technical than it is: you’re calling specific catalog fields into an email template and formatting each one however you want, row by row.
Once that’s set up, a few things become possible that you can’t do with the default block:
- You can choose which image shows. Instead of settling for whatever sits first in the array, you can call a specific image, like the on-model shot instead of the packshot, by referencing its position in your image list.
- You can build in your own pricing logic. A row can check whether a product has a compare-at price, then automatically show the original price with a strikethrough next to the sale price, or calculate and display the percentage saved. All of it updates on its own as prices change, so no one has to go back and edit each email by hand.
- You can pull in any other field your catalog has. “Vendor name” is one I use often for retailers that carry more than one brand, for example. “Description” works well for products that need more context. If it's in your catalog, you can include it.
- You can clean up messy product titles. If your product titles look like "Premium hoodie—ice blue / white," you can split that string and show the product name and the variant separately, styled however fits your template.
- You can control exactly what doesn’t show. That might mean out-of-stock items, discontinued products, or anything that doesn’t belong in front of a customer right now. You decide the rules.
None of this requires anything Klaviyo doesn’t already offer. It's the same catalog and code structure available in every account.
None of this requires anything Klaviyo doesn’t already offer. It’s the same catalog and code structure available in every account.
Enrich your feed with a product catalog
Sometimes, your product catalog data isn’t always formatted in a way that’s usable by a CRM, even though it already exists in your ecommerce platform.
This happened with a jewelry brand I work with. Their Shopify catalog had rich data attached to every product: short quotes about the design, and a line or two on how each piece came together. But none of it was syncing into Klaviyo by default.
I took the full Shopify catalog, ran it through a feed-management tool to shape the data the way I needed, and added it back into Klaviyo as a custom catalog. That let me pull those quotes and design notes straight into emails.
It mattered here specifically because of the category. No one wants to scroll past 9 near-identical pieces of jewelry in the same price range and pick one. What actually works is fewer products, shown from different angles, on a person, with a little context about each piece.
It’s a different set-up than a standard grid, and it starts with getting the right data into Klaviyo in the first place.
Where a custom product feed fits in your flows and campaigns
A custom product feed works anywhere a product feed does: welcome flows, retargeting flows like cart and browse abandonment, and email marketing campaigns.
An apparel client of mine runs a win-back flow offering 10% off an evergreen archive collection. Because they sell across multiple currencies, a flat “on sale” message doesn’t always tell the full story. Instead, the button to the product calculates and displays the percentage saved for that specific product, in that specific currency, automatically.
Another retailer client that carries dozens of different brands under one storefront needed customers to see which brand made the item they were looking at, not just the retailer's own name. Since vendor isn't something the default block shows, we built it into their custom feed instead.
The common thread across every example is that showing the right image, the right price, and the right context matters as much as showing the right product. For another retailer client, unique conversions are up nearly 65% since we implemented custom product feeds into flows and revenue per recipient is up over 9%.
Showing the right image, the right price, and the right context matters as much as showing the right product.
If you’re already comfortable with catalog lookups and Django template filters, most of this comes together quickly. If you’re not, spend some time in the Klaviyo Help Center and with Django’s documentation.
The set-up can take some time to build out initially. But after that, it’s mostly reusable. Once your template exists, adapting it for a new flow or campaign takes a fraction of the time it took to build the first one.




