Futureman Labs
Revenue Protection

Why Your Klaviyo Revenue Numbers Don't Match Shopify (And How to Fix It)

Your Klaviyo dashboard says email drove $200K last month. Shopify says total revenue was $150K. Here's why the numbers never match, what it's actually costing you, and how to build an automated reconciliation pipeline that gives you trustworthy attribution data.

David YuFebruary 6, 202612 min read

Here's a scenario that plays out constantly in DTC: a brand's email marketing manager puts together a Q4 performance report showing that Klaviyo-attributed revenue for December was $204,000. The store's Shopify revenue for the same period? $152,000.

Let that sink in. Klaviyo was claiming credit for $52,000 more than the store's total revenue.

The marketing team uses Klaviyo's revenue numbers to justify the email program's budget. The finance team uses Shopify's numbers for actual P&L reporting. The founder is looking at two completely different stories about the business and has no idea which one to trust.

This isn't a rare edge case. Across DTC brands, Klaviyo's attributed revenue exceeds actual Shopify revenue by 20-60% for most stores. The discrepancy isn't a bug -- it's a feature of how attribution models work. But if you're making real business decisions based on inflated numbers, you're flying blind.

Here's exactly why the numbers don't match, why it matters more than you think, and how to build a system that gives your store trustworthy marketing attribution data.

Understanding the Gap: Why Klaviyo and Shopify Will Never Agree

Before getting into the fix, you need to understand the structural reasons these numbers diverge. This isn't about one system being "wrong." It's about two systems measuring fundamentally different things.

Cause 1: Attribution Windows and Multi-Touch Overlap

Klaviyo's default attribution model gives email credit for a purchase if the customer clicked an email within the last 5 days, or opened an email within the last 5 days, before making a purchase. These windows are configurable, but most stores leave them at defaults.

Here's where it gets inflated: if a customer clicks a Klaviyo email on Monday and then clicks a Facebook ad on Wednesday and purchases on Thursday, Klaviyo claims the full revenue. So does Facebook. So does Google if they touched a search ad in between.

Every marketing platform attributes the full order value to itself. This is by design -- each platform's attribution model is optimized to make that platform look good. The result is that if you sum up all your channel-attributed revenue, the total can easily be 2-3x your actual revenue.

Typically, you'll find that approximately 35% of Klaviyo-attributed orders also have a paid media touchpoint within the attribution window. Klaviyo is claiming full credit for orders that are, at best, jointly influenced.

Cause 2: UTM Parameter Stripping and Redirect Chains

This one is more technical but equally damaging. When Klaviyo sends an email, the links contain UTM parameters and Klaviyo's own click-tracking redirect. The flow looks like this:

Email link clicked
  -> Klaviyo click-tracking server (records click)
  -> Redirect to your store URL with UTM parameters
  -> Shopify records the session with UTM data

In theory, this gives you clean attribution data in both systems. In practice, several things break this chain:

  • iOS Mail Privacy Protection pre-fetches email content (including tracking pixels), which can register "opens" that never happened. Since Klaviyo attributes revenue to opens, this inflates numbers.
  • Link shorteners and redirect chains can strip UTM parameters. If you're using a custom domain redirect, a link-in-bio tool, or certain URL structures, the UTMs might not survive the journey.
  • Browser privacy features and extensions (Safari ITP, ad blockers, Brave browser) can strip tracking parameters or block the Klaviyo tracking script on your site, creating attribution gaps in the opposite direction.

A controlled test illustrates this well: sending a test email to a list of 500 known internal accounts across different devices and email clients typically shows that only about 73% of clicks preserve UTM parameters all the way through to a Shopify session. That means roughly 27% of clicks are either misattributed or lost entirely.

Cause 3: Duplicate Event Firing

This is often the single largest contributor to inflated numbers, and it's embarrassingly common.

Shopify sends order data to Klaviyo via its native integration. Klaviyo also has its own JavaScript tracking snippet on the storefront that fires events when purchases happen. If both are active and not properly deduplicated, every order can be recorded twice in Klaviyo.

Klaviyo does have built-in deduplication logic, but it relies on matching event IDs. When the Shopify integration sends an "Order Placed" event and the JavaScript snippet sends a "Placed Order" event, the event names are slightly different, and the deduplication can fail.

In most stores where this issue is present, approximately 15% of orders end up double-counted in Klaviyo. On a store doing $150K/month, that alone can account for roughly $23,000 of the discrepancy.

Cause 4: Refund and Cancellation Handling

Shopify's revenue numbers are net of refunds and cancellations. When you look at your Shopify dashboard, returned orders reduce the total.

Klaviyo's attributed revenue, by default, does not automatically deduct refunds. The "Placed Order" event fires at the time of purchase and the revenue is locked in. If that order is later refunded, Klaviyo doesn't retroactively subtract it from the attributed revenue for the email that drove the purchase.

Some stores configure "Refunded Order" events in Klaviyo, but even then, the revenue attribution reports don't always subtract refunds from the campaign or flow that originally got credit.

For a store processing $150K+/month, December refunds can easily total $15,000-$20,000. Klaviyo's numbers won't reflect any of it.

Cause 5: Tax and Shipping Inclusion Differences

A smaller but persistent discrepancy: Shopify and Klaviyo may handle tax and shipping amounts differently depending on your configuration. Shopify's "Total Sales" metric in the dashboard includes or excludes tax and shipping based on your report settings. Klaviyo's "Placed Order" revenue typically captures the total order value, which may or may not include tax depending on what your integration passes.

Depending on your store's tax rate and average shipping cost, this difference can account for $3,000-$5,000+ per month of the gap.

Why This Actually Matters: Bad Data Drives Bad Decisions

You might be thinking: "So what? Every brand knows attribution isn't perfect. We just use it directionally."

That would be fine if your team was actually treating it directionally. But here's what typically happens in practice:

Budget allocation based on inflated ROAS. If your email team is reporting a 12:1 return on the Klaviyo investment but the real number, after reconciliation, is closer to 6:1 -- that's still good (email is almost always your highest-ROI channel) -- but the inflated number can be used to argue against increasing paid media spend that actually has higher marginal returns.

Complacency about list health. When Klaviyo says your email program generated $200K, there's less urgency to optimize. A reconciled number of $130K tells a different story: deliverability may be declining, open rates may be falling, and the program needs attention.

Incorrect customer acquisition cost calculations. When you're using inflated channel revenue to calculate CAC and LTV by acquisition channel, your entire unit economics model is wrong. Inflated email attribution can lead to underestimating true email CAC by nearly 40%.

Board and investor reporting issues. If you're reporting channel performance to investors using platform-reported numbers that don't reconcile to actual revenue, you have a credibility problem waiting to happen.

Ready to Automate This?

One subscription, unlimited automation requests. From workflow builds to AI agents — we handle it all. No hiring, no contracts, no surprises.

The Fix: Building an Automated Attribution Reconciliation Pipeline

Here's what this reconciliation system looks like. The goal isn't to create a "perfect" attribution model -- that's a fool's errand. The goal is to create a trustworthy, consistent attribution model that the entire team can use for decision-making.

Step 1: Establish Shopify as the Single Source of Revenue Truth

First principle: Shopify's net revenue is reality. No marketing platform's attributed revenue should ever exceed actual revenue. This sounds obvious, but it requires actively enforcing it.

Set up a nightly data pull from Shopify's Orders API that captures:

  • Gross revenue (before refunds)
  • Net revenue (after refunds and cancellations)
  • Revenue broken down by first-touch UTM source/medium/campaign
  • Revenue broken down by last-touch UTM source/medium/campaign
  • Order-level data including customer ID, email, and all UTM parameters from the session

This becomes the foundation that all attribution gets reconciled against.

Step 2: Fix the Duplicate Event Problem

When you audit a Klaviyo integration, you'll commonly find both the native Shopify integration AND the Klaviyo JavaScript snippet firing purchase events. The fix:

  • Disable the JavaScript-based purchase tracking and rely solely on the Shopify native integration for order events. The native integration is more reliable and includes proper order IDs for deduplication.
  • Keep the JavaScript snippet active only for browse and cart events (Added to Cart, Viewed Product), which the native integration doesn't capture.
  • Run a deduplication check on historical data to identify and flag the double-counted orders.

This single fix can reduce the attribution gap by $20,000+ per month for a store doing $150K in revenue.

Step 3: Build the Reconciliation Workflow

You can build an n8n workflow (or use any automation platform) that runs daily and performs the following reconciliation:

  1. Pull Klaviyo's attributed revenue for each campaign and flow, broken down by day.
  2. Pull Shopify's actual order data for the same period, including UTM parameters and customer email addresses.
  3. Match Klaviyo-attributed orders to actual Shopify orders using the order ID. For every order Klaviyo claims, verify it exists in Shopify and hasn't been refunded.
  4. Calculate a daily "attribution ratio" -- the percentage of Klaviyo-claimed revenue that maps to verified, non-refunded Shopify orders where email was a legitimate touchpoint.
  5. Apply the attribution ratio to generate a "reconciled revenue" figure for each campaign and flow.
  6. Push the reconciled data to a Google Sheet that serves as the team's single reporting dashboard.

The workflow should also flag anomalies: if the attribution ratio for any single day drops below 60% or exceeds 95%, trigger a Slack alert for manual investigation. These extremes usually indicate a tracking issue that needs fixing.

Step 4: Implement Proper Refund Tracking

Configure a "Refunded Order" event in Klaviyo and build a workflow that:

  • Captures every refund event from Shopify (full and partial refunds).
  • Looks up the original "Placed Order" event in Klaviyo for that order ID.
  • Tags the original event with refund data (refund amount, date, reason).
  • Subtracts refund amounts from the reconciliation pipeline's revenue calculations.

This ensures that the reconciled attribution numbers are always net of refunds, matching how Shopify reports revenue.

Step 5: Create a Normalized Attribution Report

The final output is a weekly report that the entire team -- marketing, finance, and leadership -- can trust. It includes:

  • Shopify net revenue (the ground truth)
  • Klaviyo raw attributed revenue (what Klaviyo reports)
  • Klaviyo reconciled revenue (after deduplication, refund subtraction, and cross-channel adjustment)
  • Attribution ratio (reconciled / raw -- this trends over time and serves as a health metric)
  • Channel-level breakdown showing email's share of revenue alongside paid media, organic, and direct
  • Campaign-level performance using reconciled numbers so the email team can optimize based on reality

What to Expect: Clarity That Changes Decision-Making

Once this system is running, here's a realistic example of how the numbers shift for a store doing ~$150K/month:

MetricBefore ReconciliationAfter Reconciliation
Klaviyo raw attributed revenue~$200,000~$200,000 (unchanged -- this is what Klaviyo reports)
Klaviyo reconciled revenueN/A~$127,000
Attribution ratioUnknown~64%
Shopify net revenue~$155,000~$155,000
Email's verified share of total revenueUnknown~42%

The reconciled numbers tell a very different story than the raw Klaviyo data. Email is still typically the most valuable owned channel -- 42% of verified revenue is excellent -- but it's not the magical money machine the inflated numbers suggest.

More importantly, the data often reveals that several "high-performing" flows are actually getting credit for purchases that would have happened anyway. Post-purchase cross-sell flows, for example, might show $34,000 in Klaviyo-attributed revenue but only $8,000 in reconciled revenue. Most of those customers were already on the site adding items to their cart when the email arrived.

This kind of clarity leads to meaningful reallocation of marketing effort -- shifting focus from tweaking flows with phantom revenue to improving campaigns with genuine incremental impact, such as winback series and new subscriber welcome sequences, which tend to have the highest reconciled attribution ratios.

How to Check If You Have This Problem

You almost certainly do. But here's how to confirm and estimate the magnitude:

  1. Pull your Klaviyo revenue for last month from the Analytics dashboard. Sum all campaign and flow attributed revenue.
  2. Pull your Shopify net revenue for the same period.
  3. Calculate the ratio. If Klaviyo's number is more than 110% of Shopify's, you have a meaningful discrepancy.
  4. Check for duplicate events. In Klaviyo, go to a recent customer profile and look at their event timeline. If you see both "Order Placed" and "Placed Order" events for the same purchase, you have double-counting.
  5. Check your refund handling. Search Klaviyo for "Refunded Order" events. If they don't exist, your attribution numbers are gross of refunds while your Shopify numbers are net.

If the ratio is above 130%, you're likely making resource allocation decisions based on meaningfully wrong data. The further it drifts from 100%, the more urgently you need a reconciliation system.

Don't let inflated attribution data drive your business strategy. The truth is always more useful than a flattering lie.

Want to Talk Through Your Automation Needs?

Book a 30-minute call. We'll map out which automations would save you the most time — no obligation.

Want to Talk Through Your Automation Needs?

Book a 30-minute call. We'll map out which automations would save you the most time — no obligation.