What the Spavana Sale Sheet Covers
Each row is a SKU. Each column tracks units sold, average selling price (ASP), revenue, COGS, and gross profit. The Summary tab computes totals, YoY variance, and the PVM bridge automatically from the two year tabs - no hardcoded numbers.
A 14-SKU Spavana sale sheet across both fiscal years looks like this:
| Metric | FY24-25 | FY25-26 | Variance | % Change |
|---|---|---|---|---|
| Total Revenue | $4.2M | $4.9M | +$700K | +16.7% |
| Gross Margin % | 38.5% | 41.2% | +270bps | - |
| Avg Units/SKU | 3,840 | 4,480 | +640 | +16.7% |
| Active SKUs | 14 | 14 | 0 | - |
Setting Up the Spavana Sale Sheet Tab Structure
The workbook needs four tabs minimum. As of May 2026, this structure handles the FY24-25 to FY25-26 comparison without any circular references or manual reconciliation:
| Tab | Contents | Links to |
|---|---|---|
Assumptions | ASP by SKU, COGS %, pricing tiers, variance thresholds | FY24-25, FY25-26 |
FY24-25 | Actuals: units, ASP, revenue, COGS, gross profit | Summary |
FY25-26 | Plan or actuals: same structure | Summary |
Summary | Totals, YoY variance, SKU audit flags, PVM bridge | - |
Column structure for each year tab (A through G):
A: SKU_ID | B: SKU_Name | C: Units | D: ASP | E: Revenue (=C*D) | F: COGS | G: Gross_Profit (=E-F)
Key everything to SKU_ID in column A, not to the product name. Names drift between fiscal years - a SKU gets renamed in FY25-26 and your SUMIFS silently return zero where they should return $180K. IDs don't drift.
Core Formulas: Cross-Tab Revenue Pulls
On the Summary tab, all revenue figures pull directly from the year tabs. Never hardcode them.
Total FY24-25 revenue for a given SKU category:
=SUMIFS('FY24-25'!E:E, 'FY24-25'!A:A, Summary!$A2, 'FY24-25'!B:B, Assumptions!$C$3)
Year-over-year revenue variance by SKU row:
=SUMIFS('FY25-26'!E:E,'FY25-26'!A:A,Summary!$A2)
- SUMIFS('FY24-25'!E:E,'FY24-25'!A:A,Summary!$A2)
Blended gross margin across all 14 SKUs (compute from aggregated figures, not row averages):
=SUMPRODUCT('FY24-25'!G2:G15) / SUMPRODUCT('FY24-25'!E2:E15)
Averaging margin percentages row by row instead of from aggregated gross profit and revenue is the most common error in multi-SKU sale sheets. It weights every SKU equally regardless of size. At $4.2M revenue, the error can reach $100K+ in gross profit misstatement when high-volume SKUs carry below-average margins. The aggregated SUMPRODUCT version is always right. According to Google's SUMPRODUCT function reference (support.google.com/docs/answer/3239253), this approach handles cross-tab arrays cleanly without requiring an array formula entry.
Spavana SKU Mismatches Between FY24-25 and FY25-26
This is where most Spavana sale sheets break silently.
A SKU gets renamed, repriced, or discontinued between years, and your SUMIFS return zero where they should return real revenue. You won't notice until the board deck doesn't tie.
The fix is an audit formula on a helper column in the Summary tab. For each SKU_ID in the FY25-26 tab, check whether it exists in FY24-25:
=IFERROR(
INDEX('FY24-25'!A:A, MATCH(Summary!A2, 'FY24-25'!A:A, 0)),
"MISSING IN FY24-25"
)
Run it in both directions - once checking FY25-26 IDs against FY24-25, once checking FY24-25 IDs against FY25-26. Any "MISSING" flag means you have a new SKU introduction or a discontinuation that needs to be explicitly acknowledged in the summary, not silently zeroed out. Google's MATCH function documentation (support.google.com/docs/answer/3093378) confirms it returns #N/A when no match is found, which IFERROR catches here.
The YoY summary by SKU category, once the audit is clean:
| Category | FY24-25 Rev | FY25-26 Rev | $ Var | Flag |
|---|---|---|---|---|
| Core SKUs | $2.8M | $3.1M | +$300K | - |
| New Intro | - | $620K | +$620K | REVIEW |
| Discontinued | $380K | - | -$380K | REVIEW |
| Carry-forward | $1.02M | $1.18M | +$160K | - |
REVIEW flags on new introductions and discontinuations are expected. The flag exists to make sure someone consciously acknowledges them in the board pack, not to imply an error.
Building the Price/Volume/Mix Bridge for the Spavana Sale Sheet
The $700K revenue increase from FY24-25 to FY25-26 has three drivers: price changes, volume changes, and the interaction between them. Three SUMPRODUCT formulas decompose it exactly, with no plug required.
Price effect (impact of ASP changes, holding FY24-25 volume constant):
=SUMPRODUCT(
('FY25-26'!D$2:D$15 - 'FY24-25'!D$2:D$15), // ASP delta by SKU
'FY24-25'!C$2:C$15 // Prior year units
)
Volume effect (impact of unit changes, holding FY24-25 ASP constant):
=SUMPRODUCT(
('FY25-26'!C$2:C$15 - 'FY24-25'!C$2:C$15), // Unit delta by SKU
'FY24-25'!D$2:D$15 // Prior year ASP
)
Mix/interaction effect (what happens where both price and volume moved together on the same SKU):
=SUMPRODUCT(
('FY25-26'!D$2:D$15 - 'FY24-25'!D$2:D$15), // ASP delta
('FY25-26'!C$2:C$15 - 'FY24-25'!C$2:C$15) // Unit delta
)
Price effect + Volume effect + Mix effect = total revenue variance. If the three don't sum to $700K, there's a data error upstream - almost always a SKU mismatch from the audit step. Fix it there, not by adjusting the bridge formulas.
For 14 SKUs, this recalculates in under 3 seconds even with full cross-tab references. Google Sheets caps at 10 million cells per workbook (per support.google.com/drive/answer/37603), so you won't hit a performance ceiling on a typical Spavana sale sheet.
If your ASP inputs live in a pricing tool, Stripe catalog, or HubSpot product library, ModelMonkey can pull updated pricing directly into the Assumptions tab on demand - so the PVM bridge recalculates against current data instead of a 3-week-old CSV export.