Skip to main content
Card class: Cross-ChannelCategory: Ecommerce Platform
Your best-selling OpenCart SKUs that are getting little or no ad spend behind them. Proven demand you are under-funding, the cheapest growth lever most stores leave on the table.

At a glance

A cross-connector view that joins your top-velocity OpenCart SKUs (the products selling fastest by units) with connected Google Ads spend per product. It flags proven winners that are receiving little or no ad investment. The logic is simple: a SKU already selling fast organically is the safest place to add ad spend, because demand is demonstrated. Under-investing in your top sellers while spending on unproven products is the most common, most fixable ad-efficiency leak. OpenCart has no native ads integration, so this card only populates when a Google Ads connector is linked, and spend is matched to SKUs by product identifier.
What it countsTop-velocity OpenCart SKUs (by units sold over the window) alongside the Google Ads spend attributed to each, flagging those receiving a disproportionately small share of spend.
How velocity is readUnits sold per SKU over the window, aggregated from oc_order_product lines joined to oc_product. Velocity is units, not revenue, so a fast-moving low-price SKU still ranks.
How ad spend is readPer-product spend from the connected Google Ads account (Shopping / Performance Max product targeting). OpenCart cannot see this; it comes from the Google Ads connector.
How SKUs are matchedBy SKU or model. OpenCart stores sku and model on oc_product; Google Ads uses the product feed item ID. Products missing a SKU or model cannot be matched, see Products Missing SKU / Model.
CurrencyAd spend is in the ad account currency; SKU velocity is unit-based and currency-agnostic. For multi-currency stores the spend column is directional.
Channels / sourcesOpenCart sales velocity joined with a separately connected Google Ads account. OpenCart has no native ads channel.
Why this mattersTop sellers under-funded in ads is wasted growth: you are spending on unproven products while starving proven ones. Reallocating spend toward demonstrated demand is the highest-confidence ad optimisation available.
Time window30D (velocity and spend over a rolling 30 days)
Alert triggertop sellers receiving <10% of ad spend
Rolesowner, marketing, finance

Calculation

Calculated automatically from your OpenCart data joined with the connected channel. 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 pet-supplies merchant on OpenCart 3.x with Google Ads connected and running Shopping campaigns. The 30-day window covers 14 Mar 26 to 12 Apr 26. Total ad spend in the window is USD 18,000.
SKUUnits sold (30d)Velocity rankAd spend (30d)Spend shareFlag
PET-CHEW-XL (durable chew)1,4201USD 6403.6%Under-invested
PET-BED-M (orthopedic bed)9802USD 5202.9%Under-invested
PET-BOWL-SS (steel bowl)7603USD 4102.3%Under-invested
PET-TOY-NEW (new launch)9031USD 5,80032.2%Over-invested vs velocity
PET-LEASH-R (rope leash)5406USD 2,10011.7%Healthy
Top 3 sellers combined3,160USD 1,5708.7%Below 10% floor
What’s interesting here:
  1. The three best sellers share under 9% of spend, and that trips the alert. With the top sellers receiving 8.7% of ad budget against the <10% floor, the card is firing. These SKUs are selling fastest with almost no ad support, which means there is proven demand the merchant is funding from organic alone.
  2. A new launch is eating a third of the budget on 90 units. PET-TOY-NEW takes 32% of spend for velocity rank 31. New products sometimes deserve investment to build demand, but a 32% allocation to an unproven SKU while the top sellers starve is exactly the imbalance this card exists to surface.
  3. Velocity is units, not revenue, by design. PET-BOWL-SS is a cheap, fast-moving SKU. Ranking on units rather than revenue keeps high-turnover staples visible; a revenue-ranked view would bury them under a few expensive items. The point is to back demonstrated demand wherever it lives.
  4. OpenCart cannot produce this alone. OpenCart knows the unit velocity (from oc_order_product), but it has no idea what each SKU costs in ads. The spend half comes entirely from the connected Google Ads account. Without it, the card cannot compute a share.
  5. The fix is reallocation, not more budget. The merchant does not need to spend more overall. Shifting even a few thousand dollars from PET-TOY-NEW toward the proven top three would likely lift total return immediately, because the demand is already there.
Action priority order:
  1. Raise bids or budget on the top-velocity SKUs that are under the 10% floor. Proven demand is the lowest-risk place to add spend.
  2. Cap or review the over-invested new launch. Decide deliberately whether PET-TOY-NEW’s 32% is a demand-building bet or a leak.
  3. Resolve any unmatched top sellers by adding SKU or model values so the Google Ads feed can match them, otherwise a top seller can be invisible to this card.
  4. Re-check after a week. Reallocation effects show quickly on fast-moving SKUs; confirm the share moved and the return held.

Sibling cards merchants should reference together

CardWhy pair it with Top-Velocity SKUs vs Ad Spend
Total ProductsThe catalogue baseline; velocity ranks a small, high-value slice of it.
Low Stock SKUsNever pour ad spend into a top seller about to go out of stock; check this first.
Out of Stock ProductsA top-velocity SKU that is OOS should have ads paused, not increased.
Products Missing SKU / ModelUnmatched SKUs cannot be joined to ad spend; this makes the card reliable.
OpenCart Inventory vs Marketplace ListingsBoth join OpenCart catalogue data to an external channel; read together for full channel health.
Total Revenue (30d)Reallocating spend to proven SKUs should show up here as efficient revenue growth.

Reconciling against OpenCart

Where to look in OpenCart admin: OpenCart gives you the velocity half but not the spend half. Reports → Products → Products Purchased ranks SKUs by units and revenue over a date range, which is the velocity input. Catalog → Products holds the sku and model used to match against the ad feed. The underlying data is the quantity column on oc_order_product joined to oc_product. Ad spend lives entirely in the connected Google Ads account, OpenCart has no native ads integration, so the spend half is supplied by the Google Ads connector. Other OpenCart views that look relevant but cannot answer this:
  • Reports → Products → Products Purchased: ranks by units and revenue but has no ad-spend column.
  • Reports → Products → Products Viewed: views, not sales velocity, and no spend.
  • The Dashboard best-sellers widget: a quick velocity snapshot with no cost context.
Why our number may legitimately differ from a manual cross-check:
ReasonDirection of divergence
Velocity definition. This card ranks by units; a revenue-ranked manual cut reorders the list and changes which SKUs are “top”.Either direction
SKU matching. Products missing a SKU or model cannot be matched to the ad feed and are reported as unmatched rather than scored.Top sellers can be invisible
Spend attribution. Google Ads attributes spend per product target; Performance Max and broad campaigns may spread spend in ways that are hard to allocate cleanly to one SKU.Spend share is approximate for blended campaigns
Currency. Ad spend is in the ad account currency; multi-currency velocity is unit-based.Spend column directional for international stores
Sync cadence. Spend reflects the last Google Ads poll; recent spend may lag.Self-resolves at next sync
Cross-connector reconciliation (OpenCart velocity joined with a connected Google Ads account):
CardExpected relationshipWhat causes legitimate divergence
google_ads.spend_by_productThe spend half of this card; per-product spend should match.Performance Max and non-Shopping campaigns are harder to attribute per SKU, so blended spend may not map cleanly.
google_ads.shopping_performanceTop-velocity SKUs should show strong Shopping conversion when funded.Conversion attribution windows differ from OpenCart’s order dates.
Out of Stock ProductsA top-velocity SKU that is OOS should not be receiving spend; cross-check before reallocating.OOS handling and ad pause timing can lag each other.

Known limitations / merchant FAQs

Why is this card empty? Because no Google Ads connector is linked. OpenCart has no native ads integration, so the spend half of the join comes from a connected Google Ads account. Without it, there is no spend to compare your top sellers against. Why rank by units instead of revenue? Ranking by units keeps high-turnover, lower-price staples visible. A revenue-ranked view buries fast-moving cheap SKUs under a handful of expensive items, hiding exactly the proven demand this card is meant to surface. The detail view shows revenue too, so you have both. Should I always increase spend on flagged SKUs? Almost always, with two checks first: confirm the SKU is in stock (never fund a top seller about to go OOS) and confirm margin supports the extra spend. Proven demand is the lowest-risk place to invest, but not if you cannot fulfil it or it loses money. A new product is taking most of my budget, is that wrong? Not necessarily. New launches sometimes deserve investment to build demand. The card flags the imbalance so you can decide deliberately, rather than starving proven sellers by accident. Intentional demand-building is fine; accidental misallocation is not. Why are some top sellers missing from the card? Most often because they cannot be matched. A product without a SKU or model on OpenCart cannot be joined to the Google Ads feed, so it is reported as unmatched. Fix Products Missing SKU / Model so every top seller is visible. My spend share does not add up cleanly per SKU, why? Performance Max and broad campaigns spread spend in ways that are hard to attribute to a single product. For pure Shopping campaigns the per-SKU mapping is clean; for blended campaigns the spend share is an approximation. Why a 30-day window? It is long enough to establish stable velocity and smooth out daily spend swings, and it matches the revenue cards so you can read efficiency and revenue on the same window. A shorter window makes both velocity and spend share too noisy to act on.

Tracked live in Vortex IQ Nerve Centre

Top-Velocity SKUs vs Ad Spend is one of hundreds of KPI pulses Vortex IQ tracks across OpenCart and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.