Estimate your monthly lease payment by entering the vehicle price, residual value, and money factor.
Net Capitalized Cost:$0.00
Monthly Depreciation:$0.00
Monthly Finance Fee:$0.00
Base Monthly Payment:$0.00
Total Monthly Payment:$0.00
How to Use the Car Lease Calculator
Calculating a car lease is more complex than a standard auto loan. While a loan is based on the total price of the vehicle, a lease is based primarily on the vehicle's depreciation during the time you drive it. To get an accurate estimate, you need several key pieces of information:
Negotiated Vehicle Price: This is the "Gross Capitalized Cost." It is the final price you agreed upon with the dealer, not necessarily the MSRP.
Down Payment & Trade-in: These amounts are subtracted from the vehicle price to reach the "Net Capitalized Cost."
Residual Value: This is the predicted value of the car at the end of the lease. The bank or leasing company sets this. You only pay for the difference between the Net Cap Cost and the Residual Value.
Money Factor: This is the interest rate expressed in a different format. To convert APR to a Money Factor, divide the APR by 2400.
The Lease Calculation Formula
A lease payment consists of two main parts: the Depreciation Fee and the Finance Fee.
1. Depreciation Fee: (Net Cap Cost – Residual Value) / Lease Term 2. Finance Fee: (Net Cap Cost + Residual Value) × Money Factor 3. Total Payment: (Depreciation + Finance Fee) × (1 + Sales Tax Rate)
Practical Example
Suppose you are looking at a car priced at $35,000. You put $3,000 down and have a trade-in worth $2,000. Your Net Capitalized Cost is $30,000.
If the 36-month residual value is $20,000 and your Money Factor is 0.0015 (roughly 3.6% APR):
To get the best deal on a lease, focus on these three levers:
Negotiate the Price: Even though it's a lease, you can still negotiate the purchase price (Cap Cost).
Look for High Residuals: Cars that hold their value better (like certain SUVs or luxury brands) often have lower monthly payments because the depreciation is lower.
Check the Money Factor: Ensure the dealer isn't "marking up" the interest rate provided by the lender.
function calculateLease() {
var grossCap = parseFloat(document.getElementById('grossCapCost').value);
var down = parseFloat(document.getElementById('downPayment').value) || 0;
var trade = parseFloat(document.getElementById('tradeIn').value) || 0;
var residual = parseFloat(document.getElementById('residualValue').value);
var mf = parseFloat(document.getElementById('moneyFactor').value);
var term = parseFloat(document.getElementById('leaseTerm').value);
var taxRate = parseFloat(document.getElementById('salesTax').value) || 0;
if (isNaN(grossCap) || isNaN(residual) || isNaN(mf) || isNaN(term) || term <= 0) {
alert("Please enter valid numbers for Price, Residual, Money Factor, and Term.");
return;
}
// 1. Net Cap Cost
var netCapCost = grossCap – down – trade;
// 2. Monthly Depreciation
var monthlyDepreciation = (netCapCost – residual) / term;
if (monthlyDepreciation < 0) monthlyDepreciation = 0;
// 3. Finance Fee (Rent Charge)
var monthlyFinance = (netCapCost + residual) * mf;
// 4. Base Payment
var basePayment = monthlyDepreciation + monthlyFinance;
// 5. Total Payment with Tax
var totalPayment = basePayment * (1 + (taxRate / 100));
// Update UI
document.getElementById('resNetCapCost').innerText = "$" + netCapCost.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resDepreciation').innerText = "$" + monthlyDepreciation.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resFinance').innerText = "$" + monthlyFinance.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resBasePayment').innerText = "$" + basePayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resTotalPayment').innerText = "$" + totalPayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resultArea').style.display = 'block';
}