Skip to main content
Card class: HeroCategory: Ecommerce Platform
Top finding for the Finance Controller. SKUs whose unit margin has materially eroded in the last quarter.

At a glance

SKUs whose margin percentage has materially eroded vs the prior quarter inside Sage Intacct. The Controller’s “what is getting worse” worklist, sliced by every Intacct dimension (Department, Location, Project, Item, Class, Customer, Vendor, Employee).
What it countsPer-Item margin % comparison: this 90D vs prior 90D, computed off the Intacct GL Detail (revenue lines minus COGS lines, both filtered to the same Item dimension). Surfaces Items where the absolute margin % drop exceeds 20 percentage points (configurable).
Tax treatmentNet of tax. Sage Intacct posts US sales tax, VAT, and GST to separate liability accounts via the Tax Solution module or AvaTax connector; this card sums revenue and COGS accounts only.
ShippingConfigurable. Most Intacct distribution charts route shipping income to a 4900 Shipping Revenue account and outbound freight to a 5800 Freight account. Both are included by default; tune the field map to exclude either.
CurrencyReporting currency at the Top Level entity (typically USD). Per-entity views translate at the configured cadence (transaction-date, period-end, or period-average) per the Currency module setup.
Entity scopeRespects dashboard filter. Multi-Entity Console accounts can run consolidated (with eliminations on inter-co transfer pricing) or per-entity.
Dimensional cutThe card surfaces Item-level erosion by default, but every Intacct dimension is queryable: erosion by Department, by Location, by Project (essential for project-based services), by Class, by Customer (the B2B contract-renewal signal), by Vendor (the supplier-cost-shock signal).
Minimum revenue threshold$5K monthly to filter noise from low-volume Items.
Time window90D vsP
Alert triggerany SKU dropped >20% margin, sentiment margin_erosion
Revenue recognition (Contracts)If the merchant runs Intacct Contracts and Revenue Management, the card uses recognised revenue only. Deferred revenue is excluded.
Implementation Partner alignmentMost Intacct merchants are paired with an Intacct-certified Implementation Partner who owns the Chart of Accounts. This card respects the Partner’s revenue-and-COGS account mapping; misaligned accounts (e.g. shipping booked to expense rather than revenue) shift the margin headline.
Rolesowner, 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 B2B distributor on Sage Intacct Multi-Entity Console. Three entities: a US parent (Vortex Distribution Inc, USD), a Canadian sub (Vortex Distribution Canada, CAD), and a fulfilment entity (Vortex Logistics Inc, USD intercompany only). Annual revenue ~$72M. The Department and Location dimensions are populated on every transaction line; Class is used to separate Wholesale from Retail D2C. Reporting currency USD. Comparing 14 Jan 26 to 12 Apr 26 vs 14 Oct 25 to 13 Jan 26.
ItemDescriptionDepartmentClassPrior margin %This margin %Drop (pp)Period revenue
BR-A-001Brand A Premium Tee, Black MApparelWholesale41%37%-4pp$172K
BR-A-014Brand A Premium PoloApparelWholesale50%47%-3pp$118K
BR-B-022Brand B Hoodie, GreyApparelWholesale36%11%-25pp$396K
BR-C-088Brand C Tee, ClearanceApparelRetail D2C27%4%-23pp$88K
BR-D-014Brand D Discounted Sub-styleApparelRetail D2C22%-10%-32pp$56K
SVC-IMPL-AOCImplementation Services, AOC tierServicesWholesale64%38%-26pp$310K
Five things to notice:
  1. Four Items trip the alert (drops greater than 20pp), and the Sage Intacct dimensional cut is what makes the diagnostic actionable. A single number (“margin is down”) is a complaint; an Item-by-Department-by-Class worklist is an action. The four alerts here decompose to: BR-D-014 (-32pp) is a pricing decision gone wrong inside the Retail D2C Class, BR-B-022 (-25pp) is a high-volume cost shock inside the Wholesale Class, BR-C-088 (-23pp) is a clearance event also Retail D2C, and SVC-IMPL-AOC (-26pp) is a project-based services line where billable utilisation collapsed. Each goes to a different Department owner. Without the dimensional cut, the same four would land as a generic margin-decline ticket on the Controller’s desk; with the cut, BR-B-022 and BR-D-014 route to Apparel merchandising, BR-C-088 routes to Retail D2C clearance management, and SVC-IMPL-AOC routes to the Services Department lead.
  2. BR-D-014 dropped 32pp into negative margin (-10%), meaning the business is paying customers to take this product. Most likely cause: Retail D2C discount pricing pushed below the landed-cost floor, with merchandising authorising a 60% off promotion without checking landed cost in the Item record. Less common but real: an upstream cost spike (freight surcharge, supplier price increase) booked through the Vortex Logistics intercompany entity that pushed the inbound landed cost above the discounted price. The Controller pings merchandising the same morning. Annualised at the current Retail D2C revenue rate, BR-D-014 alone is bleeding 5.6Kofgrossmarginperquarteragainsta5.6K of gross margin per quarter against a 0K target.
  3. **BR-B-022 (-25pp from 36% to 11%) is the most financially concerning of the alerts because it is a high-volume Wholesale Item at 396Kofperiodrevenue.25ppon396K of period revenue.** 25pp on 396K is $99K of dollar margin loss in a single quarter, more than the other three alerts combined. Big-revenue Item plus modest-percentage drop almost always wins on dollar impact. The card surfaces percentage-pp drop because that triggers anomaly detection cleanly, but the action priority is dollar impact. A Controller working the worklist should sort by period_revenue * abs(margin_drop_pp) to prioritise dollars. On this account, BR-B-022 traces back to a Vendor-dimensioned cost-shock: a freight surcharge on a hoodie line manufactured in Vietnam that the Apparel Department had not pushed through to Wholesale price.
  4. SVC-IMPL-AOC (-26pp) is the Project-dimension finding that only Sage Intacct can produce cleanly. This Implementation Services line was tagged to Project PRJ-AOC-2025. The drop is because the project ran 38% over its planned hours (project tracking inside Intacct’s Projects module shows 1,420 actual hours against 1,030 budgeted), which booked through to project cost without a corresponding Project price uplift. Both prior-period and this-period revenue tagged to the same Project; the prior-period had healthier utilisation. NetSuite can produce a similar finding through SuiteProjects or the Projects module, but the dimensional join from GL Detail to Project is one Intacct API call (the same line carries both the revenue account hit and the Project tag), where in NetSuite it requires the Projects subrecord join. For services-heavy or project-based commerce (digital agencies, consultancies, B2B implementation services), Intacct’s Project dimension is the killer integration on this card.
  5. The healthy-but-eroding watchlist (BR-A-001 at -4pp, BR-A-014 at -3pp) is below the alert threshold but the trend is worth tracking, especially because the same Brand (Brand A) shows two consecutive Items softening in the Wholesale Class. Two Items in the same Brand softening at the same time is a brand-level signal: probably a Vendor cost tick, possibly a freight pattern, or a competitive pricing shift in the channel that forced a price reduction. The card supports a configurable Watchlist threshold (typically 3-5pp) that surfaces the early-warning cohort without firing the alert. On this account, the Brand A erosion turned out to be a 3% Vendor cost increase that had been quietly absorbed for two quarters before the merchandiser caught it; surfacing it earlier through the Watchlist would have saved roughly $36K of cumulative margin.

Sibling cards merchants should reference together

CardWhy pair it with Margin Erosion Alerts
Margin by SKUCurrent snapshot of per-Item margin, dimension-tagged. The spot view; this card is the trend.
Gross Margin PercentageAggregate roll-up. Use to confirm whether Item-level erosion has reached the headline.
Average Landed Cost per UnitThe upstream cost driver. If margin is eroding because landed cost is rising, this card surfaces the pattern.
Landed Cost Variance vs StandardVariance details by Vendor dimension. The diagnostic pair to BR-B-022-style cost-shock alerts.
Top SKUs by Inventory ValueVolume cross-check. A high-revenue eroding Item is the dollar-impact priority.
Margin CompressionAggregate-level erosion alert. Pair with this card to triangulate whether erosion is concentrated or broad.
Total COGSThe denominator-side roll-up. A COGS spike usually predicts this card’s alerts a period later.

Reconciling against the vendor’s own dashboard

Where to look in Sage Intacct: Sage Intacct does not expose a native period-over-period margin-erosion alert; the comparison is one of the gaps that Vortex IQ fills. The closest manual approaches inside Intacct are:
Reports → Financial → Income Statement with the Item dimension pinned (run twice for the two windows, manually diff the per-Item margins in a spreadsheet) Interactive Custom Report (ICR) built against the GL Detail data source: SUM(credit_revenue) minus SUM(debit_cogs) per Item, with a calculated column for the period-vs-period delta. An Intacct-certified Implementation Partner can build the ICR in roughly 60 to 90 minutes; once built, it becomes the “tie out” report the Controller runs every month-end Reports → Order Entry → Sales Item Profitability for Item-level margin trend over time (no automatic alert on threshold breaches) Custom Reports with the Department or Project dimension filter for the dimensional cuts on the Worked Example
The Implementation Partner pattern is the key reconciliation point: most Sage Intacct merchants run their margin reporting through their Partner’s monthly board pack rather than through the Intacct UI directly. If the card’s number differs from the Partner’s pack, ninety percent of the time the discrepancy is in Chart of Accounts mapping, not in arithmetic. Vortex IQ’s field map is the single place to align both views. Common reconciliation pitfalls when building this manually:
  • Cost basis drift mid-period: Intacct’s Item average cost updates with each Inventory Adjustment or Purchase Receipt, so an Item’s “this period” margin uses a different cost basis at different points within the period. The card uses period-end average cost; an ICR using transaction-line cost can produce different per-Item margins.
  • Refund and Credit Memo handling: a Credit Memo against an Invoice in the prior period drags margin in the current period if it posts in the current window. The card normalises to invoice-date economics; a naive ICR filtered to current-period Invoice transactions distorts.
  • Discount line items: Intacct’s Order Entry module typically applies trade and term discounts at the Item line, but some setups post discounts as separate Discount line items. The ICR needs to allocate discount lines back to the Item before computing margin. Most merchants get this wrong on the first attempt.
  • Project-dimension revenue recognition: Items tagged to a Project under Intacct Contracts and Revenue Management show recognised revenue, not invoiced revenue. The ICR must filter the same way or the Project Items read different margins on the two reports.
Why our number may legitimately differ from a manual Item-margin comparison in Intacct:
ReasonDirectionWhy
Threshold settingEitherDefault 20pp; some Controllers set 10pp for tighter monitoring on stable B2B distribution, others 25-30pp for volatile Retail D2C. The number of Items surfaced is sensitive to this.
Minimum revenue thresholdEither5KmonthlyfilterexcludeslowvolumeItemswherepercentageswingsarehugebutdollarimpactistrivial.SomeControllersset5K monthly filter excludes low-volume Items where percentage swings are huge but dollar impact is trivial. Some Controllers set 10K for top-200-Item focus, others $1K for a wider net. Tunable per workspace.
Window definitionEitherDefault 90D vs prior 90D smooths promotional spikes. 30D vs prior 30D would generate roughly 4x more alerts because seasonal mix moves margin within shorter windows.
Cost basis driftEitherCard uses period-end average cost as the basis for both windows. An ICR using transaction-line cost produces slightly different margins because cost moves within the period. Differences usually under 1.5pp per Item.
Discount allocationEitherCard allocates promotional discount lines back to the Item before computing margin. Manual ICRs that miss this allocation can show inflated margins on promoted Items.
Multi-Entity Console eliminationsEitherTop Level entity with eliminations enabled removes inter-co transfer-pricing distortions; per-entity views do not. An Item sold inter-company (US to Canada in the worked example, US to Vortex Logistics for fulfilment) reads differently at the consolidated level vs each entity.
Revenue recognition (Contracts module)Card lowerIf the merchant runs Intacct Contracts, deferred revenue is excluded; the card uses recognised revenue only. SaaS-adjacent Items show lower per-period margin under Contracts than they would under invoice-on-billing accounting.
FX cadence on multi-entity ItemsSmallEach entity translates at its configured cadence (transaction-date, period-end, period-average). Pure FX impact on margin is usually under 1pp; large swings only matter if the Item’s revenue and cost are in different currencies and FX moved sharply.
Marketplace-fee inclusionEitherSome Intacct Charts route Amazon / eBay marketplace fees into a 5xxx COGS-class account; others leave them in 6xxx OpEx. The card respects whatever the GL mapping shows. Reclassifying mid-period creates a one-time margin shift.
Cross-connector reconciliation, the killer cross-channel finding:
CardExpected relationshipWhat the comparison reveals
Commerce-platform per-product margin reportsSage Intacct is the source-of-truthShopify, BigCommerce, and 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, dimensionally. This is one of the structural reasons Sage Intacct is the only viable source for margin-erosion analysis on a multi-channel commerce business.
shopify.gross_marginShopify margin > Intacct marginShopify’s variant-level cost is rarely updated as freight surcharges hit. The Shopify number lags reality by 30 to 90 days; the Intacct number is current. An Item 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-ItemIndirect, but criticalAn eroding-margin Item still receiving high ad spend is the killer cross-channel finding. Intacct says “this product is unprofitable”, Google Ads says “we are spending money to acquire customers for this product”. The intersection is “we are paying to lose money”, which the Dead Stock with Active Ad Spend cross-channel card surfaces explicitly.
facebook_ads.spend per-productIndirect, similar dynamicFacebook / Meta ad spend on eroding-margin Items is the same kill-shot finding for D2C brands.
Landed Cost Variance vs StandardCausalIf margin is eroding because landed cost is rising, this card surfaces the Item and Landed Cost Variance surfaces the Vendor-dimensioned cause. The two together are the diagnostic pair.
stripe.fees + paypal.feesIndirect, hidden margin taxPayment processing fees (2.5 to 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 to 2.5pp lower across the board.
Inventory Carrying CostIndirect, hidden margin taxCarrying cost on slow-moving Items eats margin too. An Item showing 4% margin on this card and sitting in 91-180 aging is closer to break-even economics than the headline suggests.
The cross-channel killer view is that an eroding-margin Item still receiving paid traffic is pure waste. Sage Intacct alone cannot see ad spend; ad platforms alone cannot see landed-cost-loaded margin. Vortex IQ joins them and surfaces the intersection. The Sage Intacct dimensional model makes this join cleaner than NetSuite, Oracle ERP Cloud, or SAP S/4HANA, because Item is a first-class dimension on every transaction line out of the box. On a typical mid-market Sage Intacct commerce account, this finding alone usually exceeds the cost of the subscription within the first quarter, which is why this card plus the Dead Stock with Active Ad Spend cross-channel card is the AI OS positioning anchor: no single connector, no single dashboard, no single SaaS tool can produce this finding because the data lives across systems. The connector graph is the value, not any individual card.

Known limitations / merchant FAQs

What is the right threshold? Default 20pp. Tighter (10-15pp) for stable B2B distribution, industrial wholesale, and professional services where margin should not move quarter to quarter. Looser (25-30pp) for volatile categories where seasonal swings are normal (fashion apparel, holiday-driven seasonal goods, perishables on flash promotion). The right setting is the level that produces a manageable number of true positives. If your team is getting 80 alerts a week and ignoring 70 of them, the threshold is too tight; tune up. If the alert never fires and you are still getting margin surprises at month-end, the threshold is too loose; tune down. How does Sage Intacct compare to NetSuite for this metric? The arithmetic is identical: revenue accounts minus COGS accounts at the Item level, two periods, per-Item delta. The big difference is the dimensional cut. NetSuite has Class, Department and Location segmentation, but Sage Intacct’s eight first-class dimensions (Department, Location, Project, Item, Class, Customer, Vendor, Employee) are tagged on every transaction line by default and queryable in a single API call. The same eroding-Item list can be re-cut by Project plus Department plus Vendor in Intacct without rebuilding the saved search. NetSuite typically requires a SuiteAnalytics workbook or a saved search per cut; Sage Intacct queries the same GL Detail with a different filter clause. For services-heavy or project-based commerce (digital agencies, consultancies, B2B implementations), this matters daily, which is why the SVC-IMPL-AOC alert in the Worked Example is the killer Sage finding. Multi-Entity Console accounts: how do inter-co transfers distort the alert? Yes, potentially. An Item sold inter-company at a transfer price (typically cost-plus a small mark-up) reads as low-margin at the originating entity. If transfer pricing changes mid-period (a tax-driven repricing at year-end, an Implementation Partner advice change), the card can fire an erosion alert that is purely an accounting policy change. Confirm with the tax team before chasing it; the safer pattern is to set the alert at Top Level entity with eliminations enabled and run per-entity views as a diagnostic, not as the primary alert. REST vs XML API, does the freshness affect this card? No effect on the number, small effect on freshness. Sage Intacct exposes the same data through its long-standing XML API and the newer REST API. Vortex IQ uses the XML API for GL Detail extraction (it is faster for bulk reads of the joined revenue and COGS lines that the card needs) and REST for incremental refreshes where supported. The number reflects the GL state as of the last sync window. For real-time intraday checks, the native Intacct UI is always live; the card refreshes on the workspace’s configured cadence (typically 15 to 60 minutes for posted GL data). Why is the threshold in percentage points, not percent of original margin? Because pp differences are linear and additive. An Item dropping from 50% to 40% is -10pp; an Item dropping from 20% to 10% is also -10pp but represents 50% of original margin. Both are alerts. The percentage-of-original framing is misleading because it inflates the apparent severity of low-margin Item drops; pp grounds the conversation in absolute movement, which is what actually hits the bottom line in dollars when multiplied by revenue. Discontinued Items, do they appear? Excluded if zero revenue in current period (the comparison would compare to nothing). Items with falling-but-non-zero revenue still appear; Items in their first 90 days (no prior period) are flagged as “new” and routed to a separate New Item Margin Watch view rather than the erosion alert list. Multi-currency, FX impact? Both periods translated to reporting currency at respective transaction-date FX or at the Currency module’s configured cadence per entity. Pure FX shifts are usually under 5pp on margin and only matter when revenue and cost are in different currencies. A US Distribution entity selling into Canada in CAD but sourcing through the Vortex Logistics intercompany transfer in USD has structural FX exposure on per-Item margin; a weakening CAD shrinks CAD-translated revenue while USD cost stays flat. The card surfaces this as erosion; the action is hedging or repricing, not an Item-level intervention. Single-entity vs Multi-Entity Console behaviour? Identical formula. Multi-Entity Console scopes across entities. The most useful operational pattern on Multi-Entity is to view margin erosion by entity, because pricing power and cost structure differ by geography. An Item eroding in the US entity may be stable in the Canadian entity if pricing is set independently and cost flows differ. The consolidated view can hide single-entity erosion when other entities compensate. B2B vs Retail D2C, do I read margin erosion alerts differently? Yes. Retail D2C margin erosion is usually retail-pricing-driven (promotion, sale event, full-price-to-discounted shift) and the action is merchandising and pricing. B2B Wholesale margin erosion is usually contract-driven (a renewed contract at worse pricing, a tier rebate kicking in, a Customer-specific discount agreed in a sales conversation) and the action is sales and account management. Pivot the card by Class to separate the two; on a hybrid business, Revenue by Class splits Wholesale from Retail D2C from Marketplace, which is the right second-level view after this card identifies the Items. Sage Intacct Contracts and Revenue Management (ASC 606), does it change the per-Item margin? For physical product Items, no. Revenue is recognised at fulfilment under both ASC 606 and IFRS 15, which matches the cost recognition timing. For Items inside a Contract performance obligation (a SaaS subscription bundled with implementation services, an annual replenishment contract that includes coaching), Contracts may split the performance obligations and recognise revenue across multiple periods while cost recognises at fulfilment. The card uses recognised revenue only, so the per-Item margin reflects only the recognised portion. Tune the alert threshold per Item type or carve out the Contracts cohort via field map. My account uses Implementation Partner reporting. How do I align the Partner pack with this card? Confirm three things with the Partner: (1) the Chart of Accounts revenue range (typically 4000-4999) and COGS range (typically 5000-5999) used for the headline; (2) whether shipping income is in revenue or contra-cost; (3) whether Marketplace fees are inside COGS or in OpEx. Ninety percent of Partner-vs-card discrepancies trace to one of these three mappings. Vortex IQ’s field map is the alignment point; once mapped, the card matches the Partner’s Income Statement to within reconciliation tolerance. Sage Intacct vs Sage 50, Sage 100, Sage 200, Sage X3? This card targets Sage Intacct only. Sage 50, 100, and 200 are SMB desktop / hybrid products. Sage X3 is a different mid-market ERP with its own data model and dimension structure. The metric is conceptually similar across all five products but the API, dimension queryability and reconciliation paths differ. If you are running one of those, reach out to discuss connector availability. Does this card account for marketplace fees, payment processing fees, and ad spend? Not by default. The card uses Chart-mapped COGS only, which excludes Amazon / eBay marketplace fees (usually OpEx), Stripe / PayPal processing fees (usually OpEx), and ad spend (always OpEx). For a “true contribution margin” view, pair with the Cross-Channel Contribution Margin card, which subtracts these per-Item. The headline difference is significant: an Item showing 35% gross margin on this card may be at 22% contribution margin once ad spend, marketplace fees, and processing are loaded in. The boardroom number stays as gross; the operating decision uses contribution.

Tracked live in Vortex IQ Nerve Centre

Margin Erosion Alerts is one of hundreds of KPI pulses Vortex IQ tracks across Sage 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.