Product Performance Decision Framework

A diagnostic process for underperforming Shopping products. Run this before pausing, excluding, or increasing spend on any product. The goal is to identify the root cause and apply the right fix rather than treating every ROAS problem the same way.

The Core Problem

Bad ROAS on a product can mean at least four different things, and each requires a different response:

  1. The product is being shown for the wrong search queries
  2. The listing (title, image, price) is unappealing in the Shopping carousel
  3. The product page or price isn’t converting visitors into buyers
  4. The product genuinely doesn’t sell through Shopping ads

Pausing is only appropriate for #4. For 1-3, pausing discards the signal and leaves the underlying problem unfixed.


Step 1: Is there enough data to judge?

Before diagnosing anything, check whether the sample size is meaningful.

Statistical threshold for zero-conversion products:

At account-level CVR of ~4.3% (or whatever the current CVR is), the number of clicks needed to be 95% confident that a product truly doesn’t convert:

clicks_needed = ceil(ln(0.05) / ln(1 - CVR))

At 4.3% CVR: ~69 clicks needed. At 1.85% CVR (account average including low-performers): ~161 clicks needed.

Use the higher threshold (account CVR including the product’s own category) to be conservative.

Clicks (zero conversions)Verdict
< 30Insufficient data. Do not act.
30-68Approaching threshold. Flag for monitoring, revisit in 30 days.
69+ (at 4.3% CVR)Statistically confident non-converter. Proceed to diagnosis.

For products with some conversions but bad ROAS: Use period-over-period consistency instead. Check the last 30 days vs previous 30 days. If the product only converted in one period, it may be noise. If it converts consistently in both, the ROAS signal is more trustworthy.

Action if insufficient data: Wait. Add the product to a watch list with the date and click count. Revisit after 30 more days of data.


Step 2: Is the traffic relevant?

What you’re checking: Are the search queries triggering this product actually related to what the product is?

How to check:

  • Google Ads UI: Products > select product > Search terms tab. This shows the actual queries.
  • Local data: The google_ads_search_term_daily table links to campaigns and ad groups, not individual products. This only works for campaigns with very few products (e.g. Top Performers with 1-2 SKUs). For the Catch All with 500+ products, you need the Google Ads UI or API product partition report.

What to look for:

  • Product is a Square Industrial Frame but showing for “hairpin legs” — wrong product match
  • Product is a high-end oak table top but showing for “cheap table top” — wrong intent
  • Product is a specific colour variant but showing for the generic product name — acceptable, not a relevance problem

Real example from this account: The Square Industrial Legs (16-box-sq-bl) in the Top Performers campaign was being served for “hairpin legs”, “coffee table legs”, and “desk legs” — generic queries that don’t match the specific industrial design. The product’s 0.93x ROAS was a traffic relevance problem, not a product problem.

Actions if traffic is irrelevant:

CauseFix
Campaign structure forces broad matchingMove product to a better-segmented campaign, or let the Catch All handle it
Missing negative keywordsAdd negatives at campaign or ad group level
Feed lacks product_type / custom_labelsEnrich the Merchant Center feed so Google classifies the product correctly
Google misclassifying the productCheck and fix the Google Product Category in the feed

Step 3: Is the listing the problem? (CTR diagnosis)

What you’re checking: When the product appears in the Shopping carousel for relevant queries, do people click on it?

How to check: Compare the product’s CTR against its category average. Use category groupings from the offer_id prefix or product type.

Current category CTR benchmarks (recalculate monthly):

CategoryOffer ID patternBenchmark CTR
Knife Racksmkr-*1.60%
Square Framesp-bf-sq*1.50%
Shelf Bracketsshelf-*1.60%
Box/Industrial Legs*-box-*, bs-*1.25%
Tapered Oak Legswl-tw*1.15%
Hairpin Tablesdesk-s-*1.00%
J Hooksj-hook-*0.89%

Benchmarks from Feb 4-10 2026. Update these as the account matures.

Diagnosis rules:

Product CTR vs CategoryMeaning
Well below (>30% lower)Listing problem. The title, image, or displayed price is losing in the carousel.
In line (within 20%)Listing is fine. Problem is downstream. Proceed to Step 4.
Above averageListing is strong. The product attracts clicks — it just doesn’t convert. Proceed to Step 4.

Actions if CTR is the problem:

  • Image: Is it high quality? Does it show the product clearly against a clean background? Is it the variant-specific image or a generic product shot?
  • Title: Does it include the key attributes buyers search for? (Size, colour, material, use case.) Google Shopping truncates titles — front-load the important words.
  • Price: Is the displayed price competitive? Check competitor pricing for the same product type. A significantly higher price will suppress CTR regardless of image/title quality.
  • Feed enrichment: Missing brand, product_type, or custom_labels means Google guesses the product’s category. This can result in the product appearing in less relevant Shopping results, reducing CTR.

Step 4: Is the product page or price the problem? (CVR diagnosis)

What you’re checking: People click but don’t buy. Is it the page, the price, or the product?

How to check: Compare CVR across variants of the same product family. If some variants convert and others don’t, the non-converters have a variant-specific problem.

Real example — Square Industrial Frames:

VariantSizePriceClicks (90d)Conversions
sq003120cmGBP 176-22013+0.67
sq021150cmGBP 208-26021+1.00
sq049240cmGBP 208-2601450.00
sq053240cmGBP 236-295580.00
sq055240cmGBP 168-21030+0.00

The 120cm and 150cm sizes convert. The 240cm sizes uniformly don’t, across multiple height options. This is a size/price/demand issue, not a campaign or listing problem. The 240cm frames are likely too niche — people browse them but buy smaller.

Diagnostic questions:

  1. Do other variants of the same product convert? If yes, the problem is variant-specific (size, colour, price point). Don’t exclude the whole product — exclude or reduce bids on the non-converting variants only.

  2. Does the whole product category fail to convert? If no variant in the category converts despite sufficient clicks, this may be a category that doesn’t sell through Shopping ads (proceed to Step 5).

  3. Is the price competitive? Check competitor pricing. A product can have good CTR (people are interested) but zero CVR if the price is significantly above market.

  4. Is the product page adequate? Check for: clear product images from multiple angles, complete size/specification information, stock availability, delivery information, reviews. A product page audit is outside the scope of ads data — this needs manual review.

  5. Is the product in stock? Out-of-stock products can still appear in Shopping if the feed hasn’t updated. Check inventory_quantity in the local database or Shopify admin.

Actions based on CVR diagnosis:

FindingAction
Specific variants don’t convert (e.g. 240cm)Exclude those variants or reduce bids. Keep converting variants.
Price is above marketReview pricing. Consider whether Shopping is the right channel for premium-priced products.
Product page is weakImprove page content, images, reviews. Retest after changes.
Out of stockFix feed sync. Exclude until stock returns.
Colour/finish variant underperformsCheck if the image clearly shows the variant colour. Non-standard colours often have lower demand — reduce bids rather than excluding.

Step 5: Final decision

After running steps 1-4, the product falls into one of these buckets:

Keep running (no action needed)

  • Insufficient data (< threshold clicks)
  • Recently launched variant that needs time
  • Product that converts in some periods but not others (variance, not a structural problem)

Fix and re-test

  • Wrong traffic → add negative keywords, enrich feed, restructure campaign
  • Bad listing → improve title, image, or price display in feed
  • Bad product page → improve page content, check pricing, add reviews
  • Set a calendar reminder to re-evaluate 30 days after the fix

Reduce exposure

  • Variant-specific issue (e.g. 240cm doesn’t convert but 120cm does) → exclude specific variants, keep the rest
  • Low-demand colour/finish → lower bids rather than full exclusion
  • High CPC relative to AOV → reduce max CPC if using manual bidding

Exclude from Shopping

  • 69+ clicks, zero conversions, no fixable cause identified
  • Entire product category fails to convert after sufficient data
  • Product structurally unsuitable for Shopping (e.g. bespoke/custom items that require consultation)

Implementing in the System

When building this into the shopify-app, the diagnostic data needed for each step:

Data already available locally

StepData SourceTable
Step 1: Click thresholdProduct daily performancegoogle_ads_product_raw_daily
Step 1: Period consistencySame table, compare 30-day windowsgoogle_ads_product_raw_daily
Step 3: CTR benchmarksAggregate by category from product dailygoogle_ads_product_raw_daily
Step 4: Variant comparisonProduct daily + Shopify product/variant datagoogle_ads_product_raw_daily + product_variants
Step 4: Stock checkShopify inventoryproduct_variants.inventory_quantity
Step 4: Price dataShopify pricingproduct_variants.price

Data NOT available locally (requires Google Ads UI or API)

StepData NeededWhy it’s missing
Step 2: Product-level search termsWhich queries triggered which specific productgoogle_ads_search_term_daily links to campaigns, not products. The Shopping Products Performance Report with search term segments is needed from the API.
Step 3: Competitor pricingWhat competitors charge for similar productsNot available from Google Ads. Requires manual research or a price monitoring tool.
Step 4: Product page qualityBounce rate, time on page, add-to-cart rateRequires analytics (Fathom or GA4) with product page segmentation.

Data partially available

StepData NeededCurrent state
Step 2: Feed qualitybrand, product_type, custom_labelsAvailable in merchant_center_items_raw but currently 100% NULL. Feed enrichment needed.
Step 2: Feed qualityMC user_id mappingMC data is on user_id=2, Ads data on user_id=3. Cross-referencing blocked until this is fixed.

Suggested automation priority

  1. Automated threshold flagging — daily job that flags products crossing the 69-click zero-conversion threshold. Low effort, high value.
  2. Category CTR/CVR benchmarks — monthly recalculation stored in a reference table. Enables automated comparison.
  3. Variant sibling comparison — when a product is flagged, automatically pull performance of all variants in the same product family. Shows the pattern (e.g. “240cm variants don’t convert”).
  4. Product-level search term sync — add the Shopping Products Performance Report to the Google Ads API sync. This unlocks Step 2 for all products, not just single-product campaigns.
  5. Feed enrichment pipeline — populate brand, product_type, custom_labels in MC. Prerequisite for better Google classification and campaign segmentation.

Appendix: Statistical Reference

Zero-conversion confidence thresholds

Account CVRClicks needed (95% confidence)Clicks needed (99% confidence)
1.0%299459
1.5%199305
2.0%149228
3.0%99152
4.0%74114
4.3%69106
5.0%5990

Formula: ceil(ln(1 - confidence) / ln(1 - CVR))

Period-over-period consistency scoring

A product that converts in both the current and previous 30-day windows is more trustworthy than one that converts in only one. From the Feb 2026 analysis:

  • 72 products showed positive ROAS in the last 30 days
  • Only 15 of those (21%) also converted in the previous 30 days
  • The 15 consistent converters are the reliable signal; the other 57 are likely noise