> ## Documentation Index
> Fetch the complete documentation index at: https://docs.upstackdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How to boost Klaviyo abandonment revenue with Upstack

> Recover 30-40% more abandoned cart, browse, and checkout sessions by enabling Upstack's identity resolution alongside Klaviyo's native tracking.

Upstack's Klaviyo identity enrichment identifies returning visitors that Klaviyo's native tracking misses, then pushes those profiles to Klaviyo in real time so your abandonment flows trigger for sessions that would otherwise be lost. Brands using this setup typically see 30–40% more profiles entering abandonment flows, directly increasing revenue from browse, cart, and checkout abandonment emails.

This guide explains how the enrichment works, how to set up the "waterfall" flow architecture alongside your existing Klaviyo flows, and best practices for maximizing incremental revenue without over-messaging customers.

## The problem: Klaviyo misses returning visitors

Klaviyo's abandonment flows are among the highest-revenue automated flows for DTC brands. But they only trigger when Klaviyo can identify who the visitor is, and Klaviyo's native tracking has significant blind spots.

### When Klaviyo loses identity

* **Cross-device sessions.** A customer clicks your Instagram ad on their phone, browses products, then switches to their laptop. Klaviyo's browser cookie on the phone has no connection to the laptop session — that session is anonymous and no flow triggers.
* **Cookie expiration.** Safari and most iOS browsers expire first-party cookies set via JavaScript within 7 days. A customer who visited 8 days ago and returns today looks like a brand-new anonymous visitor.
* **In-app browser to default browser.** A customer taps a link in the Instagram or Facebook app, which opens an in-app browser with isolated cookie storage. When they later open Safari or Chrome on the same device, the session doesn't carry over.
* **Ad blocker interference.** Klaviyo's client-side tracking JavaScript can be blocked by ad blockers, which roughly 30% of desktop users run. These visitors are completely invisible to Klaviyo's identification system.

The cumulative effect: Klaviyo's native tracking typically identifies only 60–70% of visitors who could be matched to a known profile. The remaining 30–40% browse, add to cart, or start checkout — and leave without triggering any abandonment flow.

## How Upstack's Klaviyo identity enrichment works

Upstack's [identity resolution](/concepts/identity-resolution) engine operates server-side, independent of the visitor's browser. It identifies returning visitors using signals that survive the limitations Klaviyo's client-side tracking faces:

<Steps>
  <Step title="Server-side identity matching">
    When a visitor arrives, Upstack matches server-side signals — IP address, user agent, device fingerprint, and hashed identifiers from previous sessions — against its identity graph. This works even when cookies are expired, the device is different, or the browser is blocking tracking scripts.
  </Step>

  <Step title="Session stitching">
    Upstack connects fragmented sessions across devices and browsers into a single identity. The customer who browsed on their phone and returned on their laptop is recognized as the same person.
  </Step>

  <Step title="Real-time profile push to Klaviyo">
    When Upstack identifies a visitor that Klaviyo doesn't recognize, it pushes the resolved profile — including email, browsing activity, and cart contents — to Klaviyo via API in real time. This enables Klaviyo flows to trigger for sessions that would otherwise be anonymous.
  </Step>
</Steps>

The result: abandonment flows fire for a significantly larger pool of identified sessions, without changing anything about your email content or flow logic.

## The "waterfall" flow architecture

The recommended setup runs Upstack-triggered flows alongside your existing Klaviyo-native flows — not instead of them. Klaviyo's native tracking catches what it can, and Upstack catches what Klaviyo misses.

<Tip>
  **Don't replace your native Klaviyo flows.** They serve different visitor pools. The goal is to add incremental coverage, not swap one set of flows for another.
</Tip>

### How it works

```
Visitor arrives on your store
    │
    ├── Klaviyo identifies them (cookie match, logged in, etc.)
    │   └── Native Klaviyo flow triggers → abandonment email sent
    │
    └── Klaviyo does NOT identify them
        └── Upstack identifies them server-side
            └── Pushes profile to Klaviyo
                └── Upstack-triggered flow fires → abandonment email sent
```

Both paths lead to the same outcome — an abandonment email — but they catch different pools of visitors. The mutual exclusion window (covered below) prevents anyone from receiving both.

## Setup steps

For complete onboarding, see [Onboarding Klaviyo in Upstack Data](/guides/klaviyo/complete-how-to-guide-for-onboarding-klaviyo-in-upstack-data) and [Setting up Upstack abandonment flows in Klaviyo](/guides/klaviyo-abandonment-flows/complete-guide-to-setting-up-upstack-abandonment-flows-in-klaviyo). The summary below covers the conceptual setup.

<Steps>
  <Step title="Connect Klaviyo as a destination in Upstack">
    Configure the Klaviyo destination so Upstack can push identified profiles and event data. Full instructions: [Klaviyo destination](/destinations/klaviyo).

    Once connected, Upstack begins sending identified profiles and their event data to Klaviyo when it resolves visitors that Klaviyo's native tracking missed.
  </Step>

  <Step title="Clone your Browse Abandonment flow">
    1. In Klaviyo, navigate to **Flows** and find your existing Browse Abandonment flow.
    2. Clone the flow.
    3. Rename the clone with the **` - Upstack Data`** suffix — for example, `Browse Abandonment - Upstack Data` — so you can distinguish it from the standard flow.

    Detailed walkthrough: [How to clone your standard flows in Klaviyo](/guides/klaviyo-abandonment-flows/how-to-clone-your-standard-flows-in-klaviyo).
  </Step>

  <Step title="Change the trigger to the Upstackified Klaviyo metric">
    In the cloned flow, edit the trigger and change the source to the matching Upstack-emitted Klaviyo metric:

    * Browse Abandonment → **Viewed Product - Upstackified**
    * Cart Abandonment → **Added to Cart - Upstackified**
    * Checkout Abandonment → **Started Checkout - Upstackified**
    * Site Abandonment → **Active on Site - Upstackified**

    Upstack pushes these events to Klaviyo for sessions identified server-side rather than by Klaviyo's native tracking.
  </Step>

  <Step title="Add a 30-minute delay offset">
    In the Upstack copy of the flow, add **+30 minutes** to the first wait step compared to the standard flow (for example, `1 hour` becomes `1 hour 30 minutes`). This serves two purposes:

    * It gives Klaviyo's native tracking time to identify the visitor on its own. If Klaviyo picks them up within those 30 minutes, the mutual exclusion filter (next step) prevents the Upstack flow from sending.
    * It aligns with the typical window in which visitors are most likely to return on their own, before the abandonment email is most effective.
  </Step>

  <Step title="Set mutual exclusion filters">
    Add a profile filter on each flow's trigger so visitors don't receive abandonment emails from both flows:

    1. On the **standard** flow, add: **Has received email 0 times in last 7 days where Flow = `[Upstack copy of the flow]`** (for example, `Abandoned Cart - Upstack Data`).
    2. On the **Upstack copy** of the flow, add the reverse filter: **Has received email 0 times in last 7 days where Flow = `[Standard flow]`** (for example, `Abandoned Cart`).

    This 7-day mutual exclusion window prevents over-messaging. Detailed walkthrough: [Add cross-flow exclusion filters in Klaviyo](/guides/klaviyo-abandonment-flows/how-to-add-cross-flow-exclusion-filters-in-klaviyo).
  </Step>

  <Step title="Repeat for Cart, Checkout, and Site Abandonment">
    Follow the same process for your Cart Abandonment, Checkout Abandonment, and Site Abandonment flows: clone with the ` - Upstack Data` suffix, change the trigger to the corresponding `*- Upstackified` event, add the 30-minute delay offset, and set mutual exclusion filters in both directions.
  </Step>

  <Step title="Match email content and step structure">
    Your Upstack-triggered flows should use the same email templates, timing between steps, and step statuses (live/draft/manual) as your native flows. The visitor experience should be identical regardless of which flow they entered through — the only difference is how they were identified.
  </Step>

  <Step title="Set flows live and monitor">
    1. Set each Upstack flow to **Live** status.
    2. Monitor performance over the first 7 days to verify events are flowing and emails are sending.
  </Step>
</Steps>

<Warning>
  **Mutual exclusion filters are required.** Without them, a customer identified by both Klaviyo and Upstack will receive duplicate abandonment emails. Always configure the 7-day exclusion in both directions.
</Warning>

## Expected results

Brands implementing the waterfall setup typically see:

| Metric                              | Before enrichment | After enrichment |
| ----------------------------------- | ----------------- | ---------------- |
| Profiles entering abandonment flows | Baseline          | +30–40%          |
| Browse abandonment flow revenue     | Baseline          | +25–35%          |
| Cart abandonment flow revenue       | Baseline          | +20–30%          |
| Total email-attributed revenue      | Baseline          | Measurable lift  |

The exact lift depends on your existing Klaviyo identification rate, traffic volume, and how much of your audience shops across multiple devices or returns after cookie expiration. Brands with high mobile and social media traffic see the largest improvement because those channels produce the most cross-device and in-app browser sessions.

## Best practices

### Run both flow sets in parallel — indefinitely

Don't turn off your native Klaviyo flows when Upstack flows are running. They serve different visitor pools. Disabling native flows means you lose coverage for the visitors Klaviyo already identifies successfully.

### Track attribution separately

Use UTM parameters to distinguish Upstack-triggered emails from native Klaviyo emails:

* Native flow: `utm_source=klaviyo&utm_medium=email&utm_campaign=browse_abandon`
* Upstack flow: `utm_source=klaviyo&utm_medium=email&utm_campaign=browse_abandon_upstack`

This lets you measure incremental revenue contribution separately from your existing Klaviyo revenue — critical for understanding ROI.

### Monitor flow performance weekly

In your first month, check these metrics weekly for each Upstack flow:

* **Flow entry rate.** How many profiles are entering the Upstack flows? If it's near zero, the Klaviyo connection or trigger configuration may need attention.
* **Email open and click rates.** These should be comparable to your native flows. If significantly lower, the identified profiles may be lower quality or the timing may need adjustment.
* **Revenue per recipient.** The key metric. Compare this between native and Upstack flows to understand incremental value.
* **Unsubscribe rate.** Monitor closely in the first two weeks. If Upstack flows show elevated unsubscribes, consider extending the delay or tightening exclusion filters.

### Adjust the delay window if needed

The 30-minute delay is a starting point. If you find significant overlap between native and Upstack flows (visible as a high exclusion filter rate on the Upstack side), extend the delay to 45 or 60 minutes. If you're seeing very little overlap, you can shorten it to 15 minutes to trigger faster.

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Will Upstack replace my existing Klaviyo flows?">
    No. Upstack's Klaviyo enrichment is designed to run alongside your existing flows, not replace them. Your native Klaviyo flows continue to catch visitors that Klaviyo identifies on its own. Upstack flows catch the visitors Klaviyo misses. Both run in parallel with mutual exclusion filters to prevent overlap.
  </Accordion>

  <Accordion title="How does Upstack identify visitors that Klaviyo can't?">
    Upstack uses server-side identity resolution — matching visitors through a combination of server-side signals (IP, user agent, device fingerprint, hashed identifiers) against an identity graph built from previous sessions. This works independent of browser cookies, so it survives cross-device transitions, cookie expiration, and in-app browser isolation that break Klaviyo's client-side tracking.
  </Accordion>

  <Accordion title="Will this cause customers to receive duplicate emails?">
    Not if you set up mutual exclusion filters correctly. The 7-day exclusion window ensures that a customer identified by both Klaviyo and Upstack only receives one abandonment email. The 30-minute delay on Upstack flows gives Klaviyo's native tracking first priority.
  </Accordion>

  <Accordion title="How long does it take to see results?">
    You should see profiles entering Upstack flows within 24 hours of going live. Meaningful revenue data typically requires 7–14 days of flow activity, depending on your traffic volume and conversion rates.
  </Accordion>

  <Accordion title="Can I use Upstack identity enrichment for flows other than abandonment?">
    Yes. While abandonment flows are the highest-impact use case, Upstack's identified profiles can trigger any Klaviyo flow — win-back campaigns, post-purchase sequences, or custom flows based on specific browsing behavior. The same waterfall principle applies.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Klaviyo destination" icon="plug" href="/destinations/klaviyo">
    Configure the Klaviyo destination to enable identity-enriched profile delivery.
  </Card>

  <Card title="Onboarding Klaviyo in Upstack" icon="rocket" href="/guides/klaviyo/complete-how-to-guide-for-onboarding-klaviyo-in-upstack-data">
    End-to-end Klaviyo onboarding inside Upstack.
  </Card>

  <Card title="Set up Upstack abandonment flows" icon="bolt" href="/guides/klaviyo-abandonment-flows/complete-guide-to-setting-up-upstack-abandonment-flows-in-klaviyo">
    Step-by-step Klaviyo flow setup with cloning, delays, and exclusions.
  </Card>

  <Card title="Clone your standard flows" icon="copy" href="/guides/klaviyo-abandonment-flows/how-to-clone-your-standard-flows-in-klaviyo">
    Detailed clone procedure for each standard abandonment flow.
  </Card>

  <Card title="Cross-flow exclusion filters" icon="filter" href="/guides/klaviyo-abandonment-flows/how-to-add-cross-flow-exclusion-filters-in-klaviyo">
    Configure mutual exclusion between native and Upstack flows.
  </Card>

  <Card title="Identity resolution" icon="fingerprint" href="/concepts/identity-resolution">
    How Upstack's server-side identity engine works.
  </Card>
</CardGroup>
