RLT FLIP CALCULATOR

Flip QuickCalc
Uses 31-day monthly approximation for interest (matches the workbook style).
Utilities/insurance/tax carry etc.
Lawyer/title/adjustments etc. (excluding LTT)
Approximates MLTT as same as Ontario LTT (simple toggle).
Workbook-style flat discount per side (x2 sides).
Projected Profit
$0
Cash Needed (est.)
$0
All-in Costs (excl. purchase)
$0
Total Interest
$0
Total Loan (base)
$0
Financing Fee (rolled)
$0
LTT (Ontario + Toronto)
$0
Operating (months × monthly)
$0
Selling (commission − discount + closings + other)
$0
Reno (incl. underpin)
$0
Notes: This is a quick estimator, not accounting/financing advice. LTT rules vary (first-time buyer rebates, etc.).
const $ = (id) => document.getElementById(id); function fmt(n){ const x = Number.isFinite(n) ? n : 0; return x.toLocaleString(undefined, { style:’currency’, currency:’CAD’, maximumFractionDigits:0 }); } function onLTT(p){ // Ontario LTT brackets (basic, no rebates): // 0–55k: 0.5% // 55k–250k: 1.0% // 250k–400k: 1.5% // 400k–2M: 2.0% // 2M+: 2.5% const brackets = [ { upTo: 55000, rate: 0.005 }, { upTo: 250000, rate: 0.01 }, { upTo: 400000, rate: 0.015 }, { upTo: 2000000, rate: 0.02 }, { upTo: Infinity, rate: 0.025 } ]; let remaining = p; let prev = 0; let tax = 0; for (const b of brackets){ const cap = Math.min(remaining, b.upTo – prev); if (cap > 0){ tax += cap * b.rate; remaining -= cap; prev = b.upTo; } if (remaining <= 0) break; } return tax; } function calc(){ const arv = +$('arv').value || 0; const purchase = +$('purchase').value || 0; const dpPct = (+$('dpPct').value || 0) / 100; const ratePct = (+$('ratePct').value || 0) / 100; const months = +$('months').value || 0; const monthlyOps = +$('monthlyOps').value || 0; const reno = +$('reno').value || 0; const underpin = +$('underpin').value || 0; const finFeePct = (+$('finFeePct').value || 0) / 100; const purchaseClosing = +$('purchaseClosing').value || 0; const lttMode = $('lttMode').value; const lttManual = +$('lttManual').value || 0; const toronto = $('toronto').value === 'yes'; const commPct = (+$('commPct').value || 0) / 100; const agentDiscountPerSide = +$('agentDiscountPerSide').value || 0; const saleClosing = +$('saleClosing').value || 0; const saleOther = +$('saleOther').value || 0; // Loan and financing fee rolled into interest base const downPayment = purchase * dpPct; const loanBase = purchase – downPayment; const finFee = loanBase * finFeePct; const interestBase = loanBase + finFee; // Interest using workbook-ish approximation: (annual rate / 365) * 31 * months const interestPerMonth = interestBase * ratePct / 365 * 31; const totalInterest = interestPerMonth * months; // Ops const totalOps = monthlyOps * months; // LTT const on = (lttMode === 'auto') ? onLTT(purchase) : lttManual; const lttTotal = toronto ? (on * 2) : on; // Selling const grossCommission = arv * commPct; const discountTotal = agentDiscountPerSide * 2; // per side const netCommission = Math.max(0, grossCommission – discountTotal); const sellingTotal = netCommission + saleClosing + saleOther; // Reno const renoTotal = reno + underpin; // Purchase costs (excluding purchase price) const purchaseCosts = purchaseClosing + lttTotal; // Total costs excluding purchase price const totalCostsExPurchase = purchaseCosts + renoTotal + totalOps + totalInterest + sellingTotal; // Profit const profit = arv – purchase – totalCostsExPurchase; // Cash needed estimate (workbook-style): down + purchase costs + reno + ops + interest // Note: financing fee is rolled into loan (so excluded from cash, included in interest base). const cashNeeded = downPayment + purchaseCosts + renoTotal + totalOps + totalInterest; // Render $('kProfit').textContent = fmt(profit); $('kProfit').className = 'v mono ' + (profit < 0 ? 'neg' : 'pos'); $('kCash').textContent = fmt(cashNeeded); $('kCosts').textContent = fmt(totalCostsExPurchase); $('kInterest').textContent = fmt(totalInterest); $('dLoan').textContent = fmt(loanBase); $('dFinFee').textContent = fmt(finFee); $('dLtt').textContent = fmt(lttTotal); $('dOps').textContent = fmt(totalOps); $('dSell').textContent = fmt(sellingTotal); $('dReno').textContent = fmt(renoTotal); } $('btnCalc').addEventListener('click', calc);