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 counts | Top-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 read | Units 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 read | Per-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 matched | By 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. |
| Currency | Ad 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 / sources | OpenCart sales velocity joined with a separately connected Google Ads account. OpenCart has no native ads channel. |
| Why this matters | Top 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 window | 30D (velocity and spend over a rolling 30 days) |
| Alert trigger | top sellers receiving <10% of ad spend |
| Roles | owner, 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.| SKU | Units sold (30d) | Velocity rank | Ad spend (30d) | Spend share | Flag |
|---|---|---|---|---|---|
| PET-CHEW-XL (durable chew) | 1,420 | 1 | USD 640 | 3.6% | Under-invested |
| PET-BED-M (orthopedic bed) | 980 | 2 | USD 520 | 2.9% | Under-invested |
| PET-BOWL-SS (steel bowl) | 760 | 3 | USD 410 | 2.3% | Under-invested |
| PET-TOY-NEW (new launch) | 90 | 31 | USD 5,800 | 32.2% | Over-invested vs velocity |
| PET-LEASH-R (rope leash) | 540 | 6 | USD 2,100 | 11.7% | Healthy |
| Top 3 sellers combined | 3,160 | USD 1,570 | 8.7% | Below 10% floor |
- 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. - 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.
- 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.
- 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. - 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.
- 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.
- Cap or review the over-invested new launch. Decide deliberately whether PET-TOY-NEW’s 32% is a demand-building bet or a leak.
- 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.
- 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
| Card | Why pair it with Top-Velocity SKUs vs Ad Spend |
|---|---|
| Total Products | The catalogue baseline; velocity ranks a small, high-value slice of it. |
| Low Stock SKUs | Never pour ad spend into a top seller about to go out of stock; check this first. |
| Out of Stock Products | A top-velocity SKU that is OOS should have ads paused, not increased. |
| Products Missing SKU / Model | Unmatched SKUs cannot be joined to ad spend; this makes the card reliable. |
| OpenCart Inventory vs Marketplace Listings | Both 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 thesku 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.
| Reason | Direction 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 |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_ads.spend_by_product | The 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_performance | Top-velocity SKUs should show strong Shopping conversion when funded. | Conversion attribution windows differ from OpenCart’s order dates. |
| Out of Stock Products | A 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. |