Lifecycle & marketing
Send replenishment reminders for consumable products
Your product is built to run out — that's the business. But if nothing reminds the customer the week they hit empty, the reorder either doesn't happen or happens on Amazon. Here's how to build a Klaviyo replenishment flow timed to each consumable's real run-out date, guarded so it never nudges someone who already restocked or is on a subscription. It's a native Klaviyo + Shopify build — no glue layer required for the common case.
- Klaviyo
- Shopify
The manual way today
There's almost never a manual version, and that's the leak. To do this by hand you'd have to know, per customer, which consumable they bought, how big the pack was, how fast they go through it, and therefore roughly when they'll run dry — then email each one a reorder nudge a few days before that date, per SKU, forever. Nobody runs that off a spreadsheet. So most stores do one of two things instead: nothing, or they fold these customers into the same monthly newsletter everyone gets, which lands days or weeks off from when any given person is actually empty. The reminder that matters — 'you're about to run out of the thing you specifically buy' — never gets sent.
A consumable customer is the most reorderable customer you will ever have: the product is designed to be used up, they've already tried it, and you've already paid to acquire them. The reorder is the whole point of selling a consumable. When you don't catch them at empty, one of two things happens, and both are invisible. They forget — and a habit that wasn't reinforced quietly dies. Or they remember at the moment of need, open Amazon or Google, and reorder from whoever shows up first, which is rarely you. There's no error, no bounce, no failed task — just a repeat-purchase line that's softer than it should be, on customers who were the easiest sale in your store.
What running looks like
Every time someone buys a consumable, a Klaviyo flow starts a timer set to that product's real consumption window — pack size divided by how fast it's used, minus a few days of shipping lead so the reminder lands just before empty, not after. When the timer hits, the customer gets a reminder naming the exact product they're about to run out of, with a one-click reorder link and a subscribe-and-save path. Before it sends, the flow re-checks that they haven't already reordered and isn't an active subscriber — so nobody who restocked or is on autopilot gets nudged. Buy a 30-day item and a 90-day item and each is tracked on its own clock, not one blurred account average.
01The build
How to build it
Work out each consumable's real run-out date — and which products even qualify
Needs a humanThis is the judgment call the whole flow rides on, and it's the one part software can't do for you. For each consumable, compute days-of-supply: pack size divided by the typical usage rate. A 30-serving tub used once a day is ~30 days; a 60-capsule bottle taken twice daily is also ~30; a 90-day skincare jar is ~90. Then subtract a lead buffer — shipping time plus a couple of days — so the reminder arrives a few days before they hit empty, when reordering is still a 'top it up,' not an 'I already ran out and bought elsewhere.' While you're here, decide which products are actually consumable: a reusable bottle, a one-time device, or a gift-only SKU should never trigger a 'running low?' email, and sending one there reads as a store that doesn't know what it sold you.
Encode the cadence so the order event carries it
Runs itselfKlaviyo flow delays are fixed per branch, so the consumption window has to live on the product, not in your head. The pragmatic native approach is cadence buckets: tag your consumables (or drop them into Shopify collections) like replen-30, replen-60, replen-90, grouping items whose run-out windows are close. That keeps the flow count sane while still tracking a daily supplement and a quarterly refill on different clocks. If a few hero SKUs deserve exact timing, give them a per-product metafield (e.g. consumption_days) instead — that's more precise but means more branches to maintain. Either way, this is the data the next step keys off, and it flows into Klaviyo through the native Shopify integration with the Placed Order line items.
Trigger a flow per bucket on the purchase, not on a date guess
Runs itselfBuild one Klaviyo flow per cadence bucket, each triggered on the Placed Order metric with a trigger filter that the order contains a product in that bucket's tag or collection. Triggering on the actual purchase — not a blanket calendar send — is what makes the timing personal: the clock starts the day this customer bought this consumable, so two people who ordered the same tub three weeks apart get reminded three weeks apart. If you went the per-SKU metafield route in step two instead of buckets, this is one flow with a conditional split that routes each consumable to its own delay branch; the mechanics are the same, just consolidated.
Set the time delay to the run-out window, minus lead time
Runs itselfAdd a time delay equal to that bucket's consumption window minus the lead buffer from step one — a 30-day bucket waits ~24-26 days, a 90-day bucket waits ~84. This single delay is the entire value of the build: too short and you're nagging someone who's still half-full and trained them to ignore you; too long and they already ran out, already reordered somewhere fast, and your email is a reminder that you were late. Start from the math, then tune it against the actual reorder rate (step eight) rather than guessing twice.
Guard the send: didn't already reorder, isn't a subscriber
Runs itselfRight before the email, add a conditional split: 'Placed Order [this consumable, or its collection] zero times since starting this flow.' Anyone who already restocked the same item drops out here — reminding a customer to buy something they bought last week is the version of this automation that makes you look broken. Then suppress active subscribers: if you run Recharge, someone with a live subscription to this product already has their next shipment scheduled, so a 'time to reorder' email teaches them to cancel and buy manually. Suppress on Recharge's active-subscriber signal (exposed through its Klaviyo integration), and let Klaviyo's built-in handling exclude unsubscribed and suppressed profiles for free.
Write the reminder around reordering, not a discount
Runs itselfThe email should name the specific product they're about to run out of and make buying it again trivial: a one-click reorder link (a Shopify cart permalink, /cart/{variant_id}:{qty}, pre-loads the same item and quantity so it's one tap to checkout). Lead with convenience and the subscribe-and-save option as the upgrade — 'never run out, save 10% on every refill' turns a one-time reorder into recurring revenue and is the right place to spend margin. Hold back a blanket discount: a consumable customer is reordering because they need more, not because they need a coupon, and opening with one teaches people to let themselves run out to earn a deal. If you do offer an incentive, point it at the subscription, not the single reorder.
Handle quantity, bundles, and gifts honestly
Runs itselfReal orders break the clean math, so guard the obvious cases. Quantity scales supply: someone who bought two tubs lasts twice as long, so factor line-item quantity into the delay (a per-SKU exact-date build computes order_date + consumption_days × quantity − lead; with buckets, route multi-unit orders to a longer bucket). A sampler or trial size shouldn't be treated as a full restock window. And gift orders are a trap — if the buyer's address differs from the shipping address or the order is tagged a gift, don't email the purchaser 'you're running low,' because they aren't the one using it. When a single account-wide cadence is genuinely fine for your catalog (one consumable, or everything reorders on roughly the same clock), Klaviyo's native Predicted Date of Next Order property is the simpler honest path — use it and skip the per-bucket flows.
Measure the reorder rate and tune the window
Runs itselfThe flow lives or dies on timing, and timing is invisible unless you watch it. Track the reorder rate of each bucket's flow — the share of recipients who place an order for that consumable within, say, a week of the reminder. If a bucket underperforms, it's almost always the window: customers are reordering before the email (delay too long, shorten it) or the email is landing after they've gone elsewhere (lead buffer too thin, send earlier). Tune one bucket at a time so you can read the effect, and revisit when you change pack sizes or formulas, since that quietly changes everyone's run-out date.
02The stack
What it’s built on
- Klaviyo
- Owns the whole build: the Placed Order trigger per cadence bucket, the consumption-window time delay, the 'already reordered' and active-subscriber guards, the dynamic reorder email, and the frequency cap that keeps replenishment from colliding with your other flows. The Placed Order data, the Recharge subscriber signal, and the catalog behind the email all arrive through Klaviyo's native integrations, so there's no custom event to wire for the common case.Klaviyo's free tier is enough to build and test this, and you're almost certainly already running it. Its native Predicted Date of Next Order property handles the simple, single-cadence case on its own — if that's your catalog, use it and don't build the per-bucket version. This recipe is for multi-product stores where one account-level prediction smears a daily supplement and a quarterly refill into the same wrong date.
- Shopify
- Read through Klaviyo's native integration: the source of the Placed Order data that starts each customer's clock, the product tags or collections that encode the cadence buckets, the metafield that can carry an exact consumption window per SKU, and the cart permalink that powers the one-click reorder in the email. No custom Shopify code is needed for the bucket build — the integration surfaces the orders, products, and tags inside the flow.
03Questions
Before you build
Doesn't Klaviyo already predict when a customer will reorder?
It does — the Predicted Date of Next Order property is computed from each customer's order history, and for a store with one consumable or a single dominant cadence it's enough on its own. Where it falls short is a multi-product catalog: it predicts one next-order date per customer across all their buying, so someone who orders a 30-day supplement and a 90-day refill gets a single blended estimate that's wrong for both. The per-bucket build in this recipe times the reminder to the specific product they're about to run out of instead of an averaged guess.
How do I figure out the right timing for the reminder?
Start from the product, not a default. Days-of-supply is pack size divided by the typical usage rate — a 30-serving tub at one a day is ~30 days, a 60-capsule bottle at two a day is also ~30. Then subtract a lead buffer of shipping time plus a couple of days so the email lands just before empty, when reordering is still a top-up rather than a scramble. Set the flow delay to that number and tune it against the actual reorder rate; the math gets you close, the data gets you right.
Won't this email people who already reordered, or who are on a subscription?
No — two guards prevent it. Right before the send, a conditional split drops anyone who's placed an order for that consumable since the flow started, so a customer who restocked early never gets the nudge. And active Recharge subscribers are suppressed entirely: their next shipment is already scheduled, and a 'time to reorder' email would only teach them to cancel and buy manually. A customer has to be genuinely due and genuinely not covered to ever receive the reminder.
Should the replenishment email include a discount?
Not a blanket one. A consumable customer is reordering because they need more, not because they need a coupon, so leading with a discount spends margin on a sale you'd have made anyway and trains people to let themselves run out to earn the deal. Spend the incentive on the upgrade instead: point a small saving at subscribe-and-save, which turns a one-time reorder into recurring revenue. Make the plain reorder one tap and let convenience, not price, do the work.
What if a customer buys two of something, or it's a gift?
Both are handled as edge cases so the timing stays honest. Quantity scales the window — two tubs last twice as long — so the delay factors in line-item quantity (an exact per-SKU build multiplies the consumption days by quantity; with buckets you route multi-unit orders to a longer bucket). Gift orders are excluded: if the shipping address differs from the buyer or the order is tagged a gift, the purchaser doesn't get a 'you're running low' email, because they aren't the one using the product.
Can I build this myself, or should you build it?
Every piece is spelled out above — the cadence math, the bucket tags, the per-product trigger, the delay, the reorder guards, and the email — and since the common case is a native Klaviyo build, you won't even need a glue layer. If you'd rather not own the consumption-window analysis, the subscriber suppression, and the quantity and gift edge cases, we'll build it on the Klaviyo and Shopify accounts you already pay for, document every branch, and hand you the keys — you own the flow outright, with no monthly retainer. It starts with a free 20-minute teardown, not a contract, and you keep the plan either way.
Related recipes
Lifecycle & marketing
Build a win-back flow for customers lapsed 90 days
A customer who used to order every month quietly stops, and nothing in your store flags it — you only chase brand-new strangers while people who already loved the product drift to a competitor. Here's how to build a Klaviyo win-back flow that catches them on real purchase cadence (not a blanket 90 days), reconnects before it discounts, and self-exits the moment someone buys. It's a native Klaviyo build — no n8n or glue layer required.
- Klaviyo
- Shopify
Lifecycle & marketing
Build an abandoned cart flow with Klaviyo and n8n
Klaviyo's built-in abandoned cart flow is good — when its onsite tracking actually sees your checkout. When it doesn't (a headless storefront, a custom cart, a checkout the snippet never loads on), the recovery emails just don't fire. Here's how to read the abandonment straight from Shopify with n8n, guard it so you never email someone who already bought, and hand Klaviyo a reliable event to send on.
- Klaviyo
- n8n
- Shopify
Lifecycle & marketing
Save at-risk subscriptions before they cancel
By the time the 'subscription cancelled' email lands, the decision is already made — and the next charge is already gone. But Recharge emits the signals that come before a cancel: an upcoming charge nobody managed, a second skip in a row, a card that just declined. Here's how to wire Recharge and Klaviyo so those signals trigger a save while the customer is still subscribed — and intercept the cancel itself instead of only logging it. It's mostly a native Recharge + Klaviyo build; the glue layer is optional.
- Recharge
- Klaviyo
Lifecycle & marketing
Exclude recent purchasers from Meta retargeting
Your retargeting ad sets keep serving 'come back and buy' creative to people who already bought yesterday. Here's how to wire Shopify's paid-order event to a Meta Custom Audience, set it as an exclusion on every retargeting ad set, and time-box it so buyers flow back in when it's actually worth re-selling to them.
- Meta Ads
- Shopify
- n8n