Home Affordability Calculator

Take the guesswork out of home shopping with this comprehensive affordability calculator. Enter your household income, available savings, existing debts, and loan preferences to see your maximum home price and estimated monthly payment. The calculator considers down payment requirements, property taxes, insurance, PMI, and debt-to-income ratios to give you a realistic picture of what you can afford. Perfect for first-time buyers, real estate agents, and mortgage professionals.

FinancialPopular

Try the Calculator

Home Affordability Calculator
💰 Your Income
USD
 
USD
 
USD
 
USD
 
🏦 Your Savings
USD
 
USD
 
USD
 
📋 Loan Details
 
🏠 Housing Costs
 
USD
 
USD
 
📊 Affordability Settings

🎯 What You Can Afford
$ 125,000.00
$ 125,000.00
📅 Monthly Payment Estimate
$ 1,327.00
$ 263.00
$ 125.00
$ 0.00
💵 Total Monthly Payment
$ 1,750.00
This is an estimate only. Actual affordability depends on credit score, debt, and lender requirements. Get pre-approved for accurate figures.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
export function homeAffordabilityCalculator(form: FormTs) {
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Home Affordability Calculator',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
 
form.addSpacer({ height: 20 });
 
// Income Section
const incomeSection = form.addSubform('income', { title: '💰 Your Income' });
 
incomeSection.addRow(row => {
row.addMoney('annualIncome', {
label: 'Annual Gross Income',
min: 0,
max: 10000000,
defaultValue: 75000,
isRequired: true,
tooltip: 'Your total yearly income before taxes'
}, '1fr');
row.addMoney('spouseIncome', {
label: 'Spouse/Co-borrower Income',
min: 0,
max: 10000000,
defaultValue: 0,
tooltip: 'Annual income of co-borrower if applicable'
}, '1fr');
});
 
incomeSection.addRow(row => {
row.addMoney('otherIncome', {
label: 'Other Annual Income',
min: 0,
max: 1000000,
defaultValue: 0,
tooltip: 'Bonuses, rental income, investments, etc.'
}, '1fr');
row.addMoney('monthlyDebts', {
label: 'Monthly Debt Payments',
min: 0,
max: 50000,
defaultValue: 500,
tooltip: 'Car loans, student loans, credit cards, etc.'
}, '1fr');
});
 
// Savings Section
const savingsSection = form.addSubform('savings', { title: '🏦 Your Savings' });
 
savingsSection.addRow(row => {
row.addMoney('downPayment', {
label: 'Available Down Payment',
min: 0,
max: 5000000,
defaultValue: 50000,
isRequired: true,
tooltip: 'Cash available for down payment'
}, '1fr');
row.addDropdown('downPaymentPercent', {
label: 'Target Down Payment %',
options: [
{ id: '3', name: '3% (FHA minimum)' },
{ id: '5', name: '5%' },
{ id: '10', name: '10%' },
{ id: '20', name: '20% (Avoid PMI)' },
{ id: '25', name: '25%' },
{ id: '30', name: '30%+' }
],
defaultValue: '20',
tooltip: 'Higher down payment = lower monthly payment'
}, '1fr');
});
 
savingsSection.addRow(row => {
row.addMoney('closingCosts', {
label: 'Closing Costs Reserve',
min: 0,
max: 100000,
defaultValue: 10000,
tooltip: 'Typically 2-5% of home price'
}, '1fr');
row.addMoney('emergencyFund', {
label: 'Emergency Fund (keep)',
min: 0,
max: 500000,
defaultValue: 15000,
tooltip: 'Amount to keep in savings after purchase'
}, '1fr');
});
 
// Loan Details Section
const loanSection = form.addSubform('loan', { title: '📋 Loan Details' });
 
loanSection.addRow(row => {
row.addDropdown('loanType', {
label: 'Loan Type',
options: [
{ id: 'conventional', name: 'Conventional' },
{ id: 'fha', name: 'FHA' },
{ id: 'va', name: 'VA' },
{ id: 'usda', name: 'USDA' },
{ id: 'jumbo', name: 'Jumbo' }
],
defaultValue: 'conventional',
isRequired: true
}, '1fr');
row.addDropdown('loanTerm', {
label: 'Loan Term',
options: [
{ id: '15', name: '15 years' },
{ id: '20', name: '20 years' },
{ id: '30', name: '30 years' }
],
defaultValue: '30',
isRequired: true
}, '1fr');
});
 
loanSection.addRow(row => {
row.addDecimal('interestRate', {
label: 'Interest Rate (%)',
min: 0.5,
max: 15,
step: 0.125,
defaultValue: 6.5,
isRequired: true,
tooltip: 'Current mortgage rates are typically 6-7%'
}, '1fr');
row.addDropdown('creditScore', {
label: 'Credit Score Range',
options: [
{ id: 'excellent', name: 'Excellent (740+)' },
{ id: 'good', name: 'Good (700-739)' },
{ id: 'fair', name: 'Fair (660-699)' },
{ id: 'poor', name: 'Poor (620-659)' },
{ id: 'very-poor', name: 'Below 620' }
],
defaultValue: 'good',
tooltip: 'Credit score affects rate and loan options'
}, '1fr');
});
 
// Housing Costs Section
const costsSection = form.addSubform('costs', { title: '🏠 Housing Costs' });
 
costsSection.addRow(row => {
row.addDecimal('propertyTaxRate', {
label: 'Property Tax Rate (%)',
min: 0,
max: 5,
step: 0.1,
defaultValue: 1.2,
tooltip: 'Annual property tax as % of home value'
}, '1fr');
row.addMoney('monthlyHOA', {
label: 'Monthly HOA Fees',
min: 0,
max: 2000,
defaultValue: 0,
tooltip: 'Homeowners association fees if applicable'
}, '1fr');
});
 
costsSection.addRow(row => {
row.addMoney('annualInsurance', {
label: 'Annual Home Insurance',
min: 0,
max: 20000,
defaultValue: 1500,
tooltip: 'Typical range: $1,000-3,000/year'
}, '1fr');
row.addDropdown('pmiRequired', {
label: 'PMI (if <20% down)',
options: [
{ id: 'yes', name: 'Include PMI estimate' },
{ id: 'no', name: 'No PMI (20%+ down or VA/USDA)' }
],
defaultValue: 'yes'
}, '1fr');
});
 
// DTI Preferences Section
const dtiSection = form.addSubform('dti', { title: '📊 Affordability Settings' });
 
dtiSection.addRow(row => {
row.addDropdown('maxDTI', {
label: 'Max Debt-to-Income Ratio',
options: [
{ id: '28', name: 'Conservative (28%)' },
{ id: '36', name: 'Standard (36%)' },
{ id: '43', name: 'FHA Maximum (43%)' },
{ id: '50', name: 'VA Maximum (50%)' }
],
defaultValue: '36',
tooltip: 'Total debt payments / gross income'
}, '1fr');
row.addDropdown('maxHousingRatio', {
label: 'Max Housing Ratio',
options: [
{ id: '25', name: 'Conservative (25%)' },
{ id: '28', name: 'Standard (28%)' },
{ id: '31', name: 'FHA (31%)' },
{ id: '35', name: 'Stretch (35%)' }
],
defaultValue: '28',
tooltip: 'Housing payment / gross income'
}, '1fr');
});
 
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
 
// Affordability Results Section
const resultsSection = form.addSubform('results', { title: '🎯 What You Can Afford', isCollapsible: false });
 
resultsSection.addRow(row => {
row.addPriceDisplay('maxHomePrice', {
label: 'Maximum Home Price',
computedValue: () => {
const annualIncome = incomeSection.money('annualIncome')?.value() || 75000;
const spouseIncome = incomeSection.money('spouseIncome')?.value() || 0;
const otherIncome = incomeSection.money('otherIncome')?.value() || 0;
const monthlyDebts = incomeSection.money('monthlyDebts')?.value() || 500;
 
const downPayment = savingsSection.money('downPayment')?.value() || 50000;
const closingCostsReserve = savingsSection.money('closingCosts')?.value() || 10000;
const emergencyFund = savingsSection.money('emergencyFund')?.value() || 15000;
const downPaymentPercent = parseFloat(savingsSection.dropdown('downPaymentPercent')?.value() || '20') / 100;
 
const interestRate = (loanSection.decimal('interestRate')?.value() || 6.5) / 100 / 12;
const loanTerm = parseInt(loanSection.dropdown('loanTerm')?.value() || '30') * 12;
 
const propertyTaxRate = (costsSection.decimal('propertyTaxRate')?.value() || 1.2) / 100 / 12;
const monthlyHOA = costsSection.money('monthlyHOA')?.value() || 0;
const annualInsurance = costsSection.money('annualInsurance')?.value() || 1500;
const monthlyInsurance = annualInsurance / 12;
 
const maxDTI = parseFloat(dtiSection.dropdown('maxDTI')?.value() || '36') / 100;
const maxHousingRatio = parseFloat(dtiSection.dropdown('maxHousingRatio')?.value() || '28') / 100;
 
const totalMonthlyIncome = (annualIncome + spouseIncome + otherIncome) / 12;
 
// Calculate max payment based on DTI
const maxTotalDebt = totalMonthlyIncome * maxDTI;
const maxHousingFromDTI = maxTotalDebt - monthlyDebts;
 
// Calculate max payment based on housing ratio
const maxHousingFromRatio = totalMonthlyIncome * maxHousingRatio;
 
// Use lower of the two
const maxHousingPayment = Math.min(maxHousingFromDTI, maxHousingFromRatio);
 
// Back-calculate home price from payment
// P&I = maxPayment - taxes - insurance - HOA - PMI
// We'll iterate to find the right price since taxes and PMI depend on price
 
let homePrice = 100000;
for (let i = 0; i < 20; i++) {
const loanAmount = homePrice * (1 - downPaymentPercent);
 
// Monthly P&I
const monthlyPI = loanAmount * (interestRate * Math.pow(1 + interestRate, loanTerm)) /
(Math.pow(1 + interestRate, loanTerm) - 1);
 
// Monthly property tax
const monthlyTax = homePrice * propertyTaxRate;
 
// PMI (roughly 0.5-1% annually if down < 20%)
let monthlyPMI = 0;
if (downPaymentPercent < 0.2 && costsSection.dropdown('pmiRequired')?.value() === 'yes') {
monthlyPMI = (loanAmount * 0.007) / 12;
}
 
const totalPayment = monthlyPI + monthlyTax + monthlyInsurance + monthlyHOA + monthlyPMI;
 
if (Math.abs(totalPayment - maxHousingPayment) < 10) break;
 
// Adjust home price
homePrice = homePrice * (maxHousingPayment / totalPayment);
}
 
// Also check against available down payment
const availableForDown = downPayment - closingCostsReserve - emergencyFund;
const maxFromSavings = availableForDown / downPaymentPercent;
 
return Math.round(Math.min(homePrice, maxFromSavings));
},
variant: 'large'
}, '1fr');
row.addPriceDisplay('recommendedPrice', {
label: 'Comfortable Price (Conservative)',
computedValue: () => {
const annualIncome = incomeSection.money('annualIncome')?.value() || 75000;
const spouseIncome = incomeSection.money('spouseIncome')?.value() || 0;
const otherIncome = incomeSection.money('otherIncome')?.value() || 0;
const monthlyDebts = incomeSection.money('monthlyDebts')?.value() || 500;
 
const downPayment = savingsSection.money('downPayment')?.value() || 50000;
const closingCostsReserve = savingsSection.money('closingCosts')?.value() || 10000;
const emergencyFund = savingsSection.money('emergencyFund')?.value() || 15000;
const downPaymentPercent = parseFloat(savingsSection.dropdown('downPaymentPercent')?.value() || '20') / 100;
 
const interestRate = (loanSection.decimal('interestRate')?.value() || 6.5) / 100 / 12;
const loanTerm = parseInt(loanSection.dropdown('loanTerm')?.value() || '30') * 12;
 
const propertyTaxRate = (costsSection.decimal('propertyTaxRate')?.value() || 1.2) / 100 / 12;
const monthlyHOA = costsSection.money('monthlyHOA')?.value() || 0;
const annualInsurance = costsSection.money('annualInsurance')?.value() || 1500;
const monthlyInsurance = annualInsurance / 12;
 
const totalMonthlyIncome = (annualIncome + spouseIncome + otherIncome) / 12;
 
// Conservative: 25% of income for housing
const maxHousingPayment = totalMonthlyIncome * 0.25;
 
let homePrice = 100000;
for (let i = 0; i < 20; i++) {
const loanAmount = homePrice * (1 - downPaymentPercent);
 
const monthlyPI = loanAmount * (interestRate * Math.pow(1 + interestRate, loanTerm)) /
(Math.pow(1 + interestRate, loanTerm) - 1);
 
const monthlyTax = homePrice * propertyTaxRate;
 
let monthlyPMI = 0;
if (downPaymentPercent < 0.2 && costsSection.dropdown('pmiRequired')?.value() === 'yes') {
monthlyPMI = (loanAmount * 0.007) / 12;
}
 
const totalPayment = monthlyPI + monthlyTax + monthlyInsurance + monthlyHOA + monthlyPMI;
 
if (Math.abs(totalPayment - maxHousingPayment) < 10) break;
 
homePrice = homePrice * (maxHousingPayment / totalPayment);
}
 
const availableForDown = downPayment - closingCostsReserve - emergencyFund;
const maxFromSavings = availableForDown / downPaymentPercent;
 
return Math.round(Math.min(homePrice, maxFromSavings));
},
variant: 'large'
}, '1fr');
});
 
// Monthly Payment Breakdown Section
const paymentSection = form.addSubform('payment', { title: '📅 Monthly Payment Estimate', isCollapsible: false });
 
paymentSection.addRow(row => {
row.addPriceDisplay('monthlyPI', {
label: 'Principal & Interest',
computedValue: () => {
const annualIncome = incomeSection.money('annualIncome')?.value() || 75000;
const spouseIncome = incomeSection.money('spouseIncome')?.value() || 0;
const otherIncome = incomeSection.money('otherIncome')?.value() || 0;
const downPaymentPercent = parseFloat(savingsSection.dropdown('downPaymentPercent')?.value() || '20') / 100;
const interestRate = (loanSection.decimal('interestRate')?.value() || 6.5) / 100 / 12;
const loanTerm = parseInt(loanSection.dropdown('loanTerm')?.value() || '30') * 12;
const maxHousingRatio = parseFloat(dtiSection.dropdown('maxHousingRatio')?.value() || '28') / 100;
 
const totalMonthlyIncome = (annualIncome + spouseIncome + otherIncome) / 12;
const maxHousingPayment = totalMonthlyIncome * maxHousingRatio;
 
// Simplified home price estimate
const homePrice = maxHousingPayment * 150; // rough estimate
const loanAmount = homePrice * (1 - downPaymentPercent);
 
const monthlyPI = loanAmount * (interestRate * Math.pow(1 + interestRate, loanTerm)) /
(Math.pow(1 + interestRate, loanTerm) - 1);
 
return Math.round(monthlyPI);
},
variant: 'default'
}, '1fr');
row.addPriceDisplay('monthlyTax', {
label: 'Property Tax',
computedValue: () => {
const annualIncome = incomeSection.money('annualIncome')?.value() || 75000;
const spouseIncome = incomeSection.money('spouseIncome')?.value() || 0;
const otherIncome = incomeSection.money('otherIncome')?.value() || 0;
const maxHousingRatio = parseFloat(dtiSection.dropdown('maxHousingRatio')?.value() || '28') / 100;
const propertyTaxRate = (costsSection.decimal('propertyTaxRate')?.value() || 1.2) / 100 / 12;
 
const totalMonthlyIncome = (annualIncome + spouseIncome + otherIncome) / 12;
const maxHousingPayment = totalMonthlyIncome * maxHousingRatio;
const homePrice = maxHousingPayment * 150;
 
return Math.round(homePrice * propertyTaxRate);
},
variant: 'default'
}, '1fr');
});
 
paymentSection.addRow(row => {
row.addPriceDisplay('monthlyInsurance', {
label: 'Home Insurance',
computedValue: () => {
const annualInsurance = costsSection.money('annualInsurance')?.value() || 1500;
return Math.round(annualInsurance / 12);
},
variant: 'default'
}, '1fr');
row.addPriceDisplay('monthlyPMI', {
label: 'PMI (if applicable)',
computedValue: () => {
const downPaymentPercent = parseFloat(savingsSection.dropdown('downPaymentPercent')?.value() || '20') / 100;
const annualIncome = incomeSection.money('annualIncome')?.value() || 75000;
const spouseIncome = incomeSection.money('spouseIncome')?.value() || 0;
const otherIncome = incomeSection.money('otherIncome')?.value() || 0;
const maxHousingRatio = parseFloat(dtiSection.dropdown('maxHousingRatio')?.value() || '28') / 100;
 
if (downPaymentPercent >= 0.2 || costsSection.dropdown('pmiRequired')?.value() === 'no') {
return 0;
}
 
const totalMonthlyIncome = (annualIncome + spouseIncome + otherIncome) / 12;
const maxHousingPayment = totalMonthlyIncome * maxHousingRatio;
const homePrice = maxHousingPayment * 150;
const loanAmount = homePrice * (1 - downPaymentPercent);
 
return Math.round((loanAmount * 0.007) / 12);
},
variant: 'default'
}, '1fr');
});
 
// Summary Section
const summarySection = form.addSubform('summary', {
title: '💵 Total Monthly Payment',
isCollapsible: false,
sticky: 'bottom'
});
 
summarySection.addRow(row => {
row.addPriceDisplay('totalMonthly', {
label: 'Est. Monthly Payment',
computedValue: () => {
const annualIncome = incomeSection.money('annualIncome')?.value() || 75000;
const spouseIncome = incomeSection.money('spouseIncome')?.value() || 0;
const otherIncome = incomeSection.money('otherIncome')?.value() || 0;
const maxHousingRatio = parseFloat(dtiSection.dropdown('maxHousingRatio')?.value() || '28') / 100;
 
const totalMonthlyIncome = (annualIncome + spouseIncome + otherIncome) / 12;
return Math.round(totalMonthlyIncome * maxHousingRatio);
},
variant: 'large'
});
});
 
summarySection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'This is an estimate only. Actual affordability depends on credit score, debt, and lender requirements. Get pre-approved for accurate figures.',
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'text-align': 'center' }
});
});
 
form.configureSubmitButton({
label: 'Get Pre-Approval Information'
});
}
 

Frequently Asked Questions

What is debt-to-income ratio (DTI)?

DTI is the percentage of your gross monthly income that goes toward debt payments. Lenders typically want total DTI below 36-43%, with housing costs (front-end ratio) below 28-31%. Lower DTI means better loan terms.

How much should I put down on a house?

While 20% down avoids PMI and gets better rates, many programs allow 3-5% down. FHA requires 3.5%, VA and USDA offer 0% down for qualified buyers. Consider your total savings and emergency fund needs.

What's included in the monthly payment?

PITI: Principal, Interest, Taxes, and Insurance. This calculator also includes PMI (if applicable) and HOA fees. Utilities, maintenance, and repairs are additional costs not included here.

Should I buy at my maximum affordability?

Generally, no. The 'comfortable' estimate (25% of income) leaves room for savings, retirement, and unexpected expenses. Buying at maximum stretches your budget thin and leaves little financial flexibility.

Can mortgage brokers customize this calculator?

Yes! Adjust interest rates, add your company's loan programs, customize DTI limits, and embed it on your website to help clients understand their buying power before applying.