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:
- The product is being shown for the wrong search queries
- The listing (title, image, price) is unappealing in the Shopping carousel
- The product page or price isn’t converting visitors into buyers
- 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 |
|---|---|
| < 30 | Insufficient data. Do not act. |
| 30-68 | Approaching 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_dailytable 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:
| Cause | Fix |
|---|---|
| Campaign structure forces broad matching | Move product to a better-segmented campaign, or let the Catch All handle it |
| Missing negative keywords | Add negatives at campaign or ad group level |
| Feed lacks product_type / custom_labels | Enrich the Merchant Center feed so Google classifies the product correctly |
| Google misclassifying the product | Check 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):
| Category | Offer ID pattern | Benchmark CTR |
|---|---|---|
| Knife Racks | mkr-* | 1.60% |
| Square Frames | p-bf-sq* | 1.50% |
| Shelf Brackets | shelf-* | 1.60% |
| Box/Industrial Legs | *-box-*, bs-* | 1.25% |
| Tapered Oak Legs | wl-tw* | 1.15% |
| Hairpin Tables | desk-s-* | 1.00% |
| J Hooks | j-hook-* | 0.89% |
Benchmarks from Feb 4-10 2026. Update these as the account matures.
Diagnosis rules:
| Product CTR vs Category | Meaning |
|---|---|
| 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 average | Listing 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:
| Variant | Size | Price | Clicks (90d) | Conversions |
|---|---|---|---|---|
| sq003 | 120cm | GBP 176-220 | 13+ | 0.67 |
| sq021 | 150cm | GBP 208-260 | 21+ | 1.00 |
| sq049 | 240cm | GBP 208-260 | 145 | 0.00 |
| sq053 | 240cm | GBP 236-295 | 58 | 0.00 |
| sq055 | 240cm | GBP 168-210 | 30+ | 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:
-
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.
-
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).
-
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.
-
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.
-
Is the product in stock? Out-of-stock products can still appear in Shopping if the feed hasn’t updated. Check
inventory_quantityin the local database or Shopify admin.
Actions based on CVR diagnosis:
| Finding | Action |
|---|---|
| Specific variants don’t convert (e.g. 240cm) | Exclude those variants or reduce bids. Keep converting variants. |
| Price is above market | Review pricing. Consider whether Shopping is the right channel for premium-priced products. |
| Product page is weak | Improve page content, images, reviews. Retest after changes. |
| Out of stock | Fix feed sync. Exclude until stock returns. |
| Colour/finish variant underperforms | Check 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
| Step | Data Source | Table |
|---|---|---|
| Step 1: Click threshold | Product daily performance | google_ads_product_raw_daily |
| Step 1: Period consistency | Same table, compare 30-day windows | google_ads_product_raw_daily |
| Step 3: CTR benchmarks | Aggregate by category from product daily | google_ads_product_raw_daily |
| Step 4: Variant comparison | Product daily + Shopify product/variant data | google_ads_product_raw_daily + product_variants |
| Step 4: Stock check | Shopify inventory | product_variants.inventory_quantity |
| Step 4: Price data | Shopify pricing | product_variants.price |
Data NOT available locally (requires Google Ads UI or API)
| Step | Data Needed | Why it’s missing |
|---|---|---|
| Step 2: Product-level search terms | Which queries triggered which specific product | google_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 pricing | What competitors charge for similar products | Not available from Google Ads. Requires manual research or a price monitoring tool. |
| Step 4: Product page quality | Bounce rate, time on page, add-to-cart rate | Requires analytics (Fathom or GA4) with product page segmentation. |
Data partially available
| Step | Data Needed | Current state |
|---|---|---|
| Step 2: Feed quality | brand, product_type, custom_labels | Available in merchant_center_items_raw but currently 100% NULL. Feed enrichment needed. |
| Step 2: Feed quality | MC user_id mapping | MC data is on user_id=2, Ads data on user_id=3. Cross-referencing blocked until this is fixed. |
Suggested automation priority
- Automated threshold flagging — daily job that flags products crossing the 69-click zero-conversion threshold. Low effort, high value.
- Category CTR/CVR benchmarks — monthly recalculation stored in a reference table. Enables automated comparison.
- 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”).
- 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.
- 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 CVR | Clicks needed (95% confidence) | Clicks needed (99% confidence) |
|---|---|---|
| 1.0% | 299 | 459 |
| 1.5% | 199 | 305 |
| 2.0% | 149 | 228 |
| 3.0% | 99 | 152 |
| 4.0% | 74 | 114 |
| 4.3% | 69 | 106 |
| 5.0% | 59 | 90 |
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