How to Keep Out of Stock Products Out of Email Recommendations
Where the stock filter lives, how often the catalog syncs and when the block renders for email recommendations in Klaviyo, Braze and Iterable, plus a test plan.
On this page
To use AI for product recommendations in emails and exclude out of stock items, three settings have to agree: the catalog your email platform holds, the inventory filter on the recommendation, and the moment the block is rendered. The model matters least of the three. Klaviyo and Braze both document recommenders that retrain on a cycle of days, weeks or a month, so what keeps a sold-out product out of the flows in a lifecycle email program is a plain stock filter reading a catalog that may be minutes or hours behind the store.
Everything below comes from vendor documentation as we read it on October 7, 2026. Where a page was silent, we say so.
Where does the stock filter live on each platform?
AI product recommendation blocks in lifecycle emails exclude out-of-stock items in a different place on each platform, and Klaviyo is the only one of the three whose documentation, as we read it, describes doing it by default.
| Platform | Recommender documented | Where unavailable items are excluded | Stated default |
|---|---|---|---|
| Klaviyo | Product feeds, including "Products a customer may also like", which Klaviyo says uses AI and collaborative filtering | A stock level filter (minimum and maximum) on the product feed | Out of stock items are listed as not appearing in product recommendations |
| Klaviyo, custom catalog feed | The same feeds, fed by your own file | The inventory policy field on each item, set to 1 | Policy 2 when the field is not set: the product can appear regardless of inventory quantity |
| Braze | AI item recommendations (AI Personalized, Most Popular, Most Recent, Trending) | A catalog selection added to the recommendation | We found no built-in stock rule |
| Iterable | Catalog collections built from search criteria; we found no model-based recommender in the pages we read | A criterion on a typed stock field in the collection | A collection returns what its criteria match |
Klaviyo supports the stock level filter for Shopify, BigCommerce and Magento 2, plus variants in custom catalogs. The catch is in its own FAQ: "Filters apply to variants, but product blocks render items. If the sum of the inventory for all variants of a product is above the threshold of the filter, it is eligible to show within a product block." As a hypothetical, a jacket with 40 units in one size and none in the others clears a minimum of 10. Custom feeds default the other way: Klaviyo Developers documents that an item with no inventory policy behaves like policy 2, so a sold-out product stays eligible until you set the field to 1.
Braze describes a selection as custom filters on columns in your catalog and gives brand, size, location and date added as examples. Stock would be one more column you maintain (our reading). Two documented limits apply: selections with Liquid cannot be used in AI recommendations, and a selection's sorting field and limits are ignored when AI item recommendations are processed. Its FAQ lists "Relevant items are no longer available or in stock." among the conditions under which most popular items are added to complete the list of 30 recommendations.
Iterable has you add Catalog to a plan through your customer success manager, and one requirement there is easy to miss: "Collections can only search data that has been given an explicit data type, making this a crucial step." A stock field loaded without a declared type cannot be searched. The worked example in a second Iterable article checks that a boolean field is true alongside a price comparison; an in-stock boolean or a quantity field would sit in the same builder (our reading).
How fresh is the inventory the filter reads?
Dynamic product recommendations in email depend on a real-time inventory sync only where the connector is documented as real time, and several common ones run slower. Read each interval as the oldest stock data a send could be filtering on, which is our arithmetic and assumes syncs start on schedule and finish at once.
| Catalog source | Sync the vendor documents |
|---|---|
| Klaviyo with Shopify, BigCommerce, WooCommerce or Wix | Real time (Shopify: "Real time except as noted", with collections every 12 hours) |
| Klaviyo with Magento 2 | Every 30 minutes |
| Klaviyo with Salesforce Commerce Cloud | Catalog every 8 hours |
| Klaviyo custom catalog feed | Every six hours |
| Klaviyo Catalogs API | "Real-time, with the ability to push items" |
| Braze Cloud Data Ingestion | Shortest default interval 15 minutes; 5 minutes on request to Braze |
| Iterable Catalog | An Iterable Smart Ingest catalog sync, as often as every 15 minutes (Smart Ingest is added to a plan); otherwise you add and update items yourself |
The connector rows come from the sync reference published by Klaviyo, the feed and API rows from its developer guide. Braze adds two ways around the schedule: an on-demand sync triggered by an API call when your warehouse job finishes, and file storage integrations, which it describes as event-driven.
A second clock sits behind the first. Klaviyo says: "Your product feed recommendation models are generally trained once every 2-7 days, depending on use." Braze's plan table gives the free version weekly user updates and monthly model retraining, against daily and weekly for the Pro version. The Braze pages we read do not say whether a selection is applied again at send or only when a user's recommendations are updated, so that question goes in the test plan.
Send time, open time, and the hours after the send
An AI product recommendation engine with email integrations can read inventory in real time at one of two moments: when the message is sent, or when it is opened. Klaviyo and Iterable document the first. Iterable's overview says campaigns "can use collections to search, at send time, the information stored in catalogs". Klaviyo comes at it from the other side: for hand-picked products in a static block "the item details will not update dynamically at send time", and the documented remedy is a feed containing those items with the Dynamic option. The same article says that for Magento and Shopify stores a product that goes out of stock is hidden from the catalog and will not appear in any feed. We found no open-time option for these native blocks, so a product that sells out an hour after the send stays in the email.
Open-time rendering comes from a different kind of product. Dynamic Yield documents a Recommendations block in Experience Email whose personalized content is "propagated when the email is opened", with filter rules that include or exclude products by product properties; we found no stock-specific setting in that article. It carries two warnings. Filters that leave fewer eligible products than slots mean "white images are displayed, which link to a '404 Error' page on your site". And some email clients, Apple Email being the named example, "pre-cache content before it is opened", which Dynamic Yield says prevents it from getting reliable open time data. That note concerns countdown timers; our reading is that a pre-cached recommendation is likewise a snapshot from before the person reads the message.
What good practice looks like when stock keeps moving
AI product recommendations in lifecycle email need inventory availability rules that assume items go out of stock after the filter has run, and the ecommerce best practices that follow from the documentation are mostly mechanical.
- Filter on a buffer above zero. A hypothetical: a store syncing every 30 minutes whose fastest seller moves 8 units in that window (an assumed figure) sets a minimum stock level of 10.
- Filter at the level the customer buys. Because Klaviyo sums inventory across variants, a size-led catalog needs a higher threshold.
- Choose the empty state on purpose. Braze backfills with most popular items. Iterable still sends the message without the block when a collection returns no results, unless the Handlebars expression specifies
required=true, in which case the message is not sent. - Put the tier in the budget. Daily user updates in Braze belong to the Pro version and Iterable's Catalog is added to a plan, so freshness is partly a line in what email marketing costs.
- Measure the block on clicks and revenue per recipient before and after the change, with our email marketing statistics as outside context.
A test plan for stale inventory
Run this on a seed profile before trusting any setting above, and log four timestamps on every pass: stock change, catalog update, send and open.
- Choose one product the seed profile is certain to be shown, for example by pointing a test feed, selection or collection at a single category.
- Set its stock to zero in the store or warehouse table and note the time.
- Watch the item in the email platform's catalog until the change lands. That gap is your measured sync delay.
- Preview the email for the seed profile before and after the catalog updates. Klaviyo's Preview and Test fills the block with products from your catalog.
- Repeat with one variant at zero and the others stocked, to see the variant summing rule.
- Tighten the filter until fewer products qualify than the block has slots, then send, and record whether the block backfills, disappears, renders blanks or stops the send.
- Send to the seed, zero the stock, then open the email. With send-time blocks the product will still be there, so inspect the page it lands on.
- On Braze, repeat step 4 across a user update cycle to learn whether a newly unavailable item leaves at send or only at the next update.
Repeat the run after any connector, feed or plan change. A clean block still depends on the message reaching the inbox, so the same seed sends are a good moment to look at placement: our primer on what email deliverability is covers the basics, and the email deliverability checker is a further resource. Flow builds like this one are part of our lifecycle and demand generation service.
Sources
- Klaviyo: How to use product feeds and recommendations
- Klaviyo: How to add a product block to an email
- Klaviyo: How often integrations sync reference
- Klaviyo Developers: Sync a custom catalog feed to Klaviyo
- Braze: Item recommendations
- Braze: Braze Cloud Data Ingestion
- Iterable: Catalog Overview
- Iterable: Using Catalogs & Collections in Messages
- Iterable: Smart Ingest Overview
- Dynamic Yield: Experience Email Content Blocks
