2025 MASTERCLASS FOR HDB OWNERS

How to Upgrade to a Private Condo Without Sacrificing Your Family’s Lifestyle

Current Problem

The TDSR Trap: Banks ignore your $1,200 monthly tuition fees. I don't.
The 6-Month Myth: For private property, 6 months of savings is "the danger zone." We want to ensure cashflow for unforeseen circumstances.
Interest Rate Shock: If rates hit 4.5%, most upgraders will "Squeeze." We stress-test your math today.
The Helper Factor: Maintenance and helper costs are the "Silent Cashflow Killers."
The Exit Strategy: We only buy properties that are "Future-Proof" for your kids' education fund.

Introducing My Proprietary Calculator :
THE PRUDENCE ENGINE v2.0

The Real Estate Dad Calculator

Net Cash Flow Philosophy • SG Edition

1. Financial Profile

2. Loan Assumptions

3. Lifestyle Burn (Monthly)

Total Expenses:SGD 0

4. Your Survival Floor

Minimum cash to keep after ALL bills & mortgage

— Analysis Results —

Private (TDSR 55%)

SGD 0
SGD 0 / mo

HDB/EC (MSR 30%)

SGD 0
SGD 0 / mo

Dad's Safe Verdict

Safe Purchase Price
SGD 0
Installment: SGD 0 / month
Gross Monthly Income
Existing Debts
Total Lifestyle Burn
New Housing Installment
Monthly Surplus Left
SGD 0

Initial Capital Breakdown

25% DP + Stamp Duty + 6m Buffer
Leftover for Renovation/Savings

Result: "Caution" or "High Risk"?

Don't settle for a 'Squeeze'. Let's find a way to get you into the Green Zone without sacrificing your family's lifestyle.

Book My 30-Min Dad-Math Session

Disclaimer: This calculator is for educational purposes only. Always consult with a qualified financial advisor before making property decisions.

const REGULATORY_STRESS_RATE = 4.0; const LTV_RATIO = 0.25; const SURVIVAL_BUFFER_MONTHS = 6; function PV(rateP, nper, pmt) { if (rateP === 0) return Math.abs(pmt * nper); return Math.abs(pmt * (1 - Math.pow(1 + rateP, -nper)) / rateP); } function calculateInstallment(principal, annualRate, years) { const monthlyRate = (annualRate / 100) / 12; const months = years * 12; if (monthlyRate === 0) return principal / months; return (principal * monthlyRate) / (1 - Math.pow(1 + monthlyRate, -months)); } function calculateBSD(price) { let bsd = 0; if (price <= 180000) bsd = price * 0.01; else if (price <= 360000) bsd = (180000 * 0.01) + (price - 180000) * 0.02; else if (price <= 640000) bsd = (180000 * 0.01) + (180000 * 0.02) + (price - 360000) * 0.03; else if (price <= 1000000) bsd = (180000 * 0.01) + (180000 * 0.02) + (280000 * 0.03) + (price - 640000) * 0.04; else if (price <= 1500000) bsd = (180000 * 0.01) + (180000 * 0.02) + (280000 * 0.03) + (360000 * 0.04) + (price - 1000000) * 0.05; else bsd = (180000 * 0.01) + (180000 * 0.02) + (280000 * 0.03) + (360000 * 0.04) + (500000 * 0.05) + (price - 1500000) * 0.06; return bsd; } const formatter = new Intl.NumberFormat('en-SG', { style: 'currency', currency: 'SGD', minimumFractionDigits: 0, maximumFractionDigits: 0, }); function updateFundCheckUI(prefix, price, inst, totalBurn, savings) { const dp = price * LTV_RATIO; const bsd = calculateBSD(price); const survival = (totalBurn + inst) * SURVIVAL_BUFFER_MONTHS; const total = dp + bsd + survival; const status = document.getElementById(`${prefix}_fund_status`); if (savings >= total) { status.textContent = "✓ Capital Safe"; status.className = prefix === 'dad' ? "px-3 py-1 rounded-full text-[10px] font-black bg-green-600 text-white uppercase mb-1" : "text-[8px] px-2 py-0.5 rounded-full font-bold uppercase bg-green-100 text-green-700"; } else { status.textContent = "⚠ Cash Shortfall"; status.className = prefix === 'dad' ? "px-3 py-1 rounded-full text-[10px] font-black bg-red-600 text-white uppercase mb-1" : "text-[8px] px-2 py-0.5 rounded-full font-bold uppercase bg-red-100 text-red-700"; } if (prefix === 'pvt' || prefix === 'hdb') { document.getElementById(`${prefix}_inst_display`).textContent = formatter.format(inst) + " / mo"; } if (prefix === 'dad') { const remaining = savings - total; const remEl = document.getElementById('dad_remaining_funds'); remEl.textContent = formatter.format(remaining); remEl.className = remaining >= 0 ? "text-sm font-black text-green-700" : "text-sm font-black text-red-600"; document.getElementById('dad_total_needed').textContent = formatter.format(total); } } function calculate() { const income = parseFloat(document.getElementById('income').value) || 0; const debt = parseFloat(document.getElementById('debt').value) || 0; const savings = parseFloat(document.getElementById('savings').value) || 0; const safetyFloorGoal = parseFloat(document.getElementById('user_buffer').value) || 0; const tenureY = parseFloat(document.getElementById('tenure').value) || 30; const bankRate = parseFloat(document.getElementById('interest_rate').value) || 2.6; const burnIds = ['tuition', 'groceries', 'holidays', 'helper', 'utilities', 'insurance', 'transport', 'dining', 'others']; const totalBurn = burnIds.reduce((acc, id) => acc + (parseFloat(document.getElementById(id).value) || 0), 0); document.getElementById('total_burn').textContent = formatter.format(totalBurn); const periods = tenureY * 12; const stressRateP = (REGULATORY_STRESS_RATE / 100) / 12; const pvtMaxInstallmentLimit = (income * 0.55) - debt; const hdbMaxInstallmentLimit = (income * 0.30); const pvtMaxPrice = PV(stressRateP, periods, Math.max(0, pvtMaxInstallmentLimit)) / (1 - LTV_RATIO); const hdbMaxPrice = PV(stressRateP, periods, Math.max(0, hdbMaxInstallmentLimit)) / (1 - LTV_RATIO); document.getElementById('pvt55_price').textContent = formatter.format(pvtMaxPrice); document.getElementById('hdb30_price').textContent = formatter.format(hdbMaxPrice); updateFundCheckUI('pvt', pvtMaxPrice, calculateInstallment(pvtMaxPrice*0.75, bankRate, tenureY), totalBurn, savings); updateFundCheckUI('hdb', hdbMaxPrice, calculateInstallment(hdbMaxPrice*0.75, bankRate, tenureY), totalBurn, savings); const bankRateP = (bankRate / 100) / 12; let low = 0, high = 10000000; for(let i=0; i<60; i++) { let mid = (low + high) / 2; let midInst = calculateInstallment(mid * (1 - LTV_RATIO), bankRate, tenureY); let midNeeded = (mid * LTV_RATIO) + calculateBSD(mid) + ((totalBurn + midInst) * SURVIVAL_BUFFER_MONTHS); let fitsFunds = midNeeded <= savings; let fitsCashFlow = (income - debt - totalBurn - midInst) >= safetyFloorGoal; if (fitsFunds && fitsCashFlow) low = mid; else high = mid; } let dadPrice = low; let dadInstallment = calculateInstallment(dadPrice * (1 - LTV_RATIO), bankRate, tenureY); const actualSurplus = income - debt - totalBurn - dadInstallment; const surplusPercent = (actualSurplus / income) * 100; document.getElementById('dad_price').textContent = formatter.format(dadPrice); document.getElementById('dad_installment').textContent = formatter.format(dadInstallment); document.getElementById('breakdown_income').textContent = formatter.format(income); document.getElementById('breakdown_debt').textContent = "- " + formatter.format(debt); document.getElementById('breakdown_burn').textContent = "- " + formatter.format(totalBurn); document.getElementById('breakdown_inst').textContent = "- " + formatter.format(dadInstallment); document.getElementById('net_cash_left').textContent = formatter.format(actualSurplus); document.getElementById('surplus_percent').textContent = `${surplusPercent.toFixed(1)}% Ratio`; updateFundCheckUI('dad', dadPrice, dadInstallment, totalBurn, savings); const box = document.getElementById('dad_box'); const badge = document.getElementById('safety_status_badge'); const subtext = document.getElementById('safety_subtext'); const netVal = document.getElementById('net_cash_left'); if (surplusPercent < 10) { box.className = "p-6 rounded-xl border-4 shadow-xl border-red-500 bg-red-50"; badge.className = "px-3 py-1 rounded-full text-[10px] font-black text-white bg-red-600 uppercase"; badge.textContent = "High Risk"; netVal.className = "text-2xl font-black text-red-600"; subtext.textContent = "❌ Danger Zone: Your surplus is under 10%. Even if the bank says yes, the Dad says no. This budget doesn't leave enough room for life's surprises."; } else if (surplusPercent < 20) { box.className = "p-6 rounded-xl border-4 shadow-xl border-yellow-500 bg-yellow-50"; badge.className = "px-3 py-1 rounded-full text-[10px] font-black text-white bg-yellow-500 uppercase"; badge.textContent = "Caution"; netVal.className = "text-2xl font-black text-yellow-600"; subtext.textContent = "⚠️ Manageable but Tight: 10-20% surplus. This is a typical 'stretch'. You are safe, but you'll have less for investing in your kids or your own retirement."; } else { box.className = "p-6 rounded-xl border-4 shadow-xl border-green-500 bg-green-50"; badge.className = "px-3 py-1 rounded-full text-[10px] font-black text-white bg-green-600 uppercase"; badge.textContent = "Prudent"; netVal.className = "text-2xl font-black text-green-600"; subtext.textContent = "✅ The Dad Standard: 20%+ Surplus. This price lets you breathe. You have enough for the mortgage, the family, and your long-term wealth."; } } document.getElementById('calculator-form').addEventListener('input', calculate); calculate();

Not a "Green"?
Don't Panic.

If the Prudence Engine just flagged your upgrade as Red or Yellow, it doesn’t mean you can’t upgrade. It means you can’t upgrade using conventional methods.

Most agents will tell you to 'just do it' and figure it out later. Dad Math says we fix the problem before you sign the Option to Purchase. We don't guess with your children's future.

YOUR 30-MINUTE "DAD MATH" STRESS TEST

(What we will accomplish in one short call)

  1. The "Hidden Reserve" Audit: We look for CPF and cash pockets the bank’s TDSR math ignores to see if we can move you from Red to Green.

  2. The 9-Month Fortress Plan: We calculate exactly how much you need to set aside so that even if interest rates hit 4.5%, your lifestyle never changes.

  3. The "Silent Killer" Filter: We factor in maintenance fees, property taxes, and tuition inflation—the costs that usually cause the 'Squeeze.'

  4. The Final Verdict: I will give you a 100% transparent "GO" or "NO-GO" recommendation based on fiduciary safety, not a sales commission.

Why I am doing this...

As a Dad, I hate seeing families get 'stuck' in a property they can't afford to keep but can't afford to sell.
I offer these 30-minute sessions because I believe property planning in Singapore needs more Prudence and less Hype.

⚠️ LIMITED AVAILABILITY: Because I deep-dive into every family's math personally, I only open 5 slots per week. If the calendar below shows no availability, it means I am fully booked.
Please do not message me on WhatsApp for a slot; check back here next week."

"Andik didn't just show us a condo; he showed us a safety net. For the first time, we actually understand our numbers."— Tan Family, HDB Upgraders

READY TO TURN YOUR 🛑'RED' INTO A ✅'GREEN'?

Thank You.
I've received your booking. Check your WhatsApp, I'll be sending you a preliminary prep-sheet.