How to find wasted Meta ad spend on Shopify: 7 checks, in order

Tag every ad, then put Meta's spend per placement, country, device, hour, product and audience next to Shopify's orders. Spend with no orders is the waste.

Raphael Gonzalez, Founder, Anry
CheckWhere the waste hidesOpen this
1. Tag every adOrders tied to no adAd, Tracking, URL parameters
2. Purchase trackingGood ads Meta under-creditsEvents Manager next to Shopify orders
3. PlacementPlacements whose visitors never buyBreakdown, By delivery, Placement
4. Country, device, hourSlices with visits and no ordersBreakdowns, plus a ShopifyQL query
5. Sold-out productsAds for products you can't sellSessions by landing page, then stock
6. Existing customersProspecting spend on past buyersBreakdown, By demographics, Audience segments
7. Overlap and frequencyStarved ad sets, tired audiencesAudience overlap tool, Frequency column

Wasted Meta spend on a Shopify store is money spent on a slice of delivery (a placement, country, device, hour, product or audience) that bought visits and no orders. You find it by putting Meta's spend for each slice next to Shopify's orders for the same slice, once every ad carries its name into Shopify. (A slice that sells below your break-even ROAS is a different problem.)

What to check, in order

1. Tag every ad so Shopify can count it

Do this first: it only counts clicks from now on. In each ad's URL parameters, add:

utm_source=facebook&utm_medium=paid&utm_content={{ad.name}}&utm_term={{placement}}

Meta fills the values in automatically (Meta). One catch: editing parameters on a live ad "may cause your ad set to re-enter the learning phase", so add them when you next touch the ad anyway.

In Shopify, open Analytics, New exploration (shopify.dev) and run:

FROM sessions
  SHOW sessions, num_orders
  WHERE utm_source = 'facebook' AND human_or_bot_session = 'human'
  GROUP BY utm_content, session_country, session_device_type
  SINCE -30d
  ORDER BY sessions DESC

Swap in utm_term for placement or hour_of_day for the hour (sessions schema). Shopify analytics covers the rest of the reports.

2. Make sure Meta sees your sales

Put Events Manager's purchases next to Shopify's orders from Meta for the same week. If Shopify has orders Meta never saw, a good ad looks like waste, and Meta ads getting clicks but no sales has the fixes.

3. Placements

Select the campaign, then Breakdown, By delivery, Placement (Meta). Put Amount spent per placement next to orders per utm_term. Spend on a placement with visits and no orders is your first number.

For Sales campaigns, Meta is removing placement choice at the ad set level (Relevant Audience, citing Meta, October 2026). The account-wide switch stays. In Advertising settings, Placement controls can exclude Audience Network, Facebook Marketplace and the Facebook right column from every campaign (Meta). Value rules can also lower your bid on select placements by up to 90%, though not with a ROAS goal or bid cap (Meta).

4. Country, device and hour

Break the campaign down by Country, Impression device and Time of day (ad account time zone). Know three things first:

  • Meta splits website conversions by nine breakdowns only, and time of day isn't one (Meta). The hour breakdown shows what you spent each hour, not what sold.
  • Breakdowns may use statistical modeling where conversion data is missing (same page).
  • Since 6 August 2026, Meta says impression device data may be unavailable for some ad accounts until an admin opts in through Ads Manager (Meta developer changelog).

Take spend from Meta and orders from the check 1 query, with both on one time zone. Spend on countries, devices and hours with visits and no orders is the number.

5. Ads still selling sold-out products

Meta says "products that are out of stock don't appear in ads" (Meta), and Shopify's Facebook & Instagram app syncs product changes, usually within minutes (Shopify Help). That covers catalog ads, not a video you built around one product's page. Group the check 1 query by landing_page_path, check stock on each product page, and note each ad's spend since its product sold out.

6. Existing customers inside prospecting

In Advertising settings, Audience segments, pick the custom audiences that are your existing customers (Meta). Then Breakdown, By demographics, Audience segments splits spend into new, engaged and existing (Meta). Existing-customer spend in a prospecting campaign is the number.

To cut it, use the Advantage+ audience control "Exclude these custom audiences". Meta's own example is "to exclude current customers" (Meta). Sales campaigns also offer "Acquire new customers", which Meta says may raise cost per result (Meta).

7. Overlap and frequency

Overlapping ad sets don't bid against each other: Meta enters only your highest-value ad in an auction. The real cost is ad sets that can't spend their budget or leave the learning phase, where "CPA is usually worse" (Meta). Check in Audiences, Actions, Show audience overlap (Meta), and combine similar ad sets.

Frequency is impressions divided by reach, and depends partly on audience size. If results drop as it rises, Meta says the audience may be tired of the ad (Meta). Spend from that point is the number.

Is it the ads or the site?

When two ads send people to the same page and their visitors behave differently, the difference is the ad.

We ran four short video ads for anry.io in one Meta campaign, same audience (US and Australia), from 22 October 2026: two of an agent answering an ads question with a fix and its price, two of a store owner's story with no agent. Figures are from Anry's MCP (get_campaign_spend, list_sessions), 12 to 30 October, in A$. anry.io sells software, so these are visits, not orders.

AdLands onSpendMeta clicksVisits Anry tiedLeft within 5sSpend per 30s+ visitIn Instagram's browser
Agent video, Google ads/google-adsA$415.1313911322%A$9.8824%
Agent video, Meta ads/meta-adsA$408.511339725%A$10.4745%
Store-owner story (1)home pageA$362.7119620740%A$5.5848%
Store-owner story (2)/meta-adsA$228.0212113742%A$5.3060%

The clean pair. The two /meta-ads ads share a campaign, audience and page, and Meta reported them as near-equals: 121 and 133 clicks. After the click, 42% of the story ad's visitors were gone within 5 seconds, against 25% for the agent video. The story ad still bought visits that stayed 30 seconds or more for about half the price: A$5.30 each against A$10.47. So the cheaper ad bought more instant exits and cheaper engaged visitors. You need both numbers per ad to judge it, and the ad platform's report has neither. Neither ad is "the waste". The answer lives after the click, per ad.

Instagram's browser. The two ads with the most visits opened inside Instagram's in-app browser (60% and 48%) also had the most visitors gone within 5 seconds (42% and 40%). The ad with the fewest (24%) had the fewest (22%). That's a pattern across four ads with different pages, not proof. It's why placement is check 3.

Meta's crawler wave. On launch day, 27 visits across the four ads arrived within four minutes from towns with Meta data centers: Prineville, Forest City, Altoona, Gallatin, Clonee, Luleå and Fort Worth. Some ran desktop Chrome, which a phone ad click wouldn't. They stayed 13 to 138 seconds, so they looked engaged. We removed them by hand from the table. Judge an ad's first day only after setting these aside.

Where Anry fits

Anry does this join for Meta and Google Ads. Ask it in Claude, Claude Code or Cursor: "Which of my Meta ads wasted money last month?" It names the countries, devices and hours where an ad brought visitors who engaged worse than comparable visitors and bought nothing. It puts a price on that spend, with sales counted in your store's own orders (one ad per sale), not in the ad platform's count. Then it writes the cut as a paste-ready list naming the one Ads Manager action and its level. You apply it, or Claude Code or Cursor does through Meta's own MCP. Anry itself never changes your ads.

It doesn't cut by audience, interest, age, lookalike, city or weekday, so checks 6 and 7 stay with you. With one campaign and a few ads, check 1's query will do. Other tools are compared in which Meta ads send visitors who don't buy.

Frequently asked questions

How do I find wasted ad spend in Meta Ads Manager?

Break each campaign down by placement, country and impression device, then check those slices against Shopify's orders. Meta can't split website purchases by hour.

How do I stop Meta ads from showing sold-out Shopify products?

Catalog ads drop out-of-stock products on their own, per Meta. Pause hand-built ads for one product when it sells out.

Do overlapping ad sets bid against each other on Meta?

No. Meta enters only your highest-value ad in each auction. Overlap costs delivery and learning-phase time instead.

Sources

See which ad clicks leave your store before they buy.

14-day free trial, no card. Works in Claude, Claude Code and Cursor.

Start free trial