Revenue minus COGS over revenue. The single best margin-health number for the executive view.
At a glance
Revenue minus COGS over revenue, computed from Sage Intacct’s General Ledger across the period. The single best margin-health number for the executive view, sliceable by every Intacct dimension (Department, Location, Project, Item, Class, Customer, Vendor) so the same percentage can be cut by team, business unit, or project without re-querying. The boardroom number; the operating decision lives in dimensional drill-downs.
| What it counts | (SUM(GLDETAIL.AMOUNT for revenue accounts) - SUM(GLDETAIL.AMOUNT for COGS accounts)) / SUM(GLDETAIL.AMOUNT for revenue accounts), both sides posted (STATE = 'Posted'), filtered to the configured period, expressed as a percentage. Sage Intacct’s standard Chart of Accounts uses 4000-4999 for revenue and 5000-5999 for COGS; the field map respects whatever ranges the merchant’s Implementation Partner configured. |
| Tax treatment | Net of tax on both sides. Sage Intacct books tax to a separate liability account (typically 2200 Sales Tax Payable or country-specific equivalents), so revenue and COGS on this card are exclusive of US sales tax, VAT, GST, and any non-recoverable consumption tax. |
| Shipping | Included on both sides if the Chart maps shipping income to a revenue account (typically 4900 Shipping Revenue) and freight-out costs to a COGS account. If shipping is offset to OpEx accounts, neither side counts. |
| Discounts | Already deducted at line level. Intacct’s Order Entry applies trade and term discounts before the revenue line posts; the card uses post-discount revenue. |
| Refunds and Credit Memos | Deducted on the revenue side (Credit Memos post a debit against revenue). COGS adjusts via the Inventory Adjustment that accompanies the return, so the percentage stays comparable. |
| Cancelled / voided orders | Excluded by definition. Voided Invoices reverse their journal lines; the GL net is zero. |
| Currency | Multi-Entity Console: each entity’s revenue and COGS in base currency, summed at reporting FX per the Currency Configuration. The percentage is dimensionally consistent so FX moves the dollar value but rarely the ratio (unless revenue and COGS are in different currencies on the same SKU). |
| Entity scope | Card respects the dashboard entity filter. Default rolls across every entity the API user can see. |
| Dimensional cut | Headline percentage; click any chip to cut: Department margin, Location margin, Project margin, Class margin (brand or business unit), Customer margin (per-account profitability), Vendor margin (per-supplier sourcing efficiency). The Project dimension is uniquely powerful for services-heavy and project-based commerce. |
| Revenue recognition (ASC 606) | If the account uses Intacct Contracts and Revenue Management, deferred revenue is excluded from this number; only recognised revenue counts. Without Contracts, revenue is booked at invoice posting. |
| Time window | 30D vsP (default 30D vs prior 30D) |
| Alert trigger | drop >2pp vsP, sentiment margin. Tunable per workspace. |
| Roles | owner, finance |
Calculation
Calculated automatically from your Sage 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 digital agency on Sage Intacct (single entity, USD), running a project-based services business with annual revenue ~$24M. Period is 30D ending 12 Apr 26 vs the prior 30D ending 13 Mar 26. The Project dimension is populated on every revenue and COGS line; Department splits Strategy / Creative / Engineering / Media practices.| Period | Revenue (USD) | COGS (USD) | Gross Margin % |
|---|---|---|---|
| Prior 30D (14 Feb 26 to 13 Mar 26) | $1,940,000 | $1,028,200 | 47.0% |
| This 30D (14 Mar 26 to 12 Apr 26) | $2,180,000 | $1,283,820 | 41.1% |
| Delta | +$240K | +$255K | -5.9pp |
margin and the Controller drills the dimensional cut.
Five things to notice:
- The Project dimension cut surfaces the cause in one click. Pivot the same percentage by Project: 41.1% consolidated decomposes into the Project-level margins. Three projects took the full hit:
PRJ-VEGA-2026(a fixed-fee implementation with 38% margin this period vs 52% last period),PRJ-LUNA-2026(35% vs 49%), andPRJ-NOVA-2026(29% vs 44%). The other 47 active projects held margin within 1pp of last period. Three projects are dragging the consolidated margin by 5.9pp on their own. This is exactly the conversation Sage Intacct’s dimensional model is designed to support; on NetSuite the same drill is possible via Class plus saved searches but takes 2 to 3x longer to surface. The Implementation Partner’s monthly board pack typically includes the Project margin column, so this card mirrors the conversation the merchant already has. - Drill into
PRJ-VEGA-2026(the worst Project) and the cause is a labour overrun. The Project’s COGS line shows 112K plan; the engineers logged 720 hours against a 480-hour scope. Pair this with Margin by SKU cut by Item dimension (Service items have margins too) and the picture sharpens further: senior-engineer time billed at 180/hr is the proximate cause. The remediation is a Change Order to the Customer for scope expansion, or an internal write-down on the Project. The card fires the alert; the Project margin pivot tells the Account Director where to look; the conversation with the Customer happens within 24 hours. - The consolidated 41.1% number on its own is misleading because the median-Project margin is still 49%. Three problem Projects are bleeding $200K+ of dollar margin in a 30-day window; the 47 healthy Projects are operating at plan. Without the dimensional cut, the executive read is “margin compressed across the agency”, which would lead to a wrong intervention (cost cutting across all teams, hiring freezes, scope refusal). With the dimensional cut, the read is “three Projects need urgent attention; the other 47 are fine”. The intervention is targeted, not blanket. This is why the Project dimension on Intacct is uniquely valuable for services-heavy commerce; NetSuite’s Class dimension is conceptually similar but Intacct’s Project is purpose-built for project-based businesses with native time-tracking and Project-level P&L roll-up.
- The Department dimension cut tells a complementary story. Pivot 41.1% by Department: Strategy 52%, Creative 48%, Engineering 38%, Media 55%. Engineering is dragging because the three problem Projects all sit there. The Engineering Practice Lead now owns the conversation with three Account Directors. The card has surfaced the issue, the Project pivot has surfaced the cause, the Department pivot has surfaced the owner. Three clicks to the action; on a system without Intacct’s dimensional model, this is a 3-hour spreadsheet pull.
- The Class dimension carries the secondary signal: client tier. Pivot 41.1% by Class (which the Implementation Partner mapped to Strategic / Growth / SMB tiers): Strategic clients 35% margin (down from 51%), Growth 44% (down from 47%), SMB 50% (flat). The Strategic-tier compression is structural and worse than the consolidated number suggests, because Strategic accounts represent 60% of revenue. The 16pp drop on Strategic clients is the real boardroom conversation. If the Account Directors keep accepting scope expansions on Strategic accounts without Change Orders to protect margin, the agency will exit the year at sub-40% gross margin on its biggest revenue cohort. The card fires the alert; the dimensional cuts make the cause unambiguous.
Sibling cards merchants should reference together
| Card | Why pair it with Gross Margin Percentage |
|---|---|
| Margin Erosion Alerts | The SKU-level worklist when this card moves. Surfaces which SKUs (or Projects) caused the compression. |
| Margin by SKU | Per-SKU snapshot, ranked. The cohort underneath the headline. |
| Total COGS | The denominator’s denominator. Why is COGS rising. |
| Revenue Booked into GL | The revenue side of the ratio. |
| Average Landed Cost per Unit | Upstream cost driver. Rising landed cost means falling margin. |
| Landed Cost Variance vs Standard | Cost-variance details against Standard cost. |
| Top SKUs by Inventory Value | Volume cross-check; concentration of where margin is being earned. |
| Dead Stock with Active Ad Spend | Cross-channel kill-shot: ad spend on margin-eroded SKUs is doubly wasteful. |
Reconciling against the vendor’s own dashboard
Where to look in Sage Intacct: The native Sage Intacct views to run side by side with this card:Reports → Financial → Income Statement (period view, dimensional). The Gross Profit subtotal divided by Total Revenue is this card. Reports → Financial → Income Statement Comparative (period vs prior period; the comparison this card automates) Interactive Custom Report (ICR) built on the General Ledger source filtered to revenue accounts (4000-4999) and COGS accounts (5000-5999), with calculated columns for the ratio, pivoted by Department / Project / Class Reports → Order Entry → Sales by Item with Margin (item-level margin, the underlying drill) Standard Dashboard “Gross Margin Trend” widget (typically configured by the Implementation Partner)The Income Statement summary line “Gross Profit %” should match this card to within rounding when the same period and entity scope are selected. For an audit-grade match, run a Comparative Income Statement at intacct.com filtered to the two windows; the Gross Profit row’s percentage column is the headline. Most Implementation Partners build a saved ICR called something like “Gross Margin by Project, Comparative” that mirrors this card’s logic; once built, it is the monthly close report. Common reconciliation pitfalls when comparing against Intacct’s own reports:
- Sales by Item with Margin sums Order-line margin, not GL-booked margin. The two views differ when COGS is recognised on a different schedule from revenue (any business with deferred recognition, lot-allocated costs, or period-end COGS adjustments).
- Trial Balance with Dimensions is account-level and includes non-revenue / non-COGS accounts if the filter is not tight; this card is revenue-account-and-COGS-account only.
- AR Aging is AR-based, not P&L. Ignore for this comparison.
| Reason | Direction | Why |
|---|---|---|
| Account range mapping | Either | If the Chart maps revenue or COGS to non-standard accounts (e.g. shipping booked to Other Income rather than Shipping Revenue), the field map must capture them. |
| Marketplace and processing fees | Either | Some workspaces reclassify Amazon / eBay marketplace fees and Stripe / PayPal processing fees into COGS; others leave them in OpEx. The card respects whatever the GL mapping shows. Reclassifying mid-period creates a one-time margin shift. |
| Inter-co eliminations | Either | Multi-Entity Console: consolidated view applies eliminations on inter-co revenue and inter-co cost. Per-entity views do not eliminate. A SKU sold inter-co at a low transfer price reads as low-margin at the originating entity but normal-margin at the consolidated level. |
| Revenue recognition (Contracts module) | Card lower | Deferred revenue is excluded from this card. Pre-Contracts accounts: full invoice posts to revenue at billing, no deferral. SaaS accounts using Intacct Contracts will see the percentage track recognised revenue, not booked. |
| FX cadence per entity | Small | Multi-Entity Console: each entity translates at its configured cadence (transaction-date, period-end, period-average). A one-off ICR run at a different cadence will not match. |
| Period boundary | Small | Card uses transaction posting date; some Income Statement views use accounting period close. Differences usually under 1% unless the close is mid-period. |
| ASC 606 split performance obligations | Either | Bundled product-plus-service offerings split revenue across periods while cost recognises at fulfilment. Card uses recognised revenue only; per-SKU margin reflects only the fulfilled portion. |
| Card | Expected relationship | What the comparison reveals |
|---|---|---|
| Commerce-platform per-product margin reports | Sage Intacct is the source of truth | Most commerce platforms (Shopify, BigCommerce, Adobe Commerce) track per-variant cost as a single static field that rarely updates. They cannot generate a period-over-period margin trend because they do not capture cost history. Intacct does. This is one of the structural reasons Intacct is the only viable source for margin analysis on a multi-channel commerce business. |
| shopify.gross_margin | Shopify margin > Intacct margin | Shopify’s variant-level cost is rarely updated as freight surcharges hit. The Shopify number lags reality by 30-90 days; the Intacct number is current. A SKU showing erosion on this card but stable margin on Shopify is the signal that merchandising needs to update Shopify cost fields. |
| google_ads.cost per-SKU | Indirect, but critical | An eroding-margin SKU still receiving high ad spend is the kill-shot. Intacct says “this product is unprofitable”, Google Ads says “we are spending money to acquire customers for it”. The intersection is “we are paying to lose money”, which the Margin Erosion Alerts card surfaces explicitly. |
| stripe.fees + paypal.fees | Indirect, hidden margin tax | Payment processing fees (2.5-3% of GMV) eat real margin even when not classified into COGS. Some Controllers reclassify into COGS for “true product margin”; if you do, expect this card to read 1.5-2.5pp lower across the board. |
| Inventory Carrying Cost | Indirect, hidden margin tax | Carrying cost on slow-moving SKUs eats margin too. A SKU showing 4% margin on this card and sitting in 91-180 aging is closer to break-even economics than the headline suggests. |
| Margin Erosion Alerts | Drill-down | When this headline percentage drops, that card surfaces the SKU-level (or Project-level) cohort responsible. |