Playbook · Add-to-cart tracking

Add-to-cart, begin-checkout, or purchase events missing or double-firing after you already installed pixels.

Written for a Shopify DTC owner who already dropped in Klaviyo, Google, or Meta — app pixel, theme embed, or both — and still watches Added to Cart, Checkout Started, or Placed Order come in late, twice, or not at all. Native tools first. Honest limits. No recovered-revenue number, no conversion-lift, no invented case studies.

Nico at Latch AI Ops · Sep 1, 2026 · ~12 minute read

Buy the 72-hour install — $997Abandoned checkoutKlaviyo + ShopifyWISMO playbookMerchant FAQ

01

Missing and double-firing are different bugs.

Missing means the destination never saw the event. You added a product on a phone, started checkout, or paid a test order, and Klaviyo’s metric, Meta’s Test Events, or GA4 DebugView stayed quiet. The flow that waits on Added to Cart does not start. The ad account that waits on Purchase does not see the order you just took.

Double-firing means the destination saw it twice. One add to cart becomes two Added to Cart events. One paid order becomes two Purchases. Klaviyo can start the same flow twice. Meta and Google can count two conversions on one order. That is not “more data.” That is a second pixel still live next to the one you meant to keep.

Do not treat those as one “tracking problem.” The fix for missing is usually a button, a checkout sandbox, or a pixel that never subscribed to the event. The fix for double-firing is turning something off. Mixing them is how stores add a third snippet and make both bugs worse.

02

You already installed the pixels. That is the point.

This page is not “how to add a Meta pixel.” You already did that. The Klaviyo app is installed. Google is in Customer events or GTM. Meta’s app pixel or base code is on the theme. The store still does not send a clean add-to-cart, begin-checkout, or purchase.

“Installed” on Shopify is several places at once. Settings → Customer events. Online Store → Themes → App embeds. The theme’s custom liquid. Thank-you / order-status additional scripts, if you still have them. A Google Tag Manager container that loads the same tags the apps already load. Checkout is a different runtime from the product page. A pixel that “works” on the homepage can still miss the event you actually care about.

If the failure is mail — order confirmation twice, shipping silent, abandoned checkout late — that is a different playbook. Start with Klaviyo + Shopify notifications or abandoned checkout. This page is the event that those flows sit on, not the email itself.

03

Add-to-cart, begin-checkout, and purchase are not one event.

Add-to-cart fires on the storefront: product page, collection quick-add, cart drawer, sticky bar. Shopify’s standard product form does it. A custom button that only updates the cart with Ajax, and never hits the form Shopify instruments, often does not.

Begin-checkout (Checkout Started in Klaviyo, InitiateCheckout in Meta, begin_checkout in Google) fires when the customer enters checkout — Shop Pay, Shopify checkout, or a checkout extension. That is not the cart page. “Viewed cart” is a different metric. Mixing those words is how a store thinks checkout tracking works because the cart drawer pixel blinked.

Purchase (Placed Order / Purchase / purchase) fires after payment, on the thank-you page or via Shopify’s server-side customer event. A pixel that only lives in the theme never sees checkout unless you also have a checkout-capable app pixel or customer event. That is the usual “add-to-cart works, purchase does not” report.

Diagnose them as three rows, not one. A store can be clean on purchase and dark on add-to-cart. The opposite is just as common. Fix the row that is actually broken.

04

See the failure in Klaviyo, Google, or Meta — not in the theme.

The theme looking “tagged” is not proof. Proof is the destination receiving one event for one action. Do this in one sitting, on a phone or incognito window that is not logged into Shopify admin:

  • Klaviyo → Analytics → Metrics. Open Added to Cart, Checkout Started, Placed Order. Note the last timestamp and whether a single test action created one event or two.
  • Meta Events Manager → Test events. Add a product, start checkout, pay a $1 order to yourself. Watch AddToCart, InitiateCheckout, Purchase. Duplicate hits show up here as two rows with the same test code.
  • Google: Tag Assistant or GA4 DebugView for add_to_cart, begin_checkout, purchase. If GTM and the Google & YouTube channel are both live, you will often see two.
  • Shopify admin → Settings → Customer events. List every pixel. Then Online Store → Themes → App embeds. Same apps often sit in both places.

Compare those events to Shopify’s own numbers for the same hour: products added is harder to count, but checkouts and paid orders are not. If Shopify shows ten paid orders and Klaviyo shows eighteen Placed Order events, you have double-fire, not a sales problem. If Shopify shows ten and Klaviyo shows three, you have missing — usually checkout or a custom thank-you path.

This is an audit. It is not a lift. This page will not tell you what those events are “worth.”

05

Why the pixel you already added still misses.

The usual misses, in the order I actually see them:

  • Custom add-to-cart. Quick-add on a collection, a sticky bar, a cart drawer that posts to /cart/add.js and never uses the product form Shopify’s pixels subscribe to. The cart updates. The event does not.
  • Checkout is a sandbox. Theme liquid and many legacy snippets do not run there. Begin-checkout and purchase need a Shopify customer-events pixel or an app pixel that Shopify allows on checkout — not a theme.liquid paste.
  • Shop Pay / accelerated checkout. The customer never touches the cart page you instrumented. If begin-checkout only fires from that page, Shop Pay buyers are invisible.
  • App embed off, or only on the unpublished theme. The Klaviyo or Meta app is installed. The embed toggle on the live theme is still off. Admin looks connected. The storefront is not.
  • Consent / customer privacy. Shopify’s privacy banner or a consent app holds marketing pixels until the visitor accepts. Your test as the owner, already cookied, still fires. A new visitor does not. Check Settings → Customer privacy before you rebuild the pixel.

Fix the path the customer actually uses. If 80% of adds come from the collection quick-add, instrument that button — or put the standard product form back. Do not add a second Meta snippet “just in case.” That is how you graduate from missing to double-firing.

06

Why it fires twice.

Two senders on the same event, same destination. That is the whole bug. Common pairs:

  • Klaviyo app pixel in Customer events plus the Klaviyo onsite snippet still in theme.liquid or an old Google Tag Manager tag.
  • Meta app pixel plus the base fbq('init') you pasted in 2023 plus a “conversion” app that also claims Purchase.
  • Google & YouTube channel plus GTM loading GA4 plus an extra gtag in additional scripts.
  • Shopify’s thank-you additional scripts still firing purchase after you already turned on a checkout app pixel.
  • Browser pixel and a server-side / Conversions API event with no event_id dedup. Both are valid. Both without a shared id is two purchases.

The fix is a list, then a delete. Write every place that can send Added to Cart, Checkout Started, or Purchase. Keep one per destination. Turn the rest off — embed toggle, customer event, GTM tag, additional scripts. Then rerun the phone test. If you still see two, you missed a sender. Do not add a filter or a “don’t fire if…” hack on top of two live pixels.

07

One owner per event, per destination.

Make a nine-cell grid: add-to-cart, begin-checkout, purchase × Klaviyo, Google, Meta. Each cell gets one owner. For most small Shopify stores that is:

  • Klaviyo: the official Shopify app pixel in Customer events. App embed on. No extra onsite snippet.
  • Meta: the official Shopify channel / app pixel. No leftover fbq in the theme.
  • Google: either the Google & YouTube channel or GTM, not both loading the same GA4 measurement id.

Then test the three actions again. One add, one checkout start, one $1 order. One event each. If a custom add-to-cart still misses, that is a theme job: point the button at the same path the pixel already watches, or use Shopify’s product form. It is not a reason to paste a fourth snippet.

Abandoned-checkout mail sits on Checkout Started. If that metric is missing or doubled, the recovery sequence will be late, twice, or silent — which is the abandoned-checkout playbook, after the event itself is clean. Order and shipping mail that disagrees with a pixel is the Klaviyo + Shopify notifications guide. Customers asking where the order is after those emails already exist is WISMO. Short answers on what $997 buys sit in the merchant FAQ.

08

What not to do.

  • Do not paste a second Meta, Google, or Klaviyo snippet because the first one “isn’t working.” Find the first one. Turn off the duplicate. Then test.
  • Do not treat Viewed Product, Viewed Cart, and Added to Cart as interchangeable. A Viewed Product fire is not add-to-cart.
  • Do not put begin-checkout on the cart page and call it done. Checkout is a different runtime.
  • Do not fire Purchase from a “checkout started” trigger in GTM. That is how unpaid checkouts become conversions.
  • Do not buy another tracking app to sit next to the pixels you already pay for. You will add a third sender.
  • Do not claim a conversion lift, a cheaper CPA, or recovered checkout revenue from cleaning events. This page will not either.

09

When to stay DIY vs pay $997.

Stay DIY if you can spend one afternoon on the audit above: list every pixel and embed, pick one owner per event per destination, turn the extras off, add to cart on a phone, start checkout, pay a $1 order, and confirm one event in Klaviyo, Google, or Meta. That is the whole playbook. No agency required.

Pay for help when the work is not the snippet — it is connecting the stack you already have so checkout follow-up is one workflow, lead capture is not dying in DMs, and exceptions show up in a channel you already check. Tracking that never made it out of a draft pixel is part of that mess. That is the Latch AI Ops install.

What $997 USD one-time buys: lead capture on the live store, ops alerts in a channel you already check, and a checkout-ready workflow. 72 hours after collaborator access, not after payment. One live Shopify store. Access plus a delivery thread. Store URL collected at checkout. Not a SaaS seat, not a Klaviyo rebuild, not a pixel-only retainer, not a Gorgias implementation, not a support VA, not a brand or theme job.

Other shops’ public ranges, not testimonials: a Shopify Flow or app install typically runs $500–$2,500. A Klaviyo-only flow rebuild typically runs $2,000–$5,000.$997 is the cheap end of that work, sold as a 72-hour install of three systems — not as recovered checkout revenue or a conversion lift.

What it does not buy: recovered checkout revenue, a lift in conversion, a cheaper CPA, or a case study. Latch AI Ops has not published customer proof because there are no customers yet. You are buying the install.

Checkout is on Whop. Operator is Nico. United States offer. You can revoke collaborator access after handoff. We do not take owner passwords.