Revenue minus COGS over revenue. The single best margin-health number for the executive view.
At a glance
(Revenue minus COGS) divided by Revenue. The single best margin-health number for the executive view. Computed off posted Sales Invoices and matched COGS posting from Item Charges + Item Application Entries.
| What it counts | (SUM(Revenue G/L Entry) minus SUM(COGS G/L Entry)) / SUM(Revenue G/L Entry) for the period. Revenue: posting to G/L accounts 4000 to 4999 (standard BC chart). COGS: posting to 5000 to 5099. |
| VAT / tax treatment | Net of VAT on both sides. |
| Shipping | Included on both sides if shipping posts to revenue + shipping cost posts to COGS. Many BC tenants book shipping cost to a separate Operating Expense, in which case shipping is revenue-side only and inflates margin. The field map can normalise this. |
| Discounts | Deducted from revenue at line level. |
| Sales Credit Memos | Deducted from revenue; matching reverse COGS posted on the Item Application Entry. |
| Currency | Multi-Company: each Company’s revenue + COGS translated to Reporting Currency. |
| FIFO/Average impact | The COGS posted on a Sales Invoice depends on the Item’s Costing Method. FIFO depletes oldest layers; Average uses rolling Unit Cost. Margin can swing 1 to 3 percentage points period-over-period purely from FIFO layer turnover even with stable selling prices. |
| Adjust Cost batch dependency | BC’s Adjust Cost - Item Entries batch finalises COGS postings. Pre-batch the COGS may be approximated; post-batch it is exact. Card uses post-batch values. |
| Time window | 30D vsP (rolling) |
| Alert trigger | drop >2pp vsP (a 2-percentage-point drop month-over-month is the structural alarm) |
| Sentiment key | margin |
| Roles | owner, finance |
Calculation
Calculated automatically from your Microsoft Dynamics 365 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 electronics distributor on BC, 30-day window 14 Mar 26 to 12 Apr 26.| Metric | This period (USD) | Prior 30D | vsP |
|---|---|---|---|
| Revenue (Posted Sales Invoices, GL 4000-4999) | $7,420,000 | $7,180,000 | +3.3% |
| COGS (matched, GL 5000-5099) | $5,240,000 | $4,940,000 | +6.1% |
| Gross Margin $ | $2,180,000 | $2,240,000 | -2.7% |
| Gross Margin % (this card) | 29.4% | 31.2% | -1.8pp |
- Margin compressed 1.8pp despite revenue growth. COGS rose 6.1% on revenue that rose only 3.3%. Classic margin erosion: cost-side moved faster than price-side. Just below the 2pp alert threshold.
- Two likely drivers: (a) FIFO layer turnover, the merchant is now selling out of higher-cost inventory layers received in Q4 25 when supplier prices spiked; (b) channel mix shift towards lower-margin marketplace sales. The Margin by SKU breakdown identifies which SKUs concentrate the compression.
- The Adjust Cost batch posted on 31 Mar 26. Pre-batch margin showed 30.1%; post-batch (correct) was 29.4%. The card uses post-batch.
- Power BI’s Finance Performance pack shows 29.4% on the Gross Margin tile for the same Company, matching this card. Multi-Company Power BI requires custom DAX; this card consolidates natively.
- Action: investigate the FIFO layer hypothesis via Margin by SKU drill-down. If a handful of SKUs are responsible, raise prices or substitute lower-cost variants. If margin compression is broad, escalate to procurement for vendor renegotiation.
Sibling cards merchants should reference together
| Card | Why pair it with Gross Margin % |
|---|---|
| Margin Erosion Alerts | The actionable subset: SKUs driving margin down. |
| Total COGS | The numerator’s other half. |
| Margin by SKU | Per-SKU detail; the actionable view. |
| Landed Cost Variance | Procurement-side root cause when COGS is rising. |
| Revenue Booked into GL | The revenue side. |
| Average Landed Cost per Unit | Tracks the cost-side trajectory. |
| Margin Compression Alert | Fires when this card breaches threshold. |
Reconciling against the vendor’s own dashboard
Where to look in Business Central:Reports > Finance > Income Statement (Revenue minus Cost of Goods Sold = Gross Profit) Power BI > Finance Performance content pack > Gross Margin tile Reports > Sales > Sales Statistics (per-customer-margin variant) Item Card > Statistics > Avg. Sales Profit % (per-Item lifetime margin)The Income Statement Gross Profit % matches this card to within rounding. Power BI’s Gross Margin tile uses identical DAX. Why our number may legitimately differ from BC’s reports:
| Reason | Direction | Why |
|---|---|---|
| Adjust Cost batch timing | Small | Pre-batch the COGS is approximated; post-batch exact. Card uses post-batch values. |
| Shipping classification | Either | If shipping is booked to Operating Expenses rather than COGS, BC’s Income Statement shows higher margin than this card (which can be normalised via field map). |
| Sales Credit Memos | None | Both sides handle them identically. |
| Multi-Company aggregation | Card materially smoother | Card consolidates; per-Company BC views can swing wildly on small Companies. |
| Card | Direction | Notes |
|---|---|---|
| shopify.gross_margin_pct | Shopify subset | Shopify-only margin, useful when DTC is a discrete channel. |
| bigcommerce.gross_margin_pct | BC subset | Same. |