Revenue minus COGS over revenue. The single best margin-health number for the executive view.
At a glance
(Revenue minus COGS) ÷ Revenue for the period. The single best margin-health number for the executive view; the boardroom margin metric.
| What it counts | (Revenue Booked into GL minus COGS Total) ÷ Revenue Booked into GL × 100. Both numerator components are pulled from the GL on the same window. |
| Tax treatment | Net of tax in numerator; same in denominator. The ratio is unaffected. |
| Shipping | Included if mapped to revenue and COGS-shipping if mapped to COGS account. |
| Discounts | Already deducted in revenue. |
| Refunds / Credit Memos | Reduce revenue; refund-side COGS reverses. Net effect on margin is small. |
| Currency | Reporting currency. Ratio currency-neutral. |
| Subsidiary scope | Respects dashboard filter. |
| Time window | 30D vsP |
| Alert trigger | drop >2pp vsP, sentiment margin |
| Roles | owner, finance |
Calculation
Calculated automatically from your NetSuite 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 wholesale apparel distributor on NetSuite OneWorld. Three subsidiaries: a US parent (USD), a UK distribution sub (GBP), and a Canadian sub (CAD). Annual revenue ~$80M. 30-day window 14 Mar 26 to 12 Apr 26. Reporting currency USD.| This period | Prior period | vsP | |
|---|---|---|---|
| Revenue Booked into GL | $6,560,000 | $6,890,000 | -4.8% |
| COGS Total | $4,260,000 | $4,330,000 | -1.6% |
| Gross Profit | $2,300,000 | $2,560,000 | -10.2% |
| Gross Margin % | 35.1% | 37.2% | -2.1pp |
- 35.1% gross margin is below industry-typical wholesale apparel (38-42%) and the 2.1pp drop trips the alert exactly. Sentiment fires. The Controller’s 9am Monday read is “we lost two points in 30 days”. Two points on a 138K of period gross profit gone, $1.66M annualised. That is the difference between hitting the EBITDA target and missing by a meaningful margin. The Controller has roughly 14 days before the board pack drafts to either explain the move or claw it back.
- Revenue dropped 4.8% but COGS dropped only 1.6%. That asymmetry is the diagnostic signal. If revenue and COGS had moved in lockstep the margin percentage would be flat. The fact that COGS held while revenue softened means the mix is shifting toward lower-margin SKUs (probably promotional or clearance), or that input cost is rising even as volume falls. Pair with Margin by SKU and Landed Cost Variance. On this account the breakdown showed 60% mix shift (clearance polos selling instead of full-price tees), 30% rising cotton input cost, 10% freight surcharge from a port disruption.
- The 2pp drop is worth 1.66M annualised, and that is the size of one mid-level finance hire times five. This is why margin is the boardroom conversation, not revenue. The CEO can grow revenue by giving away margin on promotions; the Controller’s job is to keep that trade visible. The card surfaces the trade; Margin Erosion Alerts names the specific SKUs that absorbed the loss, so the Controller walks into the merchandising review armed with a SKU-level worklist instead of an aggregate complaint.
- A second OneWorld subsidiary cut tells a different story. The UK distribution sub ran 41.2% margin (up 0.8pp vsP) on £1,180,000 revenue translated at the period-average rate of 1,420,000 revenue translated at $0.74. The consolidated 35.1% hides the fact that Canada is bleeding margin while the UK is healthy. On the per-subsidiary view this card decomposes the consolidated number; the Controller now knows to fly to Toronto, not London. The aggregate alone would have masked the geography.
- Diagnose with Landed Cost Avg and Landed Cost Variance. Rising input cost is the biggest single driver of margin compression in mid-market commerce, and NetSuite’s Item Cost Detail is where it shows up first. On this account, average landed cost on the top 50 SKUs rose 3.7% over 90 days, driven by a freight surcharge on China-origin lines plus a cotton-index tick. The card connects the dots: revenue softer, cost firm, margin -2.1pp, root cause = freight + commodities. The Controller now has the CFO conversation in 90 seconds instead of 90 minutes.
Sibling cards merchants should reference together
| Card | Why pair it with Gross Margin % |
|---|---|
| COGS Total | The numerator subtraction. |
| Revenue Booked into GL | The denominator. |
| Margin by SKU | Which SKUs are eating margin. |
| Margin Erosion Alerts | Trend alerts on this metric. |
| Landed Cost Avg | Upstream cost driver. |
| Landed Cost Variance | Variance against standard. |
Reconciling against the vendor’s own dashboard
Where to look in NetSuite: The native NetSuite views worth running side by side with this card:Reports → Financial → Income Statement (Gross Profit / Total Income line, period view) Reports → Sales → Sales by Item with Margin (per-SKU contribution view) Reports → Inventory / Items → Inventory Profitability (item-level margin trend) Reports → Financial → Income Statement Detail (drilled to the GL line, useful when COGS account mapping is suspect) Saved search:The Income Statement Gross Profit line should match this card to within rounding when you select the same period and the same subsidiary scope. The Sales by Item with Margin report is the per-SKU drill-down; running it filtered to the bottom 20 SKUs by margin is usually the fastest way to find the dollars that moved. For OneWorld accounts also run Reports → Financial → Consolidated Income Statement at the same scope as the dashboard filter, otherwise FX translation differences distort the comparison. Common mistakes when reconciling:Transaction.Type IN ('CustInvc','CashSale','CustCred')aggregated byItem.IncomeAccountandItem.COGSAccountfor the same window
- Sales by Item with Margin uses the Item record’s
AverageCostas the cost basis by default, not standard cost or landed cost. If your account uses Standard Costing the card and this report can disagree by a few percentage points until you align the cost method. - Per-subsidiary Income Statement does not eliminate intercompany revenue and intercompany COGS, so margin can look artificially high or low at sub level vs the consolidated card.
- Sales Order Register with Margin is a forward-looking SO view, not booked GL revenue. Use it for pipeline analysis, not reconciliation.
| Reason | Direction | Why |
|---|---|---|
| GL account mapping | Either | If your account chart maps revenue or COGS to non-standard accounts (e.g. shipping booked to Other Income, freight-in to a non-COGS expense account), the card may miss them. Verify the field map under docs/vortex-mind/cards/_field_maps/netsuite.json. |
| Carrying cost inclusion | Card excludes | Some accounts include warehousing or insurance in COGS for internal reporting. Card uses GAAP / IFRS convention (carrying cost is period expense, not product cost). |
| Standard vs average cost | Either | NetSuite supports Average, Standard, FIFO, LIFO, and Group Average costing. Card uses whatever Item Cost Method is set on the Item record. If you toggle costing methods mid-period, the card recomputes from the new basis and the historical period needs a one-time backfill. |
| Landed cost capitalisation | Card lower for importers | NetSuite’s Landed Cost feature capitalises freight, duty, and broker fees into Item Cost. If your account does not use Landed Cost, those costs sit on the Income Statement as separate freight expense lines and are excluded from this card’s COGS, inflating the reported margin. |
| FX cadence | Small | Both numerator and denominator at transaction-date FX. Differences against period-average reports are usually under 0.3pp unless a major FX shock occurred. |
| Subsidiary scope | Either | Card defaults to all subs. If a Controller runs the Income Statement at a single sub level, intercompany lines and FX translation differ. |
| ASC 606 deferred revenue | Card lower | If Advanced Revenue Management is on, deferred revenue is excluded from numerator. The Income Statement Gross Profit line is post-ARM, so they should match; if you compare against a pre-ARM saved search the card will read lower. |
| Credit Memo timing | Either | A Credit Memo posted on the period boundary subtracts from the period it posts, not the period of the original Invoice. Card and Income Statement apply the same convention; manual SKU-level reconciliations sometimes miss the pair. |
| Marketplace fees | Either | Amazon, eBay, Walmart marketplace fees are sometimes booked to a separate expense line rather than netted into revenue or booked to COGS. The card’s COGS only includes accounts mapped to Cost of Goods; marketplace fees usually sit in OpEx. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
| shopify.gross_margin | Shopify margin > NetSuite margin | Shopify’s gross margin uses the cost field on Variant, which is rarely landed and almost never updated as freight surcharges hit. NetSuite COGS reflects the full landed cost on the Item record. The Shopify number is the merchandiser’s view; the NetSuite number is what the auditor signs. |
| bigcommerce.gross_margin | BC margin > NetSuite margin | Same dynamic. BC stores variant-level cost without freight or duty allocation. |
| adobe_commerce.gross_margin | Adobe margin > NetSuite margin | Adobe Commerce supports a cost attribute but most installations do not maintain it actively. Comparing the two exposes whether merchandising operations are updating cost data. |
| google_ads.cost + facebook_ads.spend | Indirect | Ad spend is OpEx, not COGS, so it does not move this card. But if margin is compressing while ad spend is rising, the contribution margin (margin minus ad spend per SKU) is collapsing even faster. The contribution margin cross-channel card joins these explicitly. |
| stripe.fees + paypal.fees | Indirect | Payment processing fees (2.5-3% of GMV) are not in COGS by default but eat real margin. Some Controllers reclassify them into COGS for true product margin; if you do, expect this card to read 1.5-2.5pp lower. |
Known limitations / merchant FAQs
Healthy gross margin by industry? DTC apparel: 50-70%. Wholesale apparel: 35-45%. Electronics retail: 20-30%. Wholesale electronics: 15-25%. Health and beauty DTC: 60-75%. Food and beverage DTC: 30-45%. Industrial distribution: 18-28%. Software and SaaS: 70-85%. Always compare to your own historical baseline first; industry benchmarks are useful for board context but the trend versus your own 12-month rolling average is the operationally meaningful number. A business that drops from 41% to 38% (its own baseline) needs the same urgency as one that drops below an industry benchmark, even if the absolute number still looks “fine”. Why is gross margin compressing? Five usual root causes, in order of frequency in mid-market commerce: (1) input cost rising (commodity, freight, FX on imports), (2) discount-heavy promotional period (planned but unmonitored), (3) mix shift toward lower-margin SKUs (often unintended, driven by promotional pull), (4) freight cost spike (port congestion, fuel surcharge), (5) FX shift on imports for non-US-based sourcing. The cross-channel diagnostic is to overlay Landed Cost Avg, Margin by SKU, and the channel-level promotion calendar; one of those three usually carries the explanation. ASC 606 deferral, does it bias the card? No, with caveat. Both revenue and COGS are recognised under the same convention so the ratio is unbiased. ARM-deferred revenue stays out of the numerator; ARM-deferred cost (rare, but exists for bundled service contracts) stays out of the COGS line. Where this matters is for subscription-adjacent commerce: a brand selling annual replenishment subscriptions under ARM will see this card read against recognised revenue only, while a non-ARM brand books the full prepayment up-front. Compare cards across two brands only if both are on the same recognition policy. Multi-currency, FX impact? Both components are in reporting currency, so the ratio is currency-neutral. FX moves the absolute revenue and absolute COGS roughly in proportion. The exception is when revenue and COGS sit in different currencies. A US brand selling into the UK in GBP but sourcing from China in USD has a margin that is exposed to GBP-USD: a weaker GBP shrinks revenue translated to USD while COGS stays flat, compressing margin. The Revenue by Currency card surfaces this; for hedged businesses the FX overlay flattens to near-zero. Carrying cost, why excluded from COGS? Carrying cost is OpEx (period cost), not COGS (product cost), under GAAP and IFRS. It hits warehouse rent, depreciation, insurance, and finance lines on the Income Statement, not Cost of Goods Sold. The card respects this convention so the boardroom number matches the audited Income Statement. For full economic margin including the cost of holding inventory, look at Inventory Carrying Cost; for a “true contribution” view also subtract advertising spend per channel. Single-subsidiary vs OneWorld behaviour? Identical formula. OneWorld scopes across subsidiaries and applies elimination logic when the consolidated subsidiary is selected. The Controller running a OneWorld account should always check the per-subsidiary cut before the consolidated cut, because consolidated margin can hide a single sub bleeding margin while others compensate. The most common mid-market pattern is one healthy DTC sub subsidising one B2B sub running thin contracted margins. B2B vs DTC, do I read this card differently? Yes. DTC margin moves on retail price (promotions, sale events, full-price sell-through). B2B margin moves on contract pricing tiers and rebates. A 2pp DTC margin drop usually means a promotion cycle; a 2pp B2B margin drop usually means a contracted account renewed at worse pricing or volume rebates kicked in. The action lists are different. Use the Margin by Channel cut to separate them on a hybrid business; on a pure-DTC or pure-B2B business this card alone is sufficient. OneWorld multi-subsidiary, eliminations and intercompany margins? On OneWorld, intercompany sales (one sub selling product to another sub for re-sale) post revenue at the originating sub at the inter-co transfer price. The consuming sub books that as inventory cost. At consolidation, NetSuite eliminates both sides, so the consolidated card shows only the third-party economic margin. If the user pivots to a single sub, the inter-co revenue and inter-co COGS reappear and margin can swing significantly (especially for a captive distribution sub that buys from a manufacturing sub at low transfer prices and resells at full retail). Always confirm the subsidiary scope before reading the number. ASC 606 vs IFRS 15 differences on this card? Negligible for product-only businesses; both standards recognise revenue at performance obligation satisfaction (typically fulfilment for goods). Differences appear for bundled product-plus-service offerings where ASC 606 and IFRS 15 sometimes split the performance obligations differently. For a typical mid-market commerce business shipping physical product, the card behaves identically under either standard. FX revaluation timing, does it move this card? Slightly. NetSuite’s monthly FX revaluation revalues open Balance Sheet items (AR, AP, inventory at remote subs); revenue and COGS are recognised at transaction-date rates and do not revalue. So a period-end FX revaluation does not change this card directly. What it does change is the comparison against an Income Statement run with period-average translation: small period-average vs transaction-date residuals show as a fraction of a percentage point margin difference. For OneWorld accounts running quarterly board packs, the standard practice is to lock the FX cadence at period-average for both internal cards and external reports to avoid the discussion. Per-product vs aggregate, which is more useful? Both, in sequence. Aggregate (this card) is the boardroom and CFO conversation. Per-SKU (Margin by SKU) is the merchandising and operations action. The flow on a Monday morning is: this card shows -2pp, Margin Erosion Alerts names the 8 SKUs responsible for 80% of the dollar loss, Landed Cost Avg confirms whether the cause is upstream cost or downstream pricing, the merchandising VP gets a worklist by lunchtime. NetSuite vs Oracle ERP Cloud / SAP S/4HANA on this metric? NetSuite’s strength on this card is the single-instance General Ledger and inline costing. The same Item record carries the cost method, the price, and the GL account mapping; SuiteAnalytics queries the same tables that the GL uses, so reconciliation is automatic. Oracle ERP Cloud and SAP S/4HANA support deeper costing variants (multiple costing books, parallel valuation, group vs legal vs management views) at the cost of more configuration. For mid-market commerce (250M+ or manufacturing-heavy businesses with complex cost variants, Oracle and SAP earn their additional setup. Vortex IQ supports both NetSuite and Oracle ERP Cloud connectors; the card definition is identical, the field maps differ. Does Advanced Inventory Management (AIM) change the card? AIM unlocks demand planning and replenishment features but does not change the cost basis. The card reads the sameItem.AverageCost (or Standard / FIFO / LIFO depending on costing method). What AIM changes is the upstream signal: better demand planning means lower obsolescence, fewer rush-freight surcharges, less margin compression. The card is the outcome view; AIM is one of the levers.