Blog / Add to Cart but Not Checking Out

Add to Cart but Not Checking Out? Your Ads Aren't the Leak

Poster: Carts fill up, checkouts don't? Schematic of two funnels, one healthy and one leaking between cart and checkout.

If shoppers add to cart but don't reach checkout, the problem is almost always on your site, not in your ads. Ads that bring people all the way to add-to-cart are doing their job. In a three-month review of one Shopify brand, only about 1 in 5 carts reached checkout. A healthy store gets half or more. That one step cost roughly ten times more than every ad problem in the account combined. The fix order: check tracking first, then hold ad delivery (CPM, CTR, spend) against each funnel step, then size both leaks in money before you change anything.

The numbers below come from three Shopify brands that asked Drew, DataDrew's AI ads agent, the same question in September 2026: "Is it my ads or my site?" Figures are rounded. Each got a different answer. The method that found it was the same.

TL;DR

  • The finding: one brand's ads were fine-ish (blended ROAS about 3.4x). Its checkout step was losing about 4 in 5 carts, almost all on mobile.
  • Ads get people to the cart. Your site gets them through checkout. If add-to-cart is healthy and checkout starts are not, stop looking at the ad account.
  • Check tracking before anything else. This account had duplicate purchase events, a payment event that barely fired, and about 10% of sessions with no source.
  • Size both leaks in money. Wasted ad spend was about 2% of Meta spend. The cart-to-checkout gap was worth roughly ten times every ad inefficiency combined.
  • Use the table below to match what moved to where to look.
Healthy funnel vs a funnel leaking at cart to checkout Two rows of three bars: carts, checkouts started, orders. The top row is healthy: the checkout bar is about half the cart bar. The bottom row leaks: the checkout bar is much shorter, and the missing part is shaded orange and labelled the leak. A small grey drip labelled wasted ad spend sits beside the rows to show it is far smaller than the leak. Illustrative only, no store data. Same carts, very different checkouts Schematic · illustrative, not store data Healthy Add to cart Checkout Orders About half or more of carts reach checkout Leaking Add to cart Leak Most carts never reach checkout Wasted ad spend Checkout leak Fix the bigger leak first
Ads can fill the cart and the store can still lose the sale. In a healthy funnel about half or more of carts reach checkout. When far fewer do, the money lost at that one step can dwarf any wasted ad spend. In one brand's review it was roughly ten times larger.

Why do shoppers add to cart but not check out?

Because something between the cart and the checkout page stops them. The ad already did its job: it found someone who wanted the product enough to tap "add to cart".

The usual causes, in the order we see them:

  1. Mobile friction. A cart drawer that won't scroll, a chat bubble over the checkout button, a slow page on a phone.
  2. Cost surprise. Shipping, taxes or a minimum order that shows up only in the cart.
  3. Trust or payment gaps. The payment method they want isn't there, or the checkout looks like a different site.
  4. A third-party checkout. Every extra redirect loses people, and it often breaks your tracking too.
  5. Nothing at all: it's a tracking error. The carts did reach checkout, but the event that records it never fired.

Number 5 is why you check tracking before you touch anything else.

Is it my ads or my website?

Hold your ad delivery metrics against your funnel step rates, in the same window. Whichever side moved is where the problem is.

Ads control who arrives and what it costs: CPM, CTR, spend, and the quality of the click. Your site controls everything after the click: product view to cart, cart to checkout, checkout to order. If CPM and CTR held and a funnel step fell, the ads didn't cause it.

Here is what that looked like across three brands in one month.

Brand one: a checkout leak. A founder asked Drew for a three-month review of paid ads plus the full website funnel. The ads had real problems, but small ones. The funnel had one big one: only about 1 in 5 carts reached checkout, and nearly all traffic was mobile.

Brand two: a payment-step drop that ads were amplifying. Sessions were almost flat day over day. Add-to-cart fell about a fifth. Checkout completion fell by about a quarter. CPM was cheaper and CTR was flat, which rules out creative fatigue and auction cost. Drew's verdict: "Not an ads problem first, a site-conversion problem ads are amplifying." The advice was to change nothing in the ad account and test checkout, payment and discount codes instead.

Brand three: a demand drop. Traffic halved overnight across every channel, including ones with no ad spend, and stayed there. Google spend was flat, but conversion value fell the same day. When organic and direct fall with paid, it isn't the ads and it isn't the checkout. Demand moved.

Three stores asked the same question and got three different answers. The method that found each one was the same.

Check tracking before you diagnose anything

A broken event can fake a funnel leak or hide one. Brand one had three tracking problems. All are common.

  • Duplicate purchase events on Meta. The account had several overlapping purchase events. Optimise to the wrong one and reported revenue can be overstated by up to 5x. Pick one purchase event, confirm it matches Shopify orders, and turn the rest off as optimisation goals.
  • A payment event that barely fires. `add_payment_info` almost never fired, because checkout ran on a third-party page the pixel couldn't see. Any funnel step after the handoff was blind. Fix the integration or stop reading that step.
  • Unassigned sessions. About 10% of GA4 sessions had no source. That traffic still converts, but you can't tell whether ads sent it. Fix UTMs on every link you control.

Example: one order, five purchase events. The numbers are illustrative. A shopper places a $60 order. The browser pixel fires a purchase. The server-side event fires again without a shared event ID, so Meta can't merge the two. A theme app added its own pixel, which fires a third. A post-purchase upsell app fires a fourth. The shopper reloads the thank-you page, and that's five. Meta now shows five purchases worth $300 for one $60 order.

Scale it to a week. 100 real orders worth $6,000 show up in Meta as $30,000. On $5,000 of spend, Meta reports 6x ROAS. Shopify says the whole store took $6,000, so the true return can't be above 1.2x. Every funnel step built on those events is wrong too.

One order, five purchase events A box on the left labelled one real order, 60 dollars. Lines fan out to five event boxes in the middle: browser pixel, server event with no shared ID, theme app pixel, upsell app, thank-you page reload. Lines from all five converge on a box on the right labelled ad platform reports five purchases, 300 dollars. A note under the left box says Shopify counts one order. Illustrative only, no store data. One order, five purchase events Schematic · illustrative, not store data 1 real order $60 Shopify: 1 order Browser pixel Server event, no shared ID Theme app pixel Post-purchase upsell app Thank-you page reload Ad platform sees 5 purchases $300 Match platform purchases to Shopify orders before reading ROAS
One $60 order can show up as five purchases and $300 in the ad platform. Reported ROAS jumps fivefold and nothing real changed. Match platform purchases against Shopify orders before you trust any ROAS or funnel number.

The quick test: compare the orders your analytics shows against actual Shopify orders for the same days. If they disagree by more than a few percent, fix that first. Our daily ROAS root-cause framework makes this Layer 1 for the same reason.

What did the ads side look like?

Mixed, and mostly fixable in an afternoon.

  • Blended ROAS about 3.4x over three months.
  • Google about 8x on under a tenth of spend. Efficient, and probably under-funded.
  • Meta about 90% of spend at about 2.9x. As Meta spend rose about 60% month on month, its ROAS fell from roughly 3.7x to 3.2x. That is a brand pushing past its efficient frontier: each extra dollar buys less. Our guide to marginal ROAS shows how to find where that happens.
  • About 2% of Meta spend on the wrong objective. Engagement and profile-visit campaigns returned zero sales. Those objectives optimise for likes and visits, not purchases. See the objective section of our Facebook ads guide for Shopify.

A blended number hid most of this. One 3.4x figure averaged a strong Google account with a Meta account that was sliding. That's the problem with blended ROAS on its own.

How do you size the ad leak against the checkout leak?

Put both in money. Then fix the bigger one first.

The ad leak has two parts:

  • Spend on campaigns that returned nothing (the wrong objective here).
  • Spend past the efficient frontier: the extra budget whose marginal return sits below your break-even ROAS.

The funnel leak is one sum:

(healthy step rate − your step rate) × carts × checkout completion rate × average order value

Example: the numbers here are made up and rounded to show the arithmetic. They don't come from any of the three brands.

A store gets 100,000 sessions a month. 8,000 add to cart. Only 20% of carts reach checkout, so 1,600 start checkout. 60% of those complete: 960 orders at a $60 average, or $57,600 in revenue. It spends $20,000 a month on ads and runs a 40% gross margin, so its break-even ROAS is 2.5x.

Example store funnel with step rates Four horizontal bars, not to scale: sessions 100,000, add to cart 8,000, checkout started 1,600, orders 960. Step rates sit between the bars: 8% add to cart, 20% reach checkout, 60% complete. The 20% step is orange and marked against a typical rate of about 50% or more. A dashed orange ghost bar next to checkout shows 2,400 missing checkouts. Illustrative numbers only, no store data. Where the example store loses its orders Made-up store · round numbers · bars not to scale Sessions 100,000 ↓ 8% add to cart Add to cart 8,000 ↓ 20% reach checkout Typical: about 50% or more Checkout 1,600 Missing: 2,400 ↓ 60% complete the order Orders 960 At a healthy cart step, the same traffic makes about 2,400 orders
In this made-up store, sessions turn into carts at a normal rate. The break is the next step: 20% of carts reach checkout against a rule of thumb of about half. Fixing that one step would lift orders from 960 to about 2,400 on the same traffic and the same ad spend.

Now size both leaks in profit, so you compare like with like:

Leak The arithmetic Profit lost a month
Wrong-objective campaigns$400 of spend, zero sales$400
Spend past the frontierThe last $3,000 returns 1.5x: $4,500 revenue × 40% margin = $1,800 profit on $3,000 spent$1,200
Ad leak, total$1,600
Cart → checkout, 20% → 30%800 more checkouts × 60% × $60 = $28,800 revenue × 40% margin$11,520

That last row is only a partial fix, 20% to 30%. Even so, it's worth about seven times the whole ad leak. Closing the full gap to 50% adds 2,400 checkouts and $86,400 in revenue. So: kill the $400 campaigns this afternoon, because that takes five minutes. Leave the budget alone. Put the real work into the cart step.

For brand one, Drew's estimate put the checkout leak at roughly ten times the value of every ad inefficiency combined. Cutting the wrong-objective campaigns was still worth doing. It just wasn't the main job.

What should you not do?

Two moves feel right and make it worse.

Don't cut ad spend to "fix" a checkout leak. You lose the carts you were getting, and the leak stays the same size. Brand two's advice was to leave the ad account alone.

Don't scale ads into a leak either. More spend sends more people into the same broken step. Brand one was raising Meta spend fast while about 4 in 5 carts died before checkout. Fix the step, then scale. If you can't tell whether a dip is real yet, use our signal-or-noise rules before touching anything.

Diagnose it in one pass

Run the checks in this order. Each can fake the one after it.

The one-pass ads-or-site diagnosis Three stacked boxes connected by arrows. Box one asks whether analytics orders match Shopify orders; if not, it is a tracking problem. Box two asks whether CPM, CTR or spend changed; if so, it is an ads problem. Box three asks which funnel step moved; if a step fell, it is a site problem, and if sessions fell across every channel, it is a demand problem. Schematic, no data. Ads or site? Check in this order 1. Can you trust the numbers? Analytics orders vs Shopify orders No → tracking fix before anything else yes 2. Did ad delivery change? CPM, CTR, spend, frequency Yes → ads auction, fatigue, budget no 3. Which funnel step moved? Cart, checkout, payment · by device A step fell → site All channels fell → demand
Check tracking first, then ad delivery, then the funnel. A broken event can look like a checkout leak, and a checkout leak can look like falling ROAS. If sessions fell across every channel, including unpaid ones, it's demand, not ads or site.
  1. Trust the numbers. Analytics orders against Shopify orders. One purchase event per platform. Unassigned sessions under control.
  2. Read delivery. CPM, CTR, spend and frequency for the same window. Did any of them move enough to explain the drop?
  3. Walk the funnel. Sessions → add to cart → checkout started → order. Split by device and by channel. Find the first step that changed.
  4. Size both leaks. Wasted and over-frontier ad spend against the step-rate gap in money.
  5. Fix the bigger one. Leave the other alone until the first is done.

Example: one pass, week on week. The store and numbers are made up.

  • Trust the numbers. Analytics shows 600 orders. Shopify shows 605. Close enough, and there's one purchase event on Meta. Move on.
  • Read delivery. CPM rose 5%, from $10.00 to $10.50. CTR held at 1.2%. Spend held at $7,000 a week. Sessions held at about 50,000. A 5% CPM move can't explain orders falling from 1,080 to 600. It's not the ads.
  • Walk the funnel. Add-to-cart held at 8%, so 4,000 carts both weeks. Cart to checkout fell from 45% to 25%. Checkout to order held at 60%. That's the first step that moved, and the only one. Split by device: mobile fell from 45% to 20%, desktop barely moved.
  • Size it. 4,000 carts × 20 points = 800 lost checkouts. × 60% = 480 lost orders. × $60 = $28,800 in one week.
  • Verdict: site, mobile cart. Check what shipped that week: a theme update, a new app, a cart drawer change. Test the cart on a real phone. Don't touch the ad account.
Ads side held, site side broke Two side-by-side panels. The left panel, ads side, lists CPM, CTR, spend and sessions with before and after values, each tagged held in green. The right panel, site side, lists add-to-cart rate and checkout to order tagged held, cart to checkout tagged broke in orange, and orders tagged fell in orange. Illustrative numbers only, no store data. Same week, two sides of the account Made-up store · last week → this week Ads side CPM $10.00 → $10.50 held CTR 1.2% → 1.2% held Spend $7,000 → $7,000 held Sessions 50,000 → 50,000 held Site side Add-to-cart rate 8% → 8% held Cart → checkout 45% → 25% broke Checkout → order 60% → 60% held Orders 1,080 → 600 fell Ads held. One site step broke. The fix is on the site.
Everything the ad account controls held steady. The only rate that broke was cart to checkout, and orders fell with it. When the ads side holds and one site step breaks, fix the site and leave the ads alone.

Ads or site? The decision table

Match what moved to where to look.

What moved What held Likely cause Where to look
Platform ROAS fellShopify orders flatTrackingPurchase events, attribution window, pixel vs orders
CPM roseCTR, conversion rateAuction costSeasonality, competition, audience size
CTR fell, frequency roseCPMCreative fatigueTop ads by spend, refresh the creative
Spend rose, ROAS fellConversion ratePast the efficient frontierMarginal ROAS by campaign, pull back to break-even
Cart → checkout fellCPM, CTR, sessionsCart frictionMobile cart, shipping reveal, chat widgets, cart speed
Checkout → order fellEverything before itPayment or checkout bugTest order on mobile, payment gateway, discount codes
Mobile step rate far below desktopDesktopMobile checkout frictionReal-phone test, session replays
Sessions fell on every channelSpendDemandBranded search, direct, organic, seasonality
Spend on campaigns with zero salesRest of accountWrong objectiveCampaign objective (engagement, traffic, profile visits)

A prompt to run this in one pass

Paste this into Drew or any AI tool that can read your store and ad data:

Give me a founder view of the last 3 months. Paid ads: spend, ROAS and CPA by channel and by month, plus any campaigns with spend and zero purchases. Website: sessions, add to cart, checkout started and orders, split by device and by channel, with each step's conversion rate. Check tracking first: do analytics orders match Shopify orders, are there duplicate purchase events, and what share of sessions is unassigned? Then tell me whether the bigger leak is in the ads or on the site, and estimate each in money.

Brand one's review came back in one reply. It covered channel ROAS, the zero-sales campaigns, the funnel by device and the three tracking bugs. It also put the checkout leak at the top of the list.

FAQ

Sessions are steady but my conversion rate fell. Is it bad traffic or a broken checkout?
Find the first funnel step that changed. If add-to-cart fell, suspect traffic quality or the product page. If carts held but checkout starts or orders fell, suspect the cart, checkout or payment. If only paid traffic converts worse, suspect targeting. If every channel fell at once, suspect the site. Check analytics against Shopify orders before any of it.

What share of carts should reach checkout?
As a rule of thumb, about half or more in a healthy store. If only 1 in 5 carts reaches checkout, the cart step is your biggest leak. Check it on a real phone before anything else.

Why do people add to cart but not check out on mobile?
Usually friction you can't see on desktop: a cart drawer that won't scroll, a chat bubble over the checkout button, shipping costs revealed late, or a slow redirect to a third-party checkout. In the review above, nearly all traffic was mobile, so mobile checkout was the whole story.

Should I cut ad spend if my checkout is leaking?
No. Cutting spend loses the carts you're getting and leaves the leak the same size. Don't scale into it either. Fix the step, then scale.

How do I know if my Meta purchase tracking is double counting?
Compare Meta-reported purchases against Shopify orders for the same days. Then check Events Manager for more than one purchase event. In one account we reviewed, overlapping purchase events meant the wrong one could overstate revenue by up to 5x.

Why did my Shopify sales drop suddenly this week?
Run the checks in order: tracking, then ad delivery, then the funnel, then demand. In one week of September 2026, one brand's drop was a checkout and payment problem. Another brand's traffic halved across every channel overnight, which was a demand problem. The same question had two different answers. More on the daily version in our ROAS root-cause framework and why did my ROAS drop.

DD
John Abhishek Head of Growth @ Datadrew.

Take CONTROL of your Shopify growth today