Top-selling SKUs deserve proportional ad spend. Misalignment = under-amplified winners.
At a glance
Whether your fastest-selling WooCommerce SKUs are getting ad spend in proportion to the revenue they drive. The card joins Woo SKU sales velocity against an ads connector (Google Ads, Meta Ads) spend per product and flags top sellers that receive a disproportionately small share of the budget. Under-amplified winners are the highest-confidence growth lever you have: products already proven to convert, starved of reach.
| What it counts | Per top-velocity SKU: revenue_share = sku_revenue / total_sku_revenue versus spend_share = sku_ad_spend / total_ad_spend. A SKU is flagged when its spend share is far below its revenue share (the default flag fires for top sellers receiving <10% of ad spend relative to their revenue weight). |
| Data sources (BOTH required) | WooCommerce side: order line items from GET /wp-json/wc/v3/orders carrying product_id / variation_id / sku, aggregated to per-SKU units and revenue. Ads side: Google Ads shopping_performance_view (spend per product/item id) and/or Meta Marketing API ad-spend by catalogue product. |
| How the join works | By SKU / product id. The Woo SKU is matched to the ad platform’s item id (the value pushed to Google Merchant Center / Meta catalogue, typically the Woo SKU or product id via the Google Listings & Ads / Meta for WooCommerce plugin). A SKU must exist on both sides to be compared. |
| VAT / tax treatment | Woo revenue is tax-inclusive line-item revenue. Ad spend is in ad-account currency, typically pre-tax. The comparison is on shares, so absolute tax treatment does not distort the ratio. |
| Status filter | Velocity from completed + processing orders only. Ad spend from enabled campaigns/ad groups. |
| Refunds | Velocity is gross of refunds; a high-velocity-high-refund SKU is worth investigating before pouring spend in (cross-check refund cards). |
| Currency | Ad spend in ad-account currency, Woo revenue in store currency. The join is by SKU and the comparison is share-vs-share, so it is currency-agnostic; only the displayed spend figure needs FX. |
| Channels / sources | Web-channel ads only. Marketplace ad spend (Amazon Ads) is out of scope for this card; see the Amazon Ads cards for that. |
| Self-hosted vs managed-Woo | Velocity computation is identical on any host. Self-hosted sync lag can briefly understate today’s velocity; the ad side is unaffected by Woo host type. |
| Time window | 30D |
| Alert trigger | top sellers receiving <10% of ad spend (relative to their revenue weight), driven by sentiment_key: wc_xc_top_skus_vs_ad_spend |
| Roles | owner, marketing, finance |
Calculation
Calculated automatically from your WooCommerce data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A US homewares brand on managed-Woo running Google Shopping (via Google Listings & Ads) and Meta Advantage+. 30-day window 14 Mar 26 to 12 Apr 26. Total tracked SKU revenue 61,000. Here are five SKUs.| SKU | 30D revenue | Revenue share | Ad spend | Spend share | Flag |
|---|---|---|---|---|---|
| MUG-MUSH-01 | $52,400 | 11.2% | $1,900 | 3.1% | Under-amplified winner |
| TWL-WAFL-02 | $38,100 | 8.2% | $1,200 | 2.0% | Under-amplified winner |
| LMP-BRASS-04 | $21,600 | 4.6% | $9,400 | 15.4% | Over-spent vs velocity |
| VAS-GLS-03 | $14,900 | 3.2% | $8,800 | 14.4% | Over-spent vs velocity |
| PLT-CERA-07 | $12,300 | 2.6% | $700 | 1.1% | Under-amplified winner |
- MUG-MUSH-01 is the textbook under-amplified winner. It earns 11.2% of revenue on 3.1% of spend, a proven converter starved of budget. Shifting spend toward it is lower-risk than launching new ads, the product has already demonstrated demand. It and the other two flagged rows are why the alert fires.
- LMP-BRASS-04 and VAS-GLS-03 are the mirror image. They absorb 15.4% and 14.4% of spend for 4.6% and 3.2% of revenue. The card surfaces both ends of the misalignment; the budget freed from over-spent SKUs is exactly what funds the under-amplified winners.
- The join is by SKU / item id. Each Woo SKU is matched to its Google / Meta item id through the feed plugin. A SKU with a blank or mismatched id cannot be compared and silently drops out of the analysis, fix Products Missing SKU so the picture is complete.
- Check refunds before reallocating. Velocity here is gross of refunds. If MUG-MUSH-01 had a 25% return rate its true net velocity would be lower, and pouring spend in would amplify the returns too. Cross-reference Top Refunded Products before acting.
Sibling cards merchants should reference together
| Card | Why pair it with this card |
|---|---|
| WC Top Products by Revenue | The revenue ranking this card weighs spend against. Your top sellers are the rows that matter most here. |
| WC Ad Spend on OOS Products | The other ad-waste angle: spend on products that cannot convert. Pair to clean spend at both ends. |
| WC Top Refunded Products | A high-velocity SKU with a high refund rate is a false winner; check before reallocating budget into it. |
| WC Out of Stock Products | Do not amplify a winner that is about to sell out; pair to confirm stock can support the spend. |
| WC Gross Margin | Velocity is not the same as profit. Weigh ad spend by margin, not just revenue, before reallocating. |
| WC Conversion Rate | High velocity plus high conversion is the safest place to add budget. |
Reconciling against WooCommerce
This is a cross-channel card. It requires BOTH connectors. For this card to populate you must have both the WooCommerce connector and an ads connector (Google Ads, Meta / Facebook Ads) connected in the same Vortex IQ workspace. WooCommerce supplies the per-SKU sales velocity; the ads connector supplies the per-product spend. With only one side connected the card cannot run the join and renders empty. How the two sides are joined:| Join key | WooCommerce side | Ads side |
|---|---|---|
| SKU / item id | sku on order line items / product | Item id in Google Merchant Center / Meta catalogue (usually the Woo SKU or product id pushed by the feed plugin) |
| Revenue | line-item revenue from completed + processing orders | not used (Woo is source of truth for revenue) |
| Spend | not present on Woo | spend per product from the ad platform |
- WooCommerce velocity: WP Admin → WooCommerce → Reports → Orders → Sales by product, or the Analytics → Products report for per-SKU revenue and units.
- Ad spend per product: Google Ads → Reports → Shopping → Item id (spend column); Meta Ads Manager → breakdown by product / catalogue.
- Feed mapping: WP Admin → the Google Listings & Ads or Meta for WooCommerce plugin shows how Woo SKUs map to item ids.
| Reason | Effect |
|---|---|
| One connector not connected. Only Woo or only the ads connector connected. | Card empty |
| SKU / item-id mismatch. Woo SKU differs from the feed item id, or the SKU is blank. | SKU drops out of the comparison (under-reports) |
| Attribution model. Ad platforms attribute revenue differently (last-click, data-driven). This card uses Woo velocity as the revenue truth, not the ad platform’s attributed revenue. | Per-SKU revenue differs from the ad console’s |
| Currency / FX. Spend in ad-account currency, revenue in store currency. Shares are currency-agnostic; the displayed spend uses end-of-day FX. | Display only |
| Refund timing. Velocity is gross of refunds; a refund landing in-window does not reduce velocity here. | Velocity can overstate net demand |
| Timezone. Woo on WP-site timezone, ads on account timezone, Vortex IQ on UTC. Boundary orders/spend shift a day. | Boundary effects |
| Sync lag. Self-hosted Woo can briefly understate recent velocity. | Brief, self-resolving |