Lifecycle Email

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.

PlatformRecommender documentedWhere unavailable items are excludedStated default
KlaviyoProduct feeds, including "Products a customer may also like", which Klaviyo says uses AI and collaborative filteringA stock level filter (minimum and maximum) on the product feedOut of stock items are listed as not appearing in product recommendations
Klaviyo, custom catalog feedThe same feeds, fed by your own fileThe inventory policy field on each item, set to 1Policy 2 when the field is not set: the product can appear regardless of inventory quantity
BrazeAI item recommendations (AI Personalized, Most Popular, Most Recent, Trending)A catalog selection added to the recommendationWe found no built-in stock rule
IterableCatalog collections built from search criteria; we found no model-based recommender in the pages we readA criterion on a typed stock field in the collectionA 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 sourceSync the vendor documents
Klaviyo with Shopify, BigCommerce, WooCommerce or WixReal time (Shopify: "Real time except as noted", with collections every 12 hours)
Klaviyo with Magento 2Every 30 minutes
Klaviyo with Salesforce Commerce CloudCatalog every 8 hours
Klaviyo custom catalog feedEvery six hours
Klaviyo Catalogs API"Real-time, with the ability to push items"
Braze Cloud Data IngestionShortest default interval 15 minutes; 5 minutes on request to Braze
Iterable CatalogAn 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.

  1. 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.
  2. Set its stock to zero in the store or warehouse table and note the time.
  3. Watch the item in the email platform's catalog until the change lands. That gap is your measured sync delay.
  4. 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.
  5. Repeat with one variant at zero and the others stocked, to see the variant summing rule.
  6. 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.
  7. 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.
  8. 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

Frequently asked questions

Does Klaviyo remove out of stock products from recommendations automatically?
Klaviyo's help center lists out of stock items among the things that will not appear in product recommendations, and says that for Magento and Shopify stores a product that goes out of stock is hidden from the catalog. Custom catalog feeds behave differently: unless an item's inventory policy is set to 1, the product can appear regardless of inventory quantity.
Can Braze AI item recommendations filter on stock?
Braze documents adding a catalog selection to a recommendation, which filters by columns in your catalog. We found no built-in stock rule in the pages we read, so the catalog needs a stock column you keep current. Selections with Liquid cannot be used in AI recommendations, and a selection's sorting field and limits are ignored when those recommendations are processed.
How often does Klaviyo sync inventory from an ecommerce platform?
Klaviyo's sync reference, as we read it on October 7, 2026, lists Shopify, BigCommerce, WooCommerce and Wix as real time, with Shopify collections every 12 hours. Magento 2 syncs every 30 minutes and the Salesforce Commerce Cloud catalog every 8 hours. A custom catalog feed is resynced every six hours, while the Catalogs API is described as real-time.
Can the products in an email change after it has been sent?
We found no open-time option for the native Klaviyo, Braze or Iterable blocks in the pages we read. Iterable documents collections searching the catalog at send time, and Klaviyo says hand-picked products will not update dynamically at send time unless they come from a feed. Dynamic Yield documents a separate recommendations block propagated when the email is opened, and notes that some email clients pre-cache content before the open.
What should a recommendation block show when too few products are in stock?
Decide it on purpose, because each platform behaves differently. Braze adds most popular items to complete its list of 30 recommendations. Iterable sends the message without the block when a collection returns no results, unless the template marks the collection as required, in which case the message is not sent. Dynamic Yield warns that unfilled slots display white images linking to a 404 error page.

Free tools for this topic

FREE TOOLEmail Deliverability CheckerSPF, DKIM, DMARC and the 2026 inbox rules — graded.CALCULATOREmail Revenue CalculatorWhat is your list really worth per send — and per year?PLAYBOOKThe Lifecycle & Retention PlaybookEmail and SMS flows that compound revenue on autopilot.

Keep reading

GlossaryWhat Is Email Deliverability? Inbox Placement, ExplainedRead →StatisticsEmail Marketing Statistics 2026: The Numbers That MatterRead →PricingHow Much Does Email Marketing Cost in 2026? Real Market RatesRead →
CATALIST NEWSLETTER

Monthly dose of growth marketing.

Get marketing tips, narratives, guides, and playbooks delivered to your inbox.

Protected by reCAPTCHA — Google's Privacy Policy and Terms of Service apply.