How to Stop Klaviyo Counting Magento 2 Orders Twice When Klaviyo's Extension and the Server-Side Addon Both Run

|Dan Giura
How to Stop Klaviyo Counting Magento 2 Orders Twice When Klaviyo's Extension and the Server-Side Addon Both Run

TL;DR

Klaviyo's Magento 2 integration and the Klaviyo API Addon reach Klaviyo by different routes at different times, so with both on, each order produces two Placed Order events. Klaviyo's pages point both ways on whether it files them under one metric or two, so your own Metrics list shows how it filed them, and either way counts and flows can double. Once you've looked, give each metric one owner, untick the addon's duplicate events, and clone any flow whose trigger has to move.

Key Takeaways

  • Klaviyo's Magento 2 integration syncs order data every 30 minutes and derives Placed Order from the order's status, while the addon sends Placed Order from the order success page, with a cron fallback [1] [2].
  • Check Analytics > Metrics, filtered by integration, to see how Klaviyo filed the two Placed Order events before you change anything [3] [4].
  • Only Placed Order and Viewed Product collide by exact name; Added to Cart differs by one capital letter, and Checkout Started and Started Checkout name the same checkout step, but Klaviyo sends its Started Checkout only for a checkout that isn't completed [1] [2].
  • Fulfilled Order, Canceled Order and Refunded Order come only from Klaviyo's extension; none of the addon's ten events follows an order after checkout [1] [2].
  • Our default: Klaviyo's extension owns Placed Order and the lifecycle metrics, the addon keeps the funnel events that don't collide, and Placed Order is unticked in its Track Events list.
  • Klaviyo documents no per-metric switch inside its Magento integration, and a flow's trigger metric can't be changed, so you clone the flow [1] [5].
  • Compare the Value field on one test order, because the two values can differ [1].

Follow one order through both senders

A shopper finishes checkout. Two senders now have a claim on that order, and they don't act together.

When What happens Sender Klaviyo metric
Checkout completes The order success page triggers the addon's Placed Order over Klaviyo's API; a cron job sends orders the success page didn't [2] The addon Placed Order
Within the next 30 minutes The sync reads the order's status; every status outside the named ones below becomes Placed Order, and pending_payment is ignored [1] Klaviyo's extension Placed Order
Status becomes complete The status matrix triggers a metric [1] Klaviyo's extension Fulfilled Order
Status becomes canceled or cancelled Same matrix [1] Klaviyo's extension Canceled Order
Status becomes pay_aborted Same matrix [1] Klaviyo's extension Canceled Payment
Status becomes closed Same matrix [1] Klaviyo's extension Refunded Order

Klaviyo adds Ordered Product for each product on the order and Fulfilled Shipment when a shipment is created [1].

Two things follow from the table. Klaviyo warns that a flow set to send immediately on a metric like Magento 2's Placed Order may not send immediately, because that metric syncs every half-hour [5]. A flow built on the addon's Placed Order doesn't depend on that sync. If both Placed Orders carry a post-purchase flow, one customer can get two emails for one order, at two different times, and you may already have seen one land twice.

Everything below the first two rows exists only because Klaviyo's sync re-reads the status. The addon sends ten events covering the funnel, the cart and the order placement, and none of them follows the order afterward [2]. It can't replace the extension's lifecycle metrics, and it isn't meant to.

Which Klaviyo Magento 2 metrics does each sender create?

Klaviyo's extension creates Placed Order, Ordered Product, Fulfilled Order, Fulfilled Shipment, Canceled Order, Canceled Payment, Refunded Order, Started Checkout, Added To Cart, Viewed Product and Active on Site [1]. The addon sends Placed Order, Checkout Started, Added to Cart, Added to Wishlist, Product Searched, Viewed Product, Viewed Category, Created Account, and a page-view and a payment-step event [2]. Lay the two lists side by side and the overlaps fall into three kinds.

Kind of overlap Klaviyo's extension The addon What it means
Exact name Placed Order Placed Order The duplicate this guide is about
Exact name Viewed Product Viewed Product Check your Metrics list
Spelling only Added To Cart (extension 4.0.0 and above) Added to Cart Klaviyo documents no merge either way
Renamed Started Checkout Checkout Started No duplicate row, but two abandoned-checkout triggers

Nothing looks doubled for the renamed pair, yet a flow on each name can enter the same shopper. Klaviyo's Started Checkout needs a quote with an email address, can take up to an hour to sync, and isn't sent for a checkout that completes [1]; the addon's Checkout Started is sent when the checkout page loads [2].

Added to Wishlist, Product Searched, Viewed Category and Created Account have no same-name counterpart on Klaviyo's Magento 2 list. The addon's page-view and payment-step events don't either; read their exact names in your own Metrics list before you build on them.

Look at your own account before you change anything

Klaviyo's Metrics API overview says that "All Placed Order events collected or sent via the same mechanism (a given integration or our APIs) will share the same Placed Order metric" [3]. The addon sends over Klaviyo's API with a private key [2], and the extension is an integration. That is two mechanisms. Klaviyo's metrics page also says the events API creates a custom metric "if it doesn't currently exist" [4], so its pages point both ways and we don't predict one metric or two. What holds either way: with both senders on, each order produces two Placed Order events, and your Metrics list shows how Klaviyo filed them.

  1. Open Analytics > Metrics and look at the Placed Order rows, then use the All integrations dropdown to see which integration each belongs to [4]. Klaviyo says the metrics with a Magento 2 icon are the order events synced from the integration, and onsite events carry a gear icon [1].
  2. Open a flow that starts on Placed Order. The sidebar names the trigger metric and, for an integration metric, shows the integration's icon beside it [6]. Two rows or one, the owner decision below applies: one row holds both events, two rows let you build on either. Do the same check for Viewed Product and Added to Cart, because Klaviyo doesn't say whether either pair merges.

Who should own each metric?

Ownership is decided per metric. Switching off a whole sender is the wrong move, since each owns metrics the other can't produce.

Metric Who can send it Owner (our recommendation) Switching the other off
Placed Order Both Klaviyo's extension, unless flows must start inside 30 minutes Untick Placed Order in the addon's Track Events; Klaviyo documents no per-metric switch in its integration
Ordered Product, Fulfilled Order, Fulfilled Shipment, Canceled Order, Canceled Payment, Refunded Order Klaviyo's extension only Klaviyo's extension Nothing to switch
Abandoned-checkout trigger Started Checkout (extension), Checkout Started (addon) One name per flow Build the flow on one; untick Checkout Started if you don't want the events
Added to Cart, Viewed Product Both Whichever row your flows and reports already use Untick in Track Events if you keep the extension's row; Klaviyo documents no switch for its own
Added to Wishlist, Product Searched, Viewed Category, Created Account, page-view and payment-step events The addon only The addon Nothing to switch

For most stores, WeltPixel's default is: Klaviyo's extension owns the order family, because the Fulfilled, Canceled and Refunded metrics exist only there, and the addon keeps the funnel events that don't collide.

A store where a post-purchase email has to leave inside 30 minutes is the exception. There the addon's Placed Order is the faster trigger, for the orders the addon sends (see the consent step below). Because Klaviyo documents no way to switch Placed Order off inside its integration, that row keeps filling. You build flows and reports on the addon's Placed Order and treat the extension's row as the lifecycle record.

How do you switch the second sender off?

Only the addon has a documented switch. Klaviyo's Magento 2 data reference documents no per-metric switch; the only change it describes is a status mapping, which Klaviyo makes on request for custom order statuses [1].

  1. Go to Admin > WeltPixel > Google Analytics 4 Ecommerce PRO > Klaviyo API Settings > Track Events, deselect Placed Order and any other event you've given to Klaviyo's extension, save, and flush the Magento cache [2] [7]. The addon requires GA4 PRO, which the Standard vs PRO comparison places on the PRO tier.
  2. The GA4 PRO browser Klaviyo pixel becomes a third path only if the addon's Send enabled events via the frontend Klaviyo tracking as well is set to Yes [2]. In that case check its own Track Events list under Admin > WeltPixel > Klaviyo Pixel Tracking too, which is separate from the addon's [7].
  3. For any flow built on the metric you're dropping, clone it and pick the new trigger, because Klaviyo doesn't let you change a flow's trigger metric after it's set [5]. Check the clone's trigger filters, which may rely on the old trigger's data, and keep the original if you need its analytics [10].
  4. Open Analytics > Metrics > Edit mapped metrics. Klaviyo assigns one metric to each of seven concepts, among them Revenue, Cancelled sales and Refunded sales, and a metric can be mapped only once [8]. Point Revenue at the Placed Order you kept.

Klaviyo notes that its Revenue figure doesn't subtract canceled and refunded orders, so the dashboard won't always match Magento, whichever sender you keep [1].

Check the fix on a test order

  1. Place a test order on the store view where the addon is enabled.
  2. Wait past the 30-minute sync, then open the activity feed of each Placed Order metric. Between them, the Placed Order metrics should hold exactly one event for that order.
  3. If the addon should have sent one and didn't, read klaviyo-api.log in var/log with Enable File Log on [2]; setting up Klaviyo server-side tracking on Magento 2 covers the keys and the log.
  4. Consent can explain a missing event: since v1.17.4, with Require Visitor Consent for Server-Side Events switched on, the addon's events are gated on the shopper's advertising consent and order events are judged on the consent stored with the order [2], as the guide to server-side events and consent explains.
  5. If both Placed Orders still exist, compare their Value fields. The two can differ.

FAQ

Does the addon replace Klaviyo's Magento 2 extension?

No. The addon sends ten events, and none is Fulfilled Order, Canceled Order or Refunded Order [2]. Those come from the extension's status sync [1].

Will Klaviyo file both Placed Orders under one metric?

Klaviyo's documented rule covers events sent through the same mechanism [3]. It doesn't say what happens when an integration and the events API send the same name, so read your Metrics list.

Do both Placed Orders produce conversion numbers?

Klaviyo says it computes conversion analytics for all metrics in your account [9]. If Klaviyo files the second sender's events as a second metric, it would carry its own numbers; that's our reading, because the page doesn't mention duplicate metrics.

Keep order metrics under one owner and let the funnel events come from the addon: both are part of the Magento 2 Google Analytics 4 extension and its Klaviyo addon.

Sources

  1. Magento 2 data reference, Klaviyo Help Center (updated July 31, 2025), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/115003458852
  2. Klaviyo API Addon for Google Analytics 4 PRO User Guide and Change Log (Track Events; Advanced Configuration; v1.15.7 and v1.17.4 entries), retrieved October 20, 2026, https://docs.weltpixel.com/KlaviyoAddon/User-Guide-WeltPixel-Klaviyo-Addon.html
  3. Metrics API overview, Klaviyo Developers, retrieved October 20, 2026, https://developers.klaviyo.com/en/reference/metrics_api_overview
  4. Getting started with metrics, Klaviyo Help Center (updated August 14, 2025), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/115005076787
  5. How to create a metric-triggered flow, Klaviyo Help Center (updated October 8, 2026), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/360003057151
  6. Troubleshooting a metric-triggered flow, Klaviyo Help Center (updated October 7, 2026), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/12278373016603
  7. WeltPixel Google Analytics 4 User Guide (Klaviyo Pixel Tracking), retrieved October 20, 2026, https://docs.weltpixel.com/GA4/User-Guide-WeltPixel-Google-Analytics-4.html
  8. How to use account-level mapped metrics, Klaviyo Help Center (updated August 6, 2025), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/25829057055899
  9. Understanding message conversion tracking, Klaviyo Help Center (updated March 26, 2026), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/115005248128
  10. How to change a flow trigger, Klaviyo Help Center (updated October 7, 2026), retrieved October 20, 2026, https://help.klaviyo.com/hc/en-us/articles/115002775052

Ready to upgrade your tracking?

Server-side tracking for Magento and Shopify — accurate data, better attribution, full privacy compliance.