automations.help

Lifecycle & marketing

Build a browse abandonment flow for Shopify

Plenty of shoppers open a product page, look, and leave without ever adding to cart. A browse abandonment flow sends those people a quiet reminder of what they looked at. It's the lowest-intent recovery flow you'll build — and it has one hard limit worth saying out loud: it can only reach shoppers Klaviyo already knows. Here's how to wire it on your Shopify store, keep it from stepping on your higher-intent flows, and tell whether it's actually earning its place.

Difficulty
Starter
Time to build
2-4 hrs
Updated
  • Klaviyo
  • Shopify

The manual way today

There's no manual version of this — and that's exactly why it gets skipped. Nobody is sitting in Shopify analytics watching which products a known customer viewed yesterday and firing off a personal 'still thinking about it?' note by hand; the data is there in the sessions report, but acting on it one shopper at a time isn't a job anyone does. So the whole category of 'looked but didn't add to cart' just goes untouched. Most stores build an abandoned cart flow, maybe an add-to-cart flow, and stop — leaving the largest and earliest group of interested shoppers, the ones who only browsed, with no follow-up at all.

Far more people view a product than ever add it to cart, so browse abandoners are the biggest pool of warm-ish interest your store produces — and the one you're most likely doing nothing with. The catch is honest: most of them are anonymous and unreachable, so the real opportunity is only the slice Klaviyo can already identify. That slice still walks every day with no nudge. There's no error, no bounced email, no failed task to notice — just a recovery flow you never built, quietly not running, on the one audience that's earliest in the buying decision and easiest to gently bring back.

What running looks like

A known shopper views a product, doesn't add it to cart, and doesn't take any stronger action for a few hours — so Klaviyo sends one personalized reminder of the exact item they looked at, with its live image and price pulled from your synced Shopify catalog. Anyone who added to cart, started checkout, or bought in the meantime is handed off to the flow built for that action and never gets this email. Out-of-stock products are suppressed, frequent browsers are capped, and recent purchasers are excluded — so the flow stays a gentle last-resort nudge, not noise.

01The build

How to build it

  1. Be honest about who this flow can actually reach

    Needs a human

    Accept the hard limit before you build: a browse abandonment flow can only email shoppers Klaviyo already knows. The 'Viewed Product' event only attaches to a profile if that visitor is cookied and identified — they subscribed through a form, clicked in from one of your emails, or are a logged-in customer. Anonymous first-time browsers are invisible to it, and no tool changes that without an identity. So decide it's worth building on that basis, and place it correctly in your flow priority: below checkout abandonment and below add-to-cart, because someone who only looked is a weaker signal than someone who got further. If you don't yet have a steady stream of identified visitors — a signup form, a popup, real email traffic — fix that first, because this flow has almost no one to talk to without it.

  2. Get the 'Viewed Product' event flowing into Klaviyo

    Runs itself

    The trigger is Klaviyo's 'Viewed Product' metric, recorded by Klaviyo's onsite JavaScript on your storefront. Install it through the Klaviyo Shopify integration, which adds the Active on Site snippet and the viewed-product tracking to your theme. On a heavily customized theme you may need to drop Klaviyo's Viewed Product snippet into the product template yourself so it fires `klaviyo.push(["track", "Viewed Product", {...}])` with the product's name, ID, image URL, product URL, price, and categories. Then confirm it's real: open Metrics → Viewed Product in Klaviyo and watch live events land with those properties filled in. If the metric is empty or the fields are blank, nothing downstream works — fix the snippet before you build the flow.

  3. Sync the Shopify catalog so the email can render the item

    Runs itself

    The Klaviyo Shopify integration syncs your catalog — products, images, prices, URLs, and inventory — into Klaviyo. That sync is what turns the bare product reference in the event into a real image, current price, and working link inside the email, and it's what later lets you suppress out-of-stock products. Confirm the catalog is connected and current. The Viewed Product event tells the flow which product to talk about; the synced catalog is what makes it look like a finished message instead of a broken placeholder.

  4. Create the flow trigger and a short wait

    Runs itself

    Build a flow triggered on the Viewed Product metric, and add a Time Delay right at the top — a few hours is the usual shape. Long enough that the shopper has clearly stopped browsing for now, short enough that the product is still on their mind. Don't send instantly: someone actively clicking around your site doesn't need an email about the page they're currently on. The wait also gives your higher-intent flows room to claim the customer first if they go deeper into the funnel in that window.

  5. Add the flow filters that keep it last in line

    Needs a human

    This flow is defined by what it refuses to send. Add flow filters so a profile only proceeds if, since starting the flow, they have NOT Placed Order (never email a buyer), NOT Started Checkout (yield to your checkout / abandoned-cart flow), and NOT Added to Cart (yield to your add-to-cart flow if you run one). Add a trigger filter so only emailable, consented profiles enter at all. The effect is that browse abandonment becomes the flow of last resort: anyone who took a stronger action is caught by the flow built for that action, and only the pure browsers — looked, left, did nothing else — fall through to this one. This needs a human call because the exact set of higher-intent flows to defer to depends on which ones you actually run.

  6. Personalize the email around the viewed product

    Runs itself

    Build the message around the specific item, pulled from the trigger event: `{{ event.ProductName }}`, `{{ event.ImageURL }}`, the product `{{ event.URL }}`, and `{{ event.Price }}`. A Klaviyo product block fed by the synced catalog can render it with the live image and current price, and a 'you might also like' recommendations block underneath gives a fallback if the main item doesn't land. Keep the tone a quiet reminder, not a hard sell — this person looked once and left, so a single low-pressure nudge fits the intent far better than urgency or a countdown.

  7. Cap frequency and exclude recent purchasers

    Runs itself

    A Viewed Product trigger fires on every product view, so an enthusiastic shopper can re-enter this flow over and over. Turn on Smart Sending so Klaviyo won't email the same person within your minimum window, add a flow-level frequency cap, and exclude recent purchasers — a filter or segment for 'placed order in the last N days' — so you're not nudging someone who just bought to go look again. Honor consent throughout: only profiles who opted into email (or SMS, if you branch to it) should ever receive a message from this flow.

  8. Suppress out-of-stock and stale products

    Runs itself

    Featuring a sold-out product is the browse-abandonment version of the worst abandoned-cart email. Add a conditional split on the synced catalog's inventory for the viewed item: if it's out of stock, either skip the send or swap the hero for a category / recommendations block instead of the dead product. And render price from the current catalog value, not the price stored on the event — if it changed since they viewed, the email should show what they'd actually pay today.

  9. Measure against a holdout, then tune

    Needs a human

    Browse abandonment is the easiest flow to fool yourself with, because some shoppers who get it would have come back and bought anyway — so raw attributed revenue overstates its real effect. If your plan supports it, run a holdout: a small share of qualifying profiles who get nothing, compared against those who do. The gap in placed-order rate is the actual lift. If it's thin, the usual fixes are tightening the audience (only higher-value categories, or only repeat viewers), lengthening the wait, or accepting that for your store this is a gentle add-on rather than a revenue driver. Honest measurement keeps you from over-emailing a low-intent audience for a number that isn't really there.

02The stack

What it’s built on

Klaviyo
Owns the entire build here: its onsite tracking records the Viewed Product event, and its flow engine holds the wait, runs the higher-intent filters, suppresses out-of-stock items, caps frequency, and sends the personalized reminder.Because Klaviyo's onsite tracking and flows do all of this natively, browse abandonment needs no extra automation tool — no n8n, no Zapier. The free tier is enough to build and test it, and you're almost certainly already running Klaviyo.
Shopify
Your storefront and catalog. The Klaviyo integration installs the onsite snippet on your theme and syncs your product catalog — images, prices, URLs, inventory — which is what the email renders and what the out-of-stock guard reads.Nothing new to buy — you already run Shopify. The only setup is connecting the Klaviyo integration and confirming the catalog sync and onsite tracking are both on.

03Questions

Before you build

Who can a browse abandonment flow actually email?

Only shoppers Klaviyo already knows. The Viewed Product event only attaches to a profile that's been identified — someone who subscribed through a form, clicked in from one of your emails, or is logged in as a customer. Anonymous first-time visitors are unreachable; no tool can email a browser it has no identity for. This is the honest ceiling on the flow, and it's why a healthy signup form and email list matter more to its results than the flow itself.

How is this different from an abandoned cart flow?

Intent. Abandoned cart (and add-to-cart) flows reach people who took a clear action toward buying — they added an item or reached checkout. Browse abandonment reaches people who only viewed a product and did nothing else. It's the weakest signal of the three, which is why it sits last in priority and yields to the others: if a shopper added to cart or started checkout after browsing, the flow built for that stronger action handles them, and this one stays quiet.

Do I need n8n or another tool to build this?

No. Unlike a checkout-abandonment build where onsite tracking can be unreliable, browse abandonment is genuinely Klaviyo-native: the Viewed Product event, the wait, the filters, and the send all live inside Klaviyo, fed by your Shopify catalog. You'd only reach for something like a custom server-side event if your storefront is headless or customized enough that Klaviyo's onsite snippet never fires the Viewed Product event — and that's the exception, not the rule.

How long should the wait be before the email sends?

A few hours is the common shape. Short enough that the product is still fresh in their mind, long enough that they've clearly stopped shopping for now rather than just stepping away from an open tab. Sending instantly is the mistake — you'd be emailing someone about a page they may still be looking at, and you'd cut off the window for a higher-intent action to take over.

Won't this annoy people who browse a lot?

It will if you skip the guardrails, because the trigger fires on every product view. Turn on Smart Sending so the same person can't be hit within your minimum window, add a flow-level frequency cap, and exclude recent purchasers. Done right, a regular browser gets at most an occasional gentle reminder, not an email every time they open a product page.

Can I build this myself, or should you build it?

Every trigger, filter, field, and guardrail is laid out above, so if you're comfortable in Klaviyo and your Shopify catalog sync is healthy, you can wire this up in an afternoon. If you'd rather not own the filter logic, the stock suppression, and the holdout measurement, we'll build it inside the Klaviyo and Shopify accounts you already pay for, document every piece, and hand you the keys — you own the flow outright, with no monthly retainer to us. It starts with a free 20-minute teardown, not a contract, and you keep the plan either way.

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

Intermediate4-6 hrs

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

Intermediate3-5 hrs

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

Intermediate3-5 hrs