- Klaviyo has two kinds of product blocks: static (you choose up to 9 items) and dynamic (Klaviyo fills them from a product feed).
- For cross-sell flows, I build a specific version per product rather than relying on a dynamic block.
- In abandoned cart emails, show what they left. Klaviyo itself says adding other products can lower conversion.
- Browse abandonment emails show the one product that triggered the flow. To show more, add a "recently viewed" feed, which excludes that triggering product.
- Every dynamic feed needs a fallback for people with little history, or they get generic best sellers.
What's the difference between a static and a dynamic product block?
Klaviyo's product block comes in two versions:
- Static blocks show a set list of products you choose. You can pick up to 9 items, and you can write a custom description for each.
- Dynamic blocks show products based on business trends, like best sellers in the last 90 days, or personalized for each recipient through a product feed. How many show depends on your layout. For example, 2 rows of 3 products shows up to 6.
A dynamic block can only show what its feed allows. If the feed doesn't have enough eligible products for someone, the block shows fewer.
What product recommendation feeds does Klaviyo offer?
You build product feeds in Klaviyo under Content, then Products, then Product feeds. Klaviyo's Help Center lists these options:
| Feed | What it shows |
|---|---|
| Best-selling products | Ranked by orders over the last 90 days, or weighted toward the last 3 days |
| Newest products | Items most recently added to your Klaviyo catalog |
| Products a customer has recently viewed | From the last 90 days, for identified visitors |
| Products a customer has added to cart | From the last 90 days |
| Products a customer may also like | AI picks using collaborative filtering, which predicts what a person is likely to buy next |
You can filter feeds by category, price and stock level. Klaviyo also automatically leaves out items without images, items the person already bought, out-of-stock items and the items from the event that triggered the flow.
That last exclusion matters a lot in flows. More on that below.
Should I use dynamic product blocks in a cross-sell flow?
This is where I part ways with the algorithm. My default is to build specific, per-product versions of the cross-sell flow: duplicate the layout for each hero product and choose what comes next by hand.
Why? Because I want to control the story. When I pick pairs, I start with items that complement the hero product. Accessories come later, so you're not hounding someone who just bought. And for restock products, I don't ask for another purchase too soon.
A dynamic block can't make those calls. It knows what's popular or what similar shoppers bought. It doesn't know that your customer needs two weeks with the product before a second flavor makes sense.
The alternative, if you don't want a version per product, is one general cross-sell flow. It gets more sends, and it shows you which products people actually buy at a given point in their lifecycle. That's useful data for building the specific versions later. The full build is in my cross-sell email flow post.
What should an abandoned cart email show?
What they left. Klaviyo's abandoned cart block pulls in every item someone left in their cart by default, and Klaviyo's Help Center says it's best practice to only include the products the customer abandoned, because other products can distract and lower the overall conversion rate.
So skip the "you might also like" row in cart emails. If you want to recommend something else, do it after the order, in your post-purchase flow.
Does browse abandonment only show one product?
By default, yes. Klaviyo's pre-built browse abandonment emails pull the product from the Viewed Product event that triggered the flow: its name, image, price and link. That's one product.
Which product it is depends on your flow filters. With a "hasn't been in this flow in the last X days" filter, it shows the first item the person viewed. With a "has viewed product zero times since starting this flow" filter, it shows the most recent one.
If you want to show more than one item, add a dynamic product block with a "recently viewed" feed below the main product. One catch: Klaviyo excludes the product that triggered the browse abandonment flow from the feed. So that block will show the shopper's other recently viewed items, not repeat the main one. That's actually what you want, but it surprises people when they test it.
Two things have to be working for any of this:
- Viewed Product tracking. Klaviyo says browse abandonment requires it, and recommendations based on viewed products aren't available without it.
- Identified visitors. Klaviyo has to know who the visitor is to connect their views to a profile.
More on the flow itself in browse abandonment email.
Where can dynamic product blocks work?
Places where you can't know in advance what each person wants, and where being roughly right is fine:
- Campaigns to a broad list, with a best-sellers or newest-products row below the main message
- Winback emails, where a "may also like" row gives lapsed customers something new to look at
- Welcome emails to non-customers, with best sellers as social proof
And places where they don't:
- Abandoned cart, for the reason above
- Cross-sell and post-purchase, where timing and pairing matter more than popularity
- Back in stock, where the email is about one product. See Klaviyo back in stock emails.
What settings trip people up with product blocks?
A few from Klaviyo's Help Center worth knowing before you build:
- Fallbacks. For people with limited history, you choose what they see instead, like best sellers. Those defaults are the same for everyone and aren't personalized. Set one, or some people get a thin block.
- Out of stock. On Shopify, a product leaves feeds when all its variants are out of stock. A variant that allows selling at zero inventory can keep it in.
- Variants. You can't pick individual variants in product blocks. If your cross-sell is "the 2-pack of the same flavor," you may need to link to it directly.
- Static blocks in flows. Klaviyo notes that static block details in flow emails won't update at send time, so check them when prices change.
- Catalog sync. Klaviyo syncs Shopify items in real time, but collections and category membership update every 6 hours. A brand-new collection won't show up in a filtered feed right away.
FAQ
How do I add product recommendations in Klaviyo?
Create a product feed under Content, Products, Product feeds, choose a feed type like best sellers or "may also like," then add a product block to your email, set it to Dynamic and select that feed.
Does Klaviyo use AI for product recommendations?
Yes. The "products a customer may also like" feed uses collaborative filtering to predict what a recipient is likely to buy next.
Why is my browse abandonment email only showing one product?
Because it pulls from the single Viewed Product event that triggered the flow. Add a dynamic block with a recently viewed feed to show other items they looked at.
How many products can a Klaviyo product block show?
A static block holds up to 9 items you pick. A dynamic block shows as many as your layout allows, if the feed has enough eligible products.
Why are some products missing from my dynamic block?
Klaviyo leaves out items without images, items the person already bought, out-of-stock items and items from the flow's trigger event.
- How to add a product block to an email, Klaviyo Help Center
- How to use product feeds and recommendations, Klaviyo Help Center
- How to display recently viewed items in an email, Klaviyo Help Center
- How to create a browse abandonment flow, Klaviyo Help Center
- How to create an abandoned cart flow, Klaviyo Help Center
- How to resync your Shopify catalog feed, Klaviyo Help Center