Analyze revenue drivers between two periods for multiple products.
Product A
Product B
Variance Summary
Total Variance
$0
Rate (Price) Variance
$0
Volume Variance
$0
Mix Variance
$0
Understanding Rate, Volume, and Mix Analysis
Rate-Volume-Mix (RVM) analysis is a financial tool used by FP&A (Financial Planning and Analysis) professionals to bridge the gap between budgeted revenue and actual revenue. By breaking down the components of change, businesses can understand whether revenue growth was driven by selling more (Volume), charging more (Rate/Price), or selling a more profitable combination of products (Mix).
The Components of RVM
Rate (Price) Variance: Measures the impact of the change in unit price, holding current volume constant. Formula: (Current Price - Base Price) * Current Volume.
Volume Variance: Measures the impact of selling a different total quantity of units, holding the base average price constant. Formula: (Current Total Units - Base Total Units) * Base Weighted Average Price.
Mix Variance: Measures the impact of the shift in the proportion of products sold. If you sell more of a high-priced item and less of a low-priced item, you generate a positive mix variance.
Example Calculation
Suppose you sold 1,000 units of Product A at $50 last year. This year, you sold 1,100 units at $55.
The total revenue increased from $50,000 to $60,500 ($10,500 total variance).
The Rate Variance is ($55 – $50) * 1,100 = $5,500.
The Volume Variance (assuming no other products) is (1,100 – 1,000) * $50 = $5,000.
Why RVM Matters
Without RVM, a manager might see a 10% revenue increase and assume the sales team is doing a great job. However, if that increase was entirely due to a price hike while volume actually decreased, the business might be losing market share. RVM provides the granularity needed for strategic decision-making.
function calculateRVM() {
// Product A Inputs
var q1a = parseFloat(document.getElementById('q1a').value) || 0;
var p1a = parseFloat(document.getElementById('p1a').value) || 0;
var q2a = parseFloat(document.getElementById('q2a').value) || 0;
var p2a = parseFloat(document.getElementById('p2a').value) || 0;
// Product B Inputs
var q1b = parseFloat(document.getElementById('q1b').value) || 0;
var p1b = parseFloat(document.getElementById('p1b').value) || 0;
var q2b = parseFloat(document.getElementById('q2b').value) || 0;
var p2b = parseFloat(document.getElementById('p2b').value) || 0;
// Totals Base
var rev1a = q1a * p1a;
var rev1b = q1b * p1b;
var totalRev1 = rev1a + rev1b;
var totalQ1 = q1a + q1b;
var avgP1 = totalQ1 > 0 ? totalRev1 / totalQ1 : 0;
// Totals Current
var rev2a = q2a * p2a;
var rev2b = q2b * p2b;
var totalRev2 = rev2a + rev2b;
var totalQ2 = q2a + q2b;
// Total Variance
var totalVariance = totalRev2 – totalRev1;
// Price Variance = (P2 – P1) * Q2
var priceVarA = (p2a – p1a) * q2a;
var priceVarB = (p2b – p1b) * q2b;
var totalRateVar = priceVarA + priceVarB;
// Volume Variance = (Total Q2 – Total Q1) * Avg P1
var totalVolVar = (totalQ2 – totalQ1) * avgP1;
// Mix Variance = Residual (Total – Rate – Vol)
var totalMixVar = totalVariance – totalRateVar – totalVolVar;
// Display Results
document.getElementById('rvm-results').style.display = 'block';
document.getElementById('totalVar').innerText = formatCurrency(totalVariance);
document.getElementById('rateVar').innerText = formatCurrency(totalRateVar);
document.getElementById('volVar').innerText = formatCurrency(totalVolVar);
document.getElementById('mixVar').innerText = formatCurrency(totalMixVar);
// Color coding
applyColor('totalVar', totalVariance);
applyColor('rateVar', totalRateVar);
applyColor('volVar', totalVolVar);
applyColor('mixVar', totalMixVar);
}
function formatCurrency(val) {
var sign = val 0) {
element.style.color = '#27ae60';
} else if (val < 0) {
element.style.color = '#c0392b';
} else {
element.style.color = '#333';
}
}