Every term, input and calculated figure used in this app: what it means, how the app calculates it, and its standard name in the real-estate finance literature.
Differs from textbookInconsistencyArchived“Differs from textbook” = the app deliberately calculates it another way (explained). “Inconsistency” = the label and the number behind it don’t match, or two places in the app disagree. “Archived” = no longer shown in the app, kept for reference. Code names are in small grey type.
What you buy, what it costs, and how it is paid for (bank loan, your cash, money you lend the company).
purchasePricenotary · notaryAutoCalcauto: Notary = 0.08 × Purchase priceagencyothertravauxfurniturecore.totalCost (TAC)TAC = Purchase price + Notary + Agency + Other + Travaux + Furniture (company cost = Purchase price + fees + declared works)estimateSellingPriceAfterTravauxauto: V₀ = Purchase priceapartmentSurfacedownPaymentloanAmount · loanAmountAutoCalc · computeAutoLoanAmountauto: L = Purchase price + Notary + Agency + Other − Down paymentUntil 2026-09-27 the auto loan was TAC − Down payment (works included), which left the works as unspent cash in the company account while the cash you put in also counted them. A loan saved with that rule keeps its stored amount until you switch “auto” off and on (the editor says so).interestRateloanTermYearsamortization[].paymentAnnual / paymentMonthlyPMT = L × i ÷ (1 − (1 + i)^−n); monthly = PMT ÷ 12Differs from textbookAnnual compounding, not a bank’s monthly schedule (i/12 over 12n months). Deliberate: it matches Gabriel’s reference calculator. For a real loan, the bank’s own monthly figures are used instead (see next rows).amortization[] (loan.ts)Interest = Opening × i; Principal = PMT − Interest; Closing = Opening − PrincipalloanPrincipalMonthly · loanInterestMonthlyProjection: Interest(t) = Opening(t) × i; Principal(t) = max(0, min((P + I) × 12 − Interest(t), Opening(t)))loanInsuranceMonthly · loanInsuranceAutoCalcauto: 0.0015 × L ÷ 12 per monthDiffers from textbookCounted as a cost like interest, and inside the loan payment / debt service. Textbook debt service is principal + interest only.core.equityPurchase price − LTextbook equity is value − loan; here it is price − loan, and the fees are shown on their own row.core.costNotary + Agency + Othercore.bankInjection · dynamicRoi[].dayOneCashBank injection = (Down payment + declared works) + L − (Purchase price + fees + declared works) = Down payment − (Equity + Purchase fees); account opening in year 1 = max(Bank injection, 0)core.ownerMoneyIntoSci · core.sciTotalCostDown payment + Declared travaux + Declared furniture + max(−Bank injection, 0); + L ≡ (Purchase price + fees + declared works) + max(Bank injection, 0)core.undeclaredWorks (splitWorks)max(Travaux − Declared travaux, 0) + max(Furniture − Declared furniture, 0)core.totalInvestment (TOTAL INVESTMENT)In general: E = Down payment + Declared works + Declared furniture + Undeclared works + max(−Bank injection, 0), with Undeclared = max(Travaux − Declared travaux, 0) + max(Furniture − Declared furniture, 0). When no declared amount exceeds the full one: E = Down payment + Travaux + Furniture + max(−Bank injection, 0) ≡ TAC − L + max(Bank injection, 0)Since 2026-09-25 the bank injection is no longer subtracted: it is your cash, kept in the company account and paid back at the sale. Since 2026-09-27 the auto loan no longer finances the works, so the works are counted once — in E — and never also as unspent cash in the company account.core.totalInvestment ÷ core.totalCostE ÷ TAC (= 1 − L ÷ TAC when no cash is left in the company account)Textbook LTV divides by value (V); this ratio uses the total cost.loansFromCompteCourant · loansFromCompteCourantAutoCalcauto: CCA = Down payment + Declared travaux + Declared furniture + max(−Bank injection, 0) (= Cash you put into the company)compteCourantInterestRatePctPerYearcompteCourantMaxDeductibleRatePctPerYear (portfolio setting, else property #1’s) · sciCcaDeductibleCap · dynamicRoi[].compteCourantInterestDeductibleDeductible interest = CC opening × min(CCA rate, cap); no cap: CC opening × CCA rate| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
1.Purchase pricein French: Prix d’achatpurchasePrice | Price paid to the seller, before notary fees. | P (price); V for value | Geltner et al. (2014); Brueggeman & Fisher |
2.Notary feesin French: Frais de notairenotary · notaryAutoCalc | Transfer taxes plus the notary’s fees. With “auto” on, estimated at 8 % of the purchase price. auto: Notary = 0.08 × Purchase price | FR: frais de notaire (droits de mutation + émoluments) — no symbol | CGI art. 1594 D (droits de mutation) |
3.Agency feein French: Frais d’agenceagency | Estate agent fee paid by the buyer (0 when the seller pays it). Counted in the total cost when the buyer pays it. | Acquisition costs — no symbol | Brueggeman & Fisher |
4.Other purchase costs (estimate)in French: Autres frais d’achat (estimation)other | Any other one-off purchase cost (bank file fees, guarantee, etc.). | Acquisition costs — no symbol | Brueggeman & Fisher |
5.Renovation works (travaux)in French: Travaux de rénovationtravaux | Renovation paid at purchase. The declared part is paid by the company, with cash you add on top of the down payment; for tax it is split into repairs (deducted in Year 1) and improvements (depreciated; 15 years by default, common practice — not a legal figure). The rest you pay personally, outside the company. All of it counts in the cash you put in; the bank loan never finances it in “auto” mode. | CapEx (capital expenditure / improvements) | Geltner et al. (2014) |
6.Furniturein French: Mobilierfurniture | Furniture bought for the rental. The declared part is paid by the company with cash you add and depreciated (7 years by default, common practice — not a legal figure; the €500 immediate-expense tolerance, BOI-BIC-CHG-20-30-10, does not cover a rental’s initial furnishing); the rest is paid by you personally. All of it counts in the cash you put in. | — (no standard symbol) | — |
7.Total purchase costin French: Coût total de l’opérationcore.totalCost (TAC) | Everything paid to acquire the property and make it rentable — by the company (price, fees, declared works) and by you personally (undeclared works). TAC = Purchase price + Notary + Agency + Other + Travaux + Furniture (company cost = Purchase price + fees + declared works) | Total acquisition cost / cost basis — no single symbol | Geltner et al. (2014); Brueggeman & Fisher |
8.Estimated value after worksin French: Valeur estimée après travauxestimateSellingPriceAfterTravaux | What the property is worth once the works are done: the starting value for all value growth. With “auto” on, equal to the purchase price. auto: V₀ = Purchase price | V₀ (property value at time 0) | Geltner et al. (2014) |
9.Surfacein French: SurfaceapartmentSurface | Living area in m². Only used to estimate the home insurance. | — (no standard symbol) | — |
10.Down paymentin French: ApportdownPayment | Cash paid upfront by the buyer (paid into the company). | Down payment; E (equity) when it is the whole equity | Brueggeman & Fisher |
11.Loan amountin French: Montant empruntéloanAmount · loanAmountAutoCalc · computeAutoLoanAmount | Bank loan. With “auto” on: the part of the price and purchase fees the down payment does not cover. The bank never finances the works or the furniture in “auto” mode. auto: L = Purchase price + Notary + Agency + Other − Down paymentUntil 2026-09-27 the auto loan was TAC − Down payment (works included), which left the works as unspent cash in the company account while the cash you put in also counted them. A loan saved with that rule keeps its stored amount until you switch “auto” off and on (the editor says so). | L (loan amount) | Geltner et al. (2014) |
12.Interest ratein French: Taux d’intérêtinterestRate | Yearly interest rate of the bank loan. | i (contract interest rate) | Brueggeman & Fisher; standard annuity notation |
13.Loan termin French: Durée du prêtloanTermYears | Length of the loan, in years. | n (term) | standard annuity notation |
14.Payment (yr)in French: Annuité (an)amortization[].paymentAnnual / paymentMonthly | Fixed yearly loan payment (interest + principal) of a hypothetical loan; the monthly figure is the yearly one ÷ 12. PMT = L × i ÷ (1 − (1 + i)^−n); monthly = PMT ÷ 12Differs from textbookAnnual compounding, not a bank’s monthly schedule (i/12 over 12n months). Deliberate: it matches Gabriel’s reference calculator. For a real loan, the bank’s own monthly figures are used instead (see next rows). | PMT (periodic payment); FR: annuité constante | standard annuity notation; FR: mensualité |
15.Opening balance · Interest (yr) · Principal (yr) · Closing balancein French: Capital restant dû en début d’année · Intérêts (an) · Capital remboursé (an) · Capital restant dû en fin d’annéeamortization[] (loan.ts) | The loan schedule, year by year. Year 1 opens at the full loan amount (“Month 0”). Interest = Opening × i; Principal = PMT − Interest; Closing = Opening − Principal | OLB (outstanding loan balance); I, P — FR: CRD (capital restant dû) | Geltner et al. (2014); Brueggeman & Fisher |
16.Principal per month (from your bank schedule) · Interest per month (from your bank schedule)in French: Capital remboursé par mois (selon votre tableau bancaire) · Intérêts par mois (selon votre tableau bancaire)loanPrincipalMonthly · loanInterestMonthly | For a loan that already exists: the principal and interest from the bank’s own schedule. When filled in they replace the computed Year-1 figures, and the 25-year projection keeps (principal + interest) × 12 as the fixed yearly payment. Projection: Interest(t) = Opening(t) × i; Principal(t) = max(0, min((P + I) × 12 − Interest(t), Opening(t))) | PMT, I, P (bank-stated) | Brueggeman & Fisher |
17.Loan insurance per monthin French: Assurance emprunteur par moisloanInsuranceMonthly · loanInsuranceAutoCalc | Borrower insurance required by the bank. With “auto” on: 0.15 % of the loan per year, flat for the whole loan. auto: 0.0015 × L ÷ 12 per monthDiffers from textbookCounted as a cost like interest, and inside the loan payment / debt service. Textbook debt service is principal + interest only. | FR: assurance emprunteur (TAEA) — not part of DS in the textbooks | Brueggeman & Fisher |
18.…of which: your share of the price (price − loan)in French: …dont votre part du prix (prix − emprunt)core.equity | The part of the price not financed by the bank. Purchase price − LTextbook equity is value − loan; here it is price − loan, and the fees are shown on their own row. | E = V − L | Geltner et al. (2014) |
19.…of which: purchase feesin French: …dont frais d’acquisitioncore.cost | One-off purchase fees paid in cash. Notary + Agency + Other | Acquisition / transaction costs — no symbol | Brueggeman & Fisher |
20.Cash left in the company account (not spent on the property)in French: Trésorerie laissée sur le compte de la société (non dépensée pour le bien)core.bankInjection · dynamicRoi[].dayOneCash | Cash genuinely left in the company account on day 1: what you put in plus the loan, minus what the company spends (price, fees, declared works). It opens the company account in year 1, earns interest there, and is paid back to you at the sale. When it is negative (the down payment falls short), you cover the gap yourself: it is added to the cash you put in and the account opens at €0. Bank injection = (Down payment + declared works) + L − (Purchase price + fees + declared works) = Down payment − (Equity + Purchase fees); account opening in year 1 = max(Bank injection, 0) | — (no standard symbol) | — |
21.Cash you put into the companyin French: Argent apporté à la sociétécore.ownerMoneyIntoSci · core.sciTotalCost | What you put INTO the company on day 1: the down payment, plus the declared works and furniture (added on top of it), plus any shortfall you cover. Sources = uses: this + the loan = the company’s cost (price + fees + declared works) + the cash left in its account. Down payment + Declared travaux + Declared furniture + max(−Bank injection, 0); + L ≡ (Purchase price + fees + declared works) + max(Bank injection, 0) | Equity contribution to the entity — no symbol | — |
22.Works + furniture you pay personally (not declared)in French: Travaux + mobilier payés personnellement (non déclarés)core.undeclaredWorks (splitWorks) | Works and furniture you do not declare: paid by you personally, outside the company. Not company cash, not a company cost, not deducted — but part of the cash you put in (a day-0 outflow in the returns). max(Travaux − Declared travaux, 0) + max(Furniture − Declared furniture, 0) | — (no standard symbol) | — |
23.Cash you put inin French: Argent investicore.totalInvestment (TOTAL INVESTMENT) | The cash you put into the deal at the start: what you put into the company plus the works you pay personally. It is the first injection of every “return on your cash”. Cash you add later to cover the company’s shortfalls (owner top-ups) comes on top of it. In general: E = Down payment + Declared works + Declared furniture + Undeclared works + max(−Bank injection, 0), with Undeclared = max(Travaux − Declared travaux, 0) + max(Furniture − Declared furniture, 0). When no declared amount exceeds the full one: E = Down payment + Travaux + Furniture + max(−Bank injection, 0) ≡ TAC − L + max(Bank injection, 0)Since 2026-09-25 the bank injection is no longer subtracted: it is your cash, kept in the company account and paid back at the sale. Since 2026-09-27 the auto loan no longer finances the works, so the works are counted once — in E — and never also as unspent cash in the company account. | E (initial equity investment) | Brueggeman & Fisher; Geltner et al. (2014) |
24.Cash you put in ÷ Total purchase costin French: Argent investi ÷ coût total de l’opérationcore.totalInvestment ÷ core.totalCost | Share of the total cost paid with your own cash. E ÷ TAC (= 1 − L ÷ TAC when no cash is left in the company account)Textbook LTV divides by value (V); this ratio uses the total cost. | Equity ratio = 1 − LTV; FR: quotité de financement = LTV | Geltner et al. (2014) |
25.Money you personally lend to the companyin French: Argent que vous prêtez personnellement à la sociétéloansFromCompteCourant · loansFromCompteCourantAutoCalc | Money you lend the company as a shareholder loan (compte courant d’associé): everything you put into it on day 1. It earns the CCA rate and is paid back tax-free at the sale. With “auto” on: the down payment plus the declared works and furniture (since 2026-09-27; it was the down payment alone), plus any shortfall you cover at purchase. auto: CCA = Down payment + Declared travaux + Declared furniture + max(−Bank injection, 0) (= Cash you put into the company) | FR: compte courant d’associé (shareholder loan) — no symbol | CGI art. 39-1-3° |
26.Interest rate on the money you lend the company (per year)in French: Taux d’intérêt sur l’argent prêté à la société (par an)compteCourantInterestRatePctPerYear | Interest the company pays you on that loan, on the year’s opening balance (earlier top-ups included). It is deducted from the company’s taxable profit, up to the deductible cap when one is set.Differs from textbookWith no cap (the default) the whole interest is deducted. The legal maximum deductible rate (CGI art. 39-1-3°) changes every quarter: enter it as the deductible cap (next row) to apply it. | — (no standard symbol) | CGI art. 39-1-3° |
27.Maximum deductible compte courant rate (legal cap)in French: Taux maximal de déductibilité des intérêts de compte courant (plafond légal)compteCourantMaxDeductibleRatePctPerYear (portfolio setting, else property #1’s) · sciCcaDeductibleCap · dynamicRoi[].compteCourantInterestDeductible | The highest compte courant interest rate the company may deduct from its taxable profit. You still receive the full interest; the part above the cap is simply not deductible. One cap for the whole company; empty = no cap. Deductible interest = CC opening × min(CCA rate, cap); no cap: CC opening × CCA rate | FR: taux maximum des intérêts déductibles (comptes courants d’associés) — no symbol | CGI art. 39-1-3° |
rentIncomeMonthlytravauxAndVacancyMonthscore.totalIncomeMonthly= Rent income per monthcore.totalIncomeAnnual (EffRent)EffRent = Rent per month × (12 − Months without rent)No “other income” (parking, laundry…) is modelled.dealEvaluation.chargesInRentMonthly · recoverableCharges (microFoncierInputs.ts)rent excluding charges = rent collected − charges included × months collectedrentGrowthPctPerYearRent₁ = EffRent; Rent(t) = Rent(t−1) × (1 + g)dynamicRoi[].rentEffRent × (1 + g)^(t−1)| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
28.Rent income per monthin French: Loyer par moisrentIncomeMonthly | Monthly rent in the lease (excluding service charges the tenant reimburses). | Contract rent | Brueggeman & Fisher |
29.Months per year without rent (works + vacancy)in French: Mois par an sans loyer (travaux + vacance locative)travauxAndVacancyMonths | Months per year with no rent: works at the start plus vacancy between tenants. Applied every year.Differs from textbookTextbooks express vacancy & credit loss as a % of potential gross income; here it is a number of months, with no separate unpaid-rent allowance. Costs still run for 12 months. | V&C (vacancy & credit loss) | Brueggeman & Fisher; CCIM Institute |
30.Rent per monthin French: Loyer par moiscore.totalIncomeMonthly | Monthly rent, as entered (no vacancy deducted). = Rent income per month | PGI ÷ 12 | Brueggeman & Fisher |
31.Rent per year (months actually rented)in French: Loyer par an (mois réellement loués)core.totalIncomeAnnual (EffRent) | Rent actually collected in a year. EffRent = Rent per month × (12 − Months without rent)No “other income” (parking, laundry…) is modelled. | EGI = PGI − V&C (+ other income) | Brueggeman & Fisher; Geltner et al. (2014) |
32.Charges included in the rentin French: Charges comprises dans le loyerdealEvaluation.chargesInRentMonthly · recoverableCharges (microFoncierInputs.ts) | The part of the monthly rent that pays you back for charges the tenant owes (their share of the building costs, water…). The “Is it a good deal?” page leaves it out of the yields, like published local figures. Under micro-foncier it is not rental income either: it is taken out of the rent before the 30% allowance and does not count toward the €15,000 cap, growing with the rent and following the same empty months. Entered once per property, in the editor (micro-foncier) or on the “Is it a good deal?” page. rent excluding charges = rent collected − charges included × months collected | FR: charges récupérables (provisions pour charges) | CGI art. 32 (micro-foncier: recettes brutes hors charges) |
33.Rent growth per yearin French: Hausse du loyer par anrentGrowthPctPerYear | Yearly rent increase in the 25-year projection. Default 1.4 % (INSEE rent index history). Rent₁ = EffRent; Rent(t) = Rent(t−1) × (1 + g) | g (growth rate) | Geltner et al. (2014); INSEE |
34.Rentin French: LoyerdynamicRoi[].rent | Collected rent of year t in the 25-year projection. EffRent × (1 + g)^(t−1) | EGI(t) | Brueggeman & Fisher |
condoSyndicFeesMonthlypropertyTaxMonthlyYear 1 = monthly × 12, then grows at its own rateauto: surface × 0.32 €/m² (< 30 m²), × 0.23 (30–70 m²), × 0.22 (> 70 m²), per monthutilitiesMonthlyaccountantFeesMonthlybankFeesMonthlysyndicGrowthPctPerYear · taxeFonciereGrowthPctPerYearCost(t) = Cost(t−1) × (1 + g)ReportView “Operation Expenses (Total OpEx)”OpEx = (Syndic + Utilities + Property tax + Home insurance + Accountant + Bank fees) × 12Differs from textbookNo property-management fee and no maintenance / replacement reserve are modelled, both usual in textbook OpEx. Only syndic and property tax grow in the projection.dynamicRoi[].otherFixedCosts(Home insurance + Accountant + Bank fees + Utilities + Loan insurance) × 12core.totalExpensesAnnual / Monthly; dynamicRoi[].totalExpensesOpEx + Loan interest + Loan insurance (monthly × 12 in year 1)ReportView “Total Outgoings”All costs + Loan principal (= OpEx + DS)ReportView “What you pay every month” (DebtService ÷ 12)DS = (Interest + Principal + Loan insurance) × 12InconsistencyIncludes loan insurance (textbook DS does not). This row reads the COMPUTED schedule even when real bank principal/interest are entered, while the rest of the report uses the bank figures, so the two can disagree for a real loan. Its Total column is the sum of the property columns (since 2026-09-27; it used to read the bank figures).ReportView TOTAL MONTHLY OBLIGATIONLoan payment + Syndic + Property tax + Home insurance + Accountant + Bank feesInconsistencyLeaves out Utilities, which “All cash out per month” includes. The two totals differ by the utilities amount (0 by default).| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
35.Building charges (syndic) per monthin French: Charges de copropriété (syndic) par moiscondoSyndicFeesMonthly | Co-ownership charges paid to the syndic.Differs from textbookThe full amount is treated as an owner cost. The part you can recover from the tenant (charges récupérables) is not netted out unless you enter only the non-recoverable part. | FR: charges de copropriété — part of OE | Décret n° 87-713 (charges récupérables) |
36.Property tax (taxe foncière) per monthin French: Taxe foncière par moispropertyTaxMonthly | Yearly property tax, entered per month. Year 1 = monthly × 12, then grows at its own rate | Property tax — part of OE (FR: taxe foncière) | CGI art. 1380 |
| 37.Home insurance per monthin French: Assurance du bien par mois | Insurance of the rented property, paid by the owner. Estimated from the surface until you type your own figure. auto: surface × 0.32 €/m² (< 30 m²), × 0.23 (30–70 m²), × 0.22 (> 70 m²), per month | FR: assurance PNO (propriétaire non occupant) — part of OE | Loi n° 65-557 art. 9-1 |
38.Utilities per monthin French: Eau, énergie et abonnements par moisutilitiesMonthly | Utilities paid by the owner. | Part of OE | Brueggeman & Fisher |
39.Accountant fees per monthin French: Honoraires de l’expert-comptable par moisaccountantFeesMonthly | Company accountant (expert-comptable). | Part of OE | Brueggeman & Fisher |
40.Bank fees per monthin French: Frais bancaires par moisbankFeesMonthly | Company bank account fees. | Part of OE | Brueggeman & Fisher |
41.Building charges growth per year · Property tax growth per yearin French: Hausse des charges de copropriété par an · Hausse de la taxe foncière par ansyndicGrowthPctPerYear · taxeFonciereGrowthPctPerYear | Yearly increase of syndic charges and property tax in the projection. The other running costs stay flat. Cost(t) = Cost(t−1) × (1 + g) | g (expense growth rate) | Geltner et al. (2014) |
42.Running costs per year (excl. loan) / Running costs per month (excl. loan)in French: Charges courantes par an (hors prêt) / Charges courantes par mois (hors prêt)ReportView “Operation Expenses (Total OpEx)” | Yearly running costs of the property, before the loan and before income tax. OpEx = (Syndic + Utilities + Property tax + Home insurance + Accountant + Bank fees) × 12Differs from textbookNo property-management fee and no maintenance / replacement reserve are modelled, both usual in textbook OpEx. Only syndic and property tax grow in the projection. | OE / OpEx (operating expenses); FR: charges d’exploitation | Brueggeman & Fisher; Geltner et al. (2014); CCIM Institute |
43.Other Fixedin French: Autres charges fixesdynamicRoi[].otherFixedCosts | The flat (non-growing) costs in the 25-year projection. (Home insurance + Accountant + Bank fees + Utilities + Loan insurance) × 12 | Part of OE (+ loan insurance) | Brueggeman & Fisher |
44.All costs per year (incl. loan interest) / All costs per month (incl. loan interest)in French: Toutes les charges par an (intérêts d’emprunt compris) / Toutes les charges par mois (intérêts d’emprunt compris)core.totalExpensesAnnual / Monthly; dynamicRoi[].totalExpenses | Running costs plus the cost of the loan (interest and loan insurance), excluding the principal repaid. OpEx + Loan interest + Loan insurance (monthly × 12 in year 1) | OE + I (no single symbol) | Brueggeman & Fisher |
45.All cash out per year (incl. loan repayment) / All cash out per month (incl. loan repayment)in French: Toutes les sorties d’argent par an (remboursement du prêt compris) / Toutes les sorties d’argent par mois (remboursement du prêt compris)ReportView “Total Outgoings” | All cash that leaves the company to hold the property. All costs + Loan principal (= OpEx + DS) | OE + DS | Brueggeman & Fisher; CCIM Institute |
46.Loan payment (interest + principal + insurance)in French: Mensualité du prêt (intérêts + capital + assurance)ReportView “What you pay every month” (DebtService ÷ 12) | Monthly loan payment including borrower insurance. × 12 = the yearly debt service. DS = (Interest + Principal + Loan insurance) × 12InconsistencyIncludes loan insurance (textbook DS does not). This row reads the COMPUTED schedule even when real bank principal/interest are entered, while the rest of the report uses the bank figures, so the two can disagree for a real loan. Its Total column is the sum of the property columns (since 2026-09-27; it used to read the bank figures). | DS (annual debt service); FR: service de la dette (annuités d’emprunt) | Brueggeman & Fisher; CCIM Institute |
47.Total per monthin French: Total par moisReportView TOTAL MONTHLY OBLIGATION | Everything you pay each month in the “What you pay every month” table. Loan payment + Syndic + Property tax + Home insurance + Accountant + Bank feesInconsistencyLeaves out Utilities, which “All cash out per month” includes. The two totals differ by the utilities amount (0 by default). | OE + DS (monthly) | Brueggeman & Fisher |
core.profitAnnual / profitMonthly; dynamicRoi[].profitProfit = EffRent − (OpEx + Interest + Loan insurance) (= NOI − I − insurance)Differs from textbookNot NOI: NOI stops before any loan cost. This is closer to taxable income before depreciation. The MONTHLY figure uses the full rent (no vacancy), so monthly × 12 ≠ yearly.core.cashFlowAnnual; dynamicRoi[].cashFlowCash flow = EffRent − All costs − Principal (= NOI − DS)core.cashFlowMonthlyRent per month − All costs per month − Principal per monthInconsistencyUses the full monthly rent (no vacancy), so × 12 is higher than the yearly cash flow by rent × months without rent. The verdict card and home page use the yearly figure.core.ofWhichKeptAsCashAnnual · ofWhichConvertedToEquityAnnualkept = Cash flow; paid down = Principal per month × 12ReportView “Return on Initial Investment, Year N”Profit(N) ÷ EDiffers from textbookTextbook cash-on-cash uses the cash flow (after principal): BTCF ÷ E. Using profit counts the principal repaid as return, so this is higher.staticSnapshot.cashOnCash · returnOnTotalCostWithLoan · returnOnTotalCostWithoutLoancashOnCash = Profit ÷ E; withLoan = Profit ÷ TAC; withoutLoan = (Profit + Interest + Loan insurance) ÷ TAC (= NOI ÷ TAC)Inconsistency“cashOnCash” is named after the textbook ratio but divides PROFIT, not BTCF, by E. “withoutLoan” is the net yield on cost.dynamicRoi[].reinvestmentBalanceOpening / reinvestmentBalanceClosing (portfolioTax.ts; sciCash.ts)Closing(t) = Opening(t) + Interest(t) + Cash flow(t) + CC cash effect(t) − IS(t) + Owner top-up(t); Opening(1) = max(Bank injection, 0); Opening(t) = Closing(t−1)returnOnReinvestedCashFlowPctPerYearfinancingCostPctPerYear (portfolio setting, else property #1’s) · resolveSciFinancingRate · financingCostBankLoansciFinancingRate > 0 · pooledInterest (sciCash.ts)B = Σ Opening(t) over the properties; if B < 0: interest = B × lender’s rate, attributed to the properties below €0 pro rata to their balancesdynamicRoi[].ownersTopUp / cumOwnersTopUp · compteCourant[].topUp (allocateOwnerTopUps)Top-up(t) = max(0, −Σ Closing before top-up(t)) when the rate is 0, split pro rata to each short property’s shortfall; 0 with a lendersiblingLoansByYear · maxBorrowedFromSiblings · maxLentToSiblings (sciCash.ts)borrowed(t) = −own × min(1, Σ positive ÷ Σ negative) if own < 0; lent(t) = own × min(1, Σ negative ÷ Σ positive) if own > 0; Σ borrowed = Σ lentdynamicRoi[].reinvestmentBalanceInterest (pooledInterest, sciCash.ts)B = Σ Opening(t). B ≥ 0: Interest_k = Opening_k × (B ÷ Σ positive openings) × rate on rent you keep if Opening_k > 0, else 0; B < 0: Interest_k = B × lender’s rate × Opening_k ÷ Σ negative openings if Opening_k < 0, else 0. One property: Opening × ratecumCashFlowNoInterest · cumCashFlowPreTaxWithInterestwith interest ≡ max(Bank injection, 0) + no interest + Σ account interest + Σ CC cash effect + Σ owner top-ups (= Closing + Σ IS)| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
48.Profit per year (income − costs, before tax) / Profit per month (income − costs, before tax)in French: Bénéfice par an (revenus − charges, avant impôt) / Bénéfice par mois (revenus − charges, avant impôt)core.profitAnnual / profitMonthly; dynamicRoi[].profit | Rent collected minus all costs including loan interest and insurance, before company tax. The principal repaid is not a cost here. Profit = EffRent − (OpEx + Interest + Loan insurance) (= NOI − I − insurance)Differs from textbookNot NOI: NOI stops before any loan cost. This is closer to taxable income before depreciation. The MONTHLY figure uses the full rent (no vacancy), so monthly × 12 ≠ yearly. | NOI − I (taxable income before depreciation) — no single symbol | Brueggeman & Fisher |
49.Rent kept after all costs per yearin French: Loyer restant après toutes les charges, par ancore.cashFlowAnnual; dynamicRoi[].cashFlow | Cash left from the rent after every cost and the full loan payment, before company tax. Cash flow = EffRent − All costs − Principal (= NOI − DS) | BTCF (before-tax cash flow); Geltner: PBTCF / EBTCF; FR: cash-flow avant impôt | Brueggeman & Fisher; CCIM Institute; Geltner et al. (2014) |
50.Rent kept after all costs per monthin French: Loyer restant après toutes les charges, par moiscore.cashFlowMonthly | Monthly version of the cash flow. Rent per month − All costs per month − Principal per monthInconsistencyUses the full monthly rent (no vacancy), so × 12 is higher than the yearly cash flow by rent × months without rent. The verdict card and home page use the yearly figure. | BTCF ÷ 12 (at full occupancy) | Brueggeman & Fisher |
51.…kept as cash · …used to pay down the loanin French: …conservé en trésorerie · …utilisé pour rembourser le prêtcore.ofWhichKeptAsCashAnnual · ofWhichConvertedToEquityAnnual | Splits the yearly profit into cash kept and loan principal repaid. kept = Cash flow; paid down = Principal per month × 12 | BTCF · equity build-up (amortization) | Brueggeman & Fisher |
52.Year-N profit as % of cash you put inin French: Bénéfice de l’année N en % de l’argent investiReportView “Return on Initial Investment, Year N” | One year’s profit divided by the cash you put in. Profit(N) ÷ EDiffers from textbookTextbook cash-on-cash uses the cash flow (after principal): BTCF ÷ E. Using profit counts the principal repaid as return, so this is higher. | CoC / EDR = BTCF ÷ E | Brueggeman & Fisher |
53.(not displayed) cashOnCash · returnOnTotalCost…in French: (non affiché) cashOnCash · returnOnTotalCost…staticSnapshot.cashOnCash · returnOnTotalCostWithLoan · returnOnTotalCostWithoutLoan | Year-1 ratios computed by the engine but shown nowhere in the UI. cashOnCash = Profit ÷ E; withLoan = Profit ÷ TAC; withoutLoan = (Profit + Interest + Loan insurance) ÷ TAC (= NOI ÷ TAC)Inconsistency“cashOnCash” is named after the textbook ratio but divides PROFIT, not BTCF, by E. “withoutLoan” is the net yield on cost. | CoC = BTCF ÷ E; net yield ≈ NOI ÷ cost | Brueggeman & Fisher |
54.Savings account for the rent you keep (below €0 = cash borrowed from your other properties or a lender)in French: Compte de réinvestissement du loyer conservé (sous 0 € = argent emprunté à vos autres biens ou à un prêteur)dynamicRoi[].reinvestmentBalanceOpening / reinvestmentBalanceClosing (portfolioTax.ts; sciCash.ts) | The company’s one bank account, shared by all its properties; each property’s row is the part of it that property generated. Cash kept earns interest, and the company tax (IS) is paid out of it at each year end. The company is never overdrawn: when it runs short, a short-term lender covers it (lender’s rate > 0) or you add the cash yourself (rate 0, owner top-ups). One property’s row can go below €0 when it borrows from the other properties, at 0 %. Closing(t) = Opening(t) + Interest(t) + Cash flow(t) + CC cash effect(t) − IS(t) + Owner top-up(t); Opening(1) = max(Bank injection, 0); Opening(t) = Closing(t−1) | Reinvestment / finance rate of the MIRR — no symbol | Brueggeman & Fisher |
55.Interest rate on rent you keepin French: Taux d’intérêt sur le loyer conservéreturnOnReinvestedCashFlowPctPerYear | What cash kept in the company earns per year. | Reinvestment rate (MIRR) | Brueggeman & Fisher |
56.Lender’s rate when the company runs short · “Lock this rate (switch off to edit it)”in French: Taux du prêteur quand la société manque de trésorerie · « Verrouiller ce taux (désactivez pour le modifier) »financingCostPctPerYear (portfolio setting, else property #1’s) · resolveSciFinancingRate · financingCostBankLoan | One rate for the whole company. Above 0 %: a short-term lender lends the company what it is short, at this rate, and you add no cash later. 0 % or empty: you add the cash yourself (owner top-ups). The switch next to it only locks the field; the engine never copies the bank loan’s rate into it. | Finance rate (MIRR) | Brueggeman & Fisher |
57.Short-term lenderin French: Prêteur à court termesciFinancingRate > 0 · pooledInterest (sciCash.ts) | With a lender’s rate above 0 %, the company’s net balance may go below €0: a lender covers it and the company pays that rate on it (a deductible cost). The debt is settled out of the sale proceeds; you add nothing before the sale. B = Σ Opening(t) over the properties; if B < 0: interest = B × lender’s rate, attributed to the properties below €0 pro rata to their balances | Finance rate (MIRR); FR: crédit de trésorerie | Brueggeman & Fisher |
58.Cash you added to cover shortfallsin French: Argent ajouté pour combler les manques de trésoreriedynamicRoi[].ownersTopUp / cumOwnersTopUp · compteCourant[].topUp (allocateOwnerTopUps) | With the lender’s rate at 0 %: the cash you add when the whole company account would close below €0 — exactly enough to bring it back to €0, attributed to the properties that are short. It joins your compte courant: it earns the CCA rate from the next year and is repaid tax-free at the sale. Top-up(t) = max(0, −Σ Closing before top-up(t)) when the rate is 0, split pro rata to each short property’s shortfall; 0 with a lender | Equity contributions (capital calls) | Geltner et al. (2014) |
59.Borrowed from / lent to your other propertiesin French: Emprunté à / prêté à vos autres bienssiblingLoansByYear · maxBorrowedFromSiblings · maxLentToSiblings (sciCash.ts) | Inside the one company account, a property whose own row is below €0 uses the other properties’ cash, at 0 % interest. The company total is unaffected; the lending properties earn interest on less cash by the same amount. borrowed(t) = −own × min(1, Σ positive ÷ Σ negative) if own < 0; lent(t) = own × min(1, Σ negative ÷ Σ positive) if own > 0; Σ borrowed = Σ lent | — (no standard symbol) | — |
60.Interest earned (or paid) on the rent you keepin French: Intérêts gagnés (ou payés) sur le loyer conservédynamicRoi[].reinvestmentBalanceInterest (pooledInterest, sciCash.ts) | Interest earned (or paid to the short-term lender) on the company account that year, on the company’s NET balance: a property below €0 pays nothing to its siblings, and the properties in credit earn on their share of the net cash. Taxable (or deductible). B = Σ Opening(t). B ≥ 0: Interest_k = Opening_k × (B ÷ Σ positive openings) × rate on rent you keep if Opening_k > 0, else 0; B < 0: Interest_k = B × lender’s rate × Opening_k ÷ Σ negative openings if Opening_k < 0, else 0. One property: Opening × rate | — (no standard symbol) | — |
61.Rent kept after all costs so far · Savings account before company tax (incl. interest)in French: Cash-flow cumulé (sans intérêts) · Cash-flow cumulé (avec intérêts)cumCashFlowNoInterest · cumCashFlowPreTaxWithInterest | Running total of the yearly cash flows (no interest), and the company account with the company tax paid so far added back (with interest). with interest ≡ max(Bank injection, 0) + no interest + Σ account interest + Σ CC cash effect + Σ owner top-ups (= Closing + Σ IS) | Σ BTCF | Brueggeman & Fisher |
dynamicRoi[].marketValueV₁ = V₀; V(t) = V(t−1) × (1 + g)annualAppreciationRatedynamicRoi[].endOfYearAppreciationGainV(t) × (1 + g) − V₀dynamicRoi[].dayOneEquity (Day-1 Equity)(Purchase price − L) + (V₀ − Purchase price) = V₀ − LInconsistencyThe label says “price − loan” but the value also includes the value added by the works (V₀ − price). Same thing only when V₀ = price.dynamicRoi[].cumEquityFromLoanΣ Principal(t)dynamicRoi[].cumEquityDay-1 equity + Σ Principal (= V₀ − OLB(t))dynamicRoi[].propertyNetworth (Property Networth)Equity + Appreciation (end of year) + Account before IS (= V_end − OLB(t) + Closing(t) + Σ IS)Before selling costs and before any tax. It contains the bank injection kept in the account and your top-ups (both also counted in what you put in).roiAfterSale[].propertyNetworthAfterISProperty Networth − Σ IS (= V_end − OLB(t) + Closing(t))| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
62.Market Valuein French: Valeur de marchédynamicRoi[].marketValue | Property value in the projection. Year 1 is the value after works; it then grows every year. V₁ = V₀; V(t) = V(t−1) × (1 + g) | V(t) | Geltner et al. (2014) |
63.Property value growth per yearin French: Revalorisation du bien par anannualAppreciationRate | Yearly property value growth. Default 2.2 % (INSEE). | g (appreciation / capital growth rate) | Geltner et al. (2014); INSEE |
64.Property value increasein French: Revalorisation du biendynamicRoi[].endOfYearAppreciationGain | Value gained since the works were done, measured at the END of year t. V(t) × (1 + g) − V₀ | Capital appreciation (capital return) | Geltner et al. (2014) |
65.Equity on day one (price − loan)in French: Fonds propres au jour 1 (prix − emprunt)dynamicRoi[].dayOneEquity (Day-1 Equity) | Your share of the property on day one. (Purchase price − L) + (V₀ − Purchase price) = V₀ − LInconsistencyThe label says “price − loan” but the value also includes the value added by the works (V₀ − price). Same thing only when V₀ = price. | E₀ = V₀ − L₀ | Geltner et al. (2014) |
66.Loan paid off (equity built) (calc page)in French: Capital remboursé (fonds propres constitués) (page de calcul)dynamicRoi[].cumEquityFromLoan | Principal repaid so far: the part of the loan you now own. Σ Principal(t) | Equity build-up (loan amortization) | Brueggeman & Fisher |
67.Your equity (Day-1 equity + loan paid off) (wealth-chart segment)in French: Vos fonds propres (jour 1 + capital remboursé) (segment du graphique du patrimoine)dynamicRoi[].cumEquity | Blue segment of the “Your wealth over time” charts: the day-one equity plus the loan paid off so far — larger than the “loan paid off” calc page, which is Σ principal only. Day-1 equity + Σ Principal (= V₀ − OLB(t)) | E = V − L (at V₀) | Geltner et al. (2014) |
68.What the property is worth to you (unsold, before tax)in French: Ce que vaut le bien pour vous (non vendu, avant impôt)dynamicRoi[].propertyNetworth (Property Networth) | What you would own at the end of year t if you kept the property: property value minus the loan still owed, plus the company account with the company tax paid so far added back. Equity + Appreciation (end of year) + Account before IS (= V_end − OLB(t) + Closing(t) + Σ IS)Before selling costs and before any tax. It contains the bank injection kept in the account and your top-ups (both also counted in what you put in). | Equity position (V − L) + cash — no single symbol | Geltner et al. (2014) |
69.What the property is worth to you after company taxin French: Ce que vaut le bien pour vous après ISroiAfterSale[].propertyNetworthAfterIS | Same, after the company tax paid so far: the property net of its loan, plus the cash really in the company account. Property Networth − Σ IS (= V_end − OLB(t) + Closing(t)) | — (no standard symbol) | — |
The company is taxed at corporate tax (IS). Profits of every property in a portfolio are pooled in one tax calculation.
computeIS · isAnnual (PortfolioSettings)IS(x) = 15 % × min(x, 42 500 €) + 25 % × max(x − 42 500 €, 0), x ≥ 0The 15 % rate assumes the company meets the small-business conditions (CGI art. 219 I-b).depreciation.ts · depreciationRatePctPerYear · improvementsDepreciationYears · furnitureDepreciationYearsD(t) = min(rate × Purchase price, building basis left) + min(Improvements ÷ N_improvements, their basis left) + min(Declared furniture ÷ N_furniture, its basis left)Differs from textbookThe building base is the whole purchase price, land included (pick a lower rate for the land, which is not depreciable); tax law also splits a building into components. Improvements and furniture are capitalised and depreciated (CGI art. 39-1-2°), repairs are general expenses (CGI art. 39-1-1°) — BOI-BIC-CHG-20-20-10/20; the €500 immediate-expense tolerance (BOI-BIC-CHG-20-30-10) does not cover a rental’s initial furnishing. The default lives (15 and 7 years) are common practice, not legal figures.cumulativeDepreciation · netBookValueNBV = Purchase price + Declared improvements + Declared furniture − Σ Dcore.totalInvestmentFees (TOTAL INVESTMENT FEES)Notary + Agency + Other + Declared repairsAcquisition fees may legally be expensed at once (CGI ann. III art. 38 quinquies). Since 2026-09-27 the declared IMPROVEMENTS and the declared furniture are no longer expensed here: they are depreciated (see Depreciation). Only repairs that keep the property in use are deductible at once, as general expenses (CGI art. 39-1-1°; BOI-BIC-CHG-20-20-10).declaredTravaux · declaredRepairs · declaredFurnitureImprovements = Declared works − Declared repairsdynamicRoi[].taxableProfitProfit − Deductible CCA interest + Account interest − Depreciation; Deductible CCA interest = CC opening × min(CCA rate, cap)isAtExit[].operatingPoolThroughYear (portfolio-wide returnMinusFees)Pool₁ = Σ Taxable profit₁ − Deductible fees; Pool(t) = Pool(t−1) + Σ Taxable profit(t)Loss carry-forward is unlimited and uncapped (the legal cap is €1M + 50 % of the excess per year, which doesn’t matter at this scale).isOnPool · priorHighWaterMarks (lossCarryForward.ts)Base(t) = max(0, Pool(t) − HWM(t−1)); IS split between properties in proportion to positive taxable profitisAtExit[].highestPoolBefore (priorHighWaterMarks)HWM(t−1) = max(0, Pool(1), …, Pool(t−1)); loss carried forward after year t = max(HWM(t−1), Pool(t)) − Pool(t)dynamicRoi[].cumISTaxΣ IS(t)sellingCost[].capitalGainGross sale price − Selling agency fee − Loan payoff costs − Net book valueisAtExit[].poolWithSalePool(N) + Capital gain(N)isAtExit[].cumIsAtExitCompany (or a single property): Σ IS(1…N−1) + IS(max(0, Pool with sale(N) − HWM(N−1))); one of several: Σ own IS(1…N) + its share of the IS on gainsisAtExit[].isOnCapitalGainDisplay (Sale IS; allocateIsAtExit)Company: IS at exit(N) − IS operating(N); per property: its Shapley share of that (Σ shares = the company figure)shapleySumGame (shapley.ts) · splitMethod · shapleyOrdersShare_k = average over every order of [tax(the properties before k, plus k) − tax(the properties before k)]; exact up to 16 properties with a gain or loss, else the average over 4,096 fixed-seed random ordersCOMPTE_COURANT_INTEREST_TAX_RATE = 0.314impotRateOnExitDistribution (portfolio setting, else property #1’s) · resolveSciExitDistributionRateroiAfterSale[].oneTimeImpotOnExitDistribution (allocateExitDistributionTax)Company: rate × max(Σ (TD − CCA owed), 0); single property: rate × max(TD − CCA owed, 0); one of several: its Shapley share of the company figure| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
70.Company tax (IS)in French: IS de l’annéecomputeIS · isAnnual (PortfolioSettings) | French corporate tax: a reduced rate on the first slice of profit, the normal rate above. IS(x) = 15 % × min(x, 42 500 €) + 25 % × max(x − 42 500 €, 0), x ≥ 0The 15 % rate assumes the company meets the small-business conditions (CGI art. 219 I-b). | FR: IS (impôt sur les sociétés); T (taxes) | CGI art. 219 I; BOFiP BOI-IS-LIQ; Brueggeman & Fisher |
71.Wear-and-tear deduction (depreciation: building, improvements, furniture)in French: Amortissement comptable (bâti, travaux, mobilier)depreciation.ts · depreciationRatePctPerYear · improvementsDepreciationYears · furnitureDepreciationYears | Yearly tax deduction for three assets wearing out, straight-line from Year 1 with a full year’s charge: the building (default rate 2 % of the purchase price, also for a property saved before the field existed), the declared improvement works (over 15 years by default) and the declared furniture (over 7 years by default). Each line stops once its own cost is written off. D(t) = min(rate × Purchase price, building basis left) + min(Improvements ÷ N_improvements, their basis left) + min(Declared furniture ÷ N_furniture, its basis left)Differs from textbookThe building base is the whole purchase price, land included (pick a lower rate for the land, which is not depreciable); tax law also splits a building into components. Improvements and furniture are capitalised and depreciated (CGI art. 39-1-2°), repairs are general expenses (CGI art. 39-1-1°) — BOI-BIC-CHG-20-20-10/20; the €500 immediate-expense tolerance (BOI-BIC-CHG-20-30-10) does not cover a rental’s initial furnishing. The default lives (15 and 7 years) are common practice, not legal figures. | D (depreciation); FR: DAP (dotation aux amortissements) | Brueggeman & Fisher; CGI art. 39-1-2°; BOFiP BOI-BIC-AMT, BOI-BIC-CHG-20-20-10/20, BOI-BIC-CHG-20-30-10 |
72.Wear-and-tear deducted so far · Net Book Valuein French: Amortissements cumulés · valeur nette comptablecumulativeDepreciation · netBookValue | Depreciation taken so far, and what is left on the books of the building, the declared improvements and the declared furniture. The capital gain at sale is measured against it. NBV = Purchase price + Declared improvements + Declared furniture − Σ D | Adjusted basis; FR: VNC (valeur nette comptable) | Brueggeman & Fisher |
73.Deducted in year 1 (fees + declared repairs)in French: Déduit en année 1 (frais + réparations déclarées)core.totalInvestmentFees (TOTAL INVESTMENT FEES) | What the company deducts in full from its Year-1 taxable profit: the acquisition fees and the declared repairs. Notary + Agency + Other + Declared repairsAcquisition fees may legally be expensed at once (CGI ann. III art. 38 quinquies). Since 2026-09-27 the declared IMPROVEMENTS and the declared furniture are no longer expensed here: they are depreciated (see Depreciation). Only repairs that keep the property in use are deductible at once, as general expenses (CGI art. 39-1-1°; BOI-BIC-CHG-20-20-10). | FR: frais d’acquisition (charge ou immobilisation) — no symbol | CGI ann. III art. 38 quinquies (fees option); CGI art. 39-1-1°; BOI-BIC-CHG-20-20-10 |
74.…declared to the tax office · …declared: repairs & maintenance (deducted in year 1) · …declared: improvements (depreciated)in French: …déclarés au fisc · …déclarés : réparations et entretien (déduits en année 1) · …déclarés : travaux d’amélioration (amortis)declaredTravaux · declaredRepairs · declaredFurniture | The part of works / furniture you can justify with invoices: the company pays it (with cash you add on top of the down payment, which joins your compte courant). The declared works are split in two for tax: repairs & maintenance (deducted in Year 1) and improvements (depreciated); declared furniture is depreciated. The rest is paid by you personally, outside the company. A property saved before the split: all its declared works count as improvements (the conservative reading). Improvements = Declared works − Declared repairs | FR: charges (réparations, entretien) vs immobilisations (améliorations) — no symbol | CGI art. 39-1-1° (repairs) and 39-1-2° (improvements, furniture); BOI-BIC-CHG-20-20-10/20; BOI-BIC-CHG-20-30-10 |
75.Profit after allowed deductionsin French: Bénéfice après déductions autoriséesdynamicRoi[].taxableProfit | The year’s profit as the tax office counts it. Profit − Deductible CCA interest + Account interest − Depreciation; Deductible CCA interest = CC opening × min(CCA rate, cap) | Taxable income; FR: résultat fiscal | Brueggeman & Fisher |
76.Profit the tax office sees (cumulative)in French: Bénéfice vu par le fisc (cumulé)isAtExit[].operatingPoolThroughYear (portfolio-wide returnMinusFees) | Running total of taxable profit, minus the deductible fees in year 1. Losses carry forward automatically. Pool₁ = Σ Taxable profit₁ − Deductible fees; Pool(t) = Pool(t−1) + Σ Taxable profit(t)Loss carry-forward is unlimited and uncapped (the legal cap is €1M + 50 % of the excess per year, which doesn’t matter at this scale). | NOL carry-forward; FR: déficit reportable | CGI art. 209 I |
77.Taxable Base (loss carried forward)in French: Base imposable (déficit reporté)isOnPool · priorHighWaterMarks (lossCarryForward.ts) | The amount actually taxed this year: how far the pool rises above the highest pool reached before (never below €0). A loss is carried forward until the pool is back above that level. Base(t) = max(0, Pool(t) − HWM(t−1)); IS split between properties in proportion to positive taxable profit | — (no standard symbol) | — |
78.Highest pool so far (loss carried forward)in French: Plus haut cumul atteint (déficit reporté)isAtExit[].highestPoolBefore (priorHighWaterMarks) | The highest level the cumulative pool reached before this year, never below €0. Tax is due only on what takes the pool above it, so a loss made after the pool was positive is carried forward instead of being lost. HWM(t−1) = max(0, Pool(1), …, Pool(t−1)); loss carried forward after year t = max(HWM(t−1), Pool(t)) − Pool(t) | NOL carry-forward; FR: déficit reportable | CGI art. 209 I |
79.Company tax paid so farin French: IS cumulédynamicRoi[].cumISTax | Company tax paid while holding the property. Σ IS(t) | Σ T | Brueggeman & Fisher |
80.Profit on the sale (capital gain)in French: Bénéfice sur la vente (plus-value)sellingCost[].capitalGain | Taxable gain if sold at the end of year N. Gross sale price − Selling agency fee − Loan payoff costs − Net book value | Capital gain = sale price − selling costs − adjusted basis; FR: plus-value professionnelle | Brueggeman & Fisher; CGI art. 39 duodecies |
81.Profit the tax office sees, including the salein French: Bénéfice vu par le fisc, vente compriseisAtExit[].poolWithSale | Cumulative pool plus the capital gain of a sale that year. Pool(N) + Capital gain(N) | — (no standard symbol) | — |
82.Total company tax if you sell in year Nin French: IS total si vous vendez en année NisAtExit[].cumIsAtExit | All company tax if you sell in year N: tax on the earlier years plus tax on year N including the sale. For one property of several: its own company tax through year N plus its fair share of the tax on the sale gains. Company (or a single property): Σ IS(1…N−1) + IS(max(0, Pool with sale(N) − HWM(N−1))); one of several: Σ own IS(1…N) + its share of the IS on gains | — (no standard symbol) | — |
83.Company tax on the sale profit · Company tax credit on the sale (its loss lowers the tax on the others’ gains)in French: IS sur la plus-value de cession · Crédit d’IS sur la vente (sa moins-value réduit l’impôt sur les plus-values des autres)isAtExit[].isOnCapitalGainDisplay (Sale IS; allocateIsAtExit) | Extra company tax caused by the sale in year N. With several properties, the company’s one tax on all the sale gains is split as a fair share (Shapley): a property sold at a loss can get a negative share (≤ 0) — a credit when the others have a taxable gain its loss lowers; 0 when there is nothing to lower. Company: IS at exit(N) − IS operating(N); per property: its Shapley share of that (Σ shares = the company figure) | Tax on sale; FR: IS sur plus-value | Brueggeman & Fisher |
84.Fair share (all orders averaged)in French: Part équitable (moyenne de tous les ordres)shapleySumGame (shapley.ts) · splitMethod · shapleyOrders | How a company-wide tax (the IS on the sale gains, the exit tax) is split between the properties: add them one at a time in every possible order, note the tax each one adds, and average. The shares add up exactly to the company total; a property that lowers the tax gets a negative share (a credit). Share_k = average over every order of [tax(the properties before k, plus k) − tax(the properties before k)]; exact up to 16 properties with a gain or loss, else the average over 4,096 fixed-seed random orders | Shapley value (cooperative game theory) | Shapley (1953) |
85.Your personal tax on that interest (31.4%)in French: Votre impôt personnel sur ces intérêts (31,4 %)COMPTE_COURANT_INTEREST_TAX_RATE = 0.314 | Flat tax you pay personally on the interest the company pays you (hard-coded).InconsistencyBoth this 31.4 % and the 30 % exit-tax default are meant to be the flat tax on capital income; they disagree, so one of them is out of date (check the current social-levy rate). | FR: PFU / flat tax (12.8 % income tax + social levies) | CGI art. 200 A |
86.Tax rate on money you take out at salein French: Taux d’imposition de l’argent distribué à la reventeimpotRateOnExitDistribution (portfolio setting, else property #1’s) · resolveSciExitDistributionRate | Personal tax on the money the company pays out after the sale, beyond repaying your compte courant. One rate for the whole company. Default 30 %. | FR: PFU on dividends / boni de liquidation | CGI art. 200 A |
87.Exit tax (on the payout) · Exit-tax credit: this property’s share of the tax saved by the company’s pooled repayment (its shortfall — money at sale below what it is owed — is covered by the others’ surplus before anything is taxed)in French: Impôt sur la distribution (à la sortie) · Crédit d’impôt sur la distributionroiAfterSale[].oneTimeImpotOnExitDistribution (allocateExitDistributionTax) | That tax, in euros. The company pays one exit tax on its total payout above everything it owes you; each property carries its fair share (Shapley). A property whose money at sale is below what it is owed can get a negative share (≤ 0): a credit when the others have a surplus its shortfall absorbs before anything is taxed; 0 when they have none. Company: rate × max(Σ (TD − CCA owed), 0); single property: rate × max(TD − CCA owed, 0); one of several: its Shapley share of the company figure | — (no standard symbol) | — |
yearOfRequiredReturnsellingCost[].grossSalePriceV(N) × (1 + g) (= V₀ × (1 + g)^N)sellingAgencyFeePct · sellingAgencyFeeAmountGross sale price × fee %loanPayoffFeePct · loanPayoffFeeAmountRemaining loan balance × fee %One percentage covers both the early-repayment penalty (IRA) and the release fee (mainlevée), which in practice are computed differently.sellingCost[].remainingLoanBalancesellingAgencyFeeAmount + loanPayoffFeeAmountsellingCost[].netSaleProceedsBeforeTax (Net Sale Proceeds)NSP = Gross sale price − Selling agency fee − Loan payoff costs − Remaining loanroiAfterSale[].compteCourantLoanOwed= CC closing balance of year N = CCA + Σ Net reinjection + Σ Owner top-upsroiAfterSale[].totalDistributableAtExit (Total Distributable)TD = NSP + Account before IS − Total company tax if you sell (= NSP + Closing(N) + Σ IS(1…N) − Cum. IS at exit)roiAfterSale[].netCashToAssociates (Net Cash to Associates; ccaRepayment)Company: Σ TD − rate × max(Σ TD − Σ CCA owed, 0); single property: min(TD, CCA owed) + max(TD − CCA owed, 0) × (1 − rate); one of several: TD − its exit-tax shareroiAfterSale[].netGainVsTotalInvestmentNet cash − E − Σ Owner top-ups(1…N)breakevenYear (computeBreakevenYear)first N with Net cash(N) ≥ E + Σ Owner top-ups(1…N) (Net gain ≥ 0)Differs from textbookTextbook payback adds up the yearly cash flows without selling. This one assumes a sale, after all taxes.| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
88.Year you plan to sellin French: Année de revente prévueyearOfRequiredReturn | The year used for the headline numbers (verdict card, home page). Clamped to 1–25. | N (holding period) | Geltner et al. (2014) |
89.Gross Sale Pricein French: Prix de vente brutsellingCost[].grossSalePrice | Sale price if sold at the end of year N. V(N) × (1 + g) (= V₀ × (1 + g)^N) | V(N) (reversion / sale price) | Geltner et al. (2014); Brueggeman & Fisher |
90.Selling agency fee (% of sale price)in French: Frais d’agence à la revente (% du prix de vente)sellingAgencyFeePct · sellingAgencyFeeAmount | Estate agent fee when you sell. Default 5 %. Gross sale price × fee % | Selling expenses | Brueggeman & Fisher |
91.Loan payoff costs (release fee + early-repayment penalty)in French: Frais de remboursement du prêt (mainlevée + indemnités de remboursement anticipé)loanPayoffFeePct · loanPayoffFeeAmount | Cost of repaying the loan early. Default 1 % of the balance. Remaining loan balance × fee %One percentage covers both the early-repayment penalty (IRA) and the release fee (mainlevée), which in practice are computed differently. | Prepayment penalty; FR: IRA (indemnités de remboursement anticipé) + mainlevée | Code de la consommation art. R313-25 |
92.Remaining Loan Balancein French: Capital restant dûsellingCost[].remainingLoanBalance | Loan still owed at the end of year N, repaid from the sale. | OLB(N) (outstanding loan balance); FR: CRD(N) | Brueggeman & Fisher |
93.Sale costs (agency fee + loan payoff costs)in French: Frais de cession (agence + frais de remboursement du prêt)sellingAgencyFeeAmount + loanPayoffFeeAmount | Chart segment: both sale fees together. | Selling expenses | Brueggeman & Fisher |
94.What the sale leaves after the loan and feesin French: Ce que laisse la vente après l’emprunt et les fraissellingCost[].netSaleProceedsBeforeTax (Net Sale Proceeds) | Cash from the sale once the loan and the fees are paid, before any tax. NSP = Gross sale price − Selling agency fee − Loan payoff costs − Remaining loan | BTER (before-tax equity reversion); NSP | Brueggeman & Fisher |
95.Money the company still owes you at salein French: Argent que la société vous doit encore à la reventeroiAfterSale[].compteCourantLoanOwed | Your compte courant at the sale: the starting loan, plus the after-tax interest you lent back, plus your owner top-ups. Repaid first and tax-free. = CC closing balance of year N = CCA + Σ Net reinjection + Σ Owner top-ups | — (no standard symbol) | — |
96.Money available at sale (before exit tax)in French: Argent disponible à la revente (avant impôt sur la distribution)roiAfterSale[].totalDistributableAtExit (Total Distributable) | All the cash the company holds after the sale and after company tax (the bank injection kept in the account included). TD = NSP + Account before IS − Total company tax if you sell (= NSP + Closing(N) + Σ IS(1…N) − Cum. IS at exit) | ≈ ATER + retained after-tax cash flow — no single symbol | Brueggeman & Fisher |
97.Cash you walk away with (after all taxes)in French: Ce qui vous reste en poche (après tous les impôts)roiAfterSale[].netCashToAssociates (Net Cash to Associates; ccaRepayment) | What reaches you personally: your compte courant repaid tax-free first, then the rest after exit tax. The repayment is pooled: the company repays every property’s compte courant out of its total money at sale, so one property’s shortfall is covered by the others’ surplus. Company: Σ TD − rate × max(Σ TD − Σ CCA owed, 0); single property: min(TD, CCA owed) + max(TD − CCA owed, 0) × (1 − rate); one of several: TD − its exit-tax share | ATER (after-tax equity reversion), at investor level | Brueggeman & Fisher |
98.Net Gain vs. Total Investmentin French: Gain net par rapport à l’investissement totalroiAfterSale[].netGainVsTotalInvestment | Cash you walk away with minus all the cash you put in, top-ups included (no time value). Net cash − E − Σ Owner top-ups(1…N) | — (no standard symbol) | — |
99.Year you get your money backin French: Année où vous récupérez l’argent investibreakevenYear (computeBreakevenYear) | First year in which selling would give you back at least the cash you put in (top-ups included), after all taxes. first N with Net cash(N) ≥ E + Σ Owner top-ups(1…N) (Net gain ≥ 0)Differs from textbookTextbook payback adds up the yearly cash flows without selling. This one assumes a sale, after all taxes. | Payback period — no standard symbol; FR: délai de récupération | Brueggeman & Fisher |
compteCourant[].interestEarnedOpening balance (earlier top-ups included) × CCA ratecompteCourant[].netReinjectionInterest × (1 − 31.4 %); Closing = Opening + Net reinjection + Owner top-upcompteCourant[].closingBalancedynamicRoi[].compteCourantCashEffect (Compte-Courant Cash Effect)Net reinjection − Interest ≡ −(your personal tax on the interest)InconsistencyThe label names the interest, but the value is only the tax part: negative, or 0 when the CCA rate is 0.loansFromCompteCourant (chart segment)computeCompteCourantArbitrage (portfolio.ts)Net gain(rate) − Net gain(0 %)| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
100.Interest the company paid you (cumulative, before tax)in French: Intérêts versés par la société (cumulés, avant impôt)compteCourant[].interestEarned | Interest the company pays you each year, before your tax. Opening balance (earlier top-ups included) × CCA rate | — (no standard symbol) | — |
101.Net Reinjectionin French: Réinjection nettecompteCourant[].netReinjection | That interest after your personal tax, lent straight back to the company. Your owner top-ups join the same balance. Interest × (1 − 31.4 %); Closing = Opening + Net reinjection + Owner top-up | — (no standard symbol) | — |
102.Balance the company owes youin French: Solde que la société vous doitcompteCourant[].closingBalance | Total the company owes you at year end. | — (no standard symbol) | — |
103.Interest paid to you by the companyin French: Intérêts versés par la sociétédynamicRoi[].compteCourantCashEffect (Compte-Courant Cash Effect) | Net effect on the company’s cash: interest paid out, minus what you lend straight back. Net reinjection − Interest ≡ −(your personal tax on the interest)InconsistencyThe label names the interest, but the value is only the tax part: negative, or 0 when the CCA rate is 0. | — (no standard symbol) | — |
104.Money you lent the company at the startin French: Argent prêté à la société au départloansFromCompteCourant (chart segment) | Starting balance of the shareholder loan, shown as its own chart segment. | — (no standard symbol) | — |
105.Does lending to your company pay off? (with vs. without)in French: Prêter à votre société est-il rentable ? (avec ou sans)computeCompteCourantArbitrage (portfolio.ts) | Net gain at the chosen rate, minus the same with the rate forced to 0 %. The whole portfolio (company tax, account, top-ups) is recomputed for both. Net gain(rate) − Net gain(0 %) | — (no standard symbol) | — |
A furnished rental you own yourself, not through a company: the rent is taxed in your own income tax, after the real costs and the wear-and-tear of the building and the furniture. These are the words behind the LMNP report and its "Where the money goes" page (one owner, a personal rental account, the tax office).
computeLmnpAccount · LmnpAccountYear (lmnpAccount.ts)Closing = Opening + interest after the flat tax + rent kept after costs − income tax − social contributions + CSG tax back + top-upLmnpReelYearResult.incomeTax · lmnpTmiTaxable result × your income tax bracket (TMI)LmnpReelYearResult.social · TaxConfig.lmnp.socialRateTaxable result × social levies rate (TaxConfig)csgDeductibleNextYear · taxSavingNextYear · taxCreditReceivedTaxable result × 6.8 % × your income tax bracket, received the next yearLmnpAccountYear.interestTax · TaxConfig.lmnp.savingsInterestTaxRateInterest earned × 31.4 %computeLmnpReelResale · computePlusValueParticuliersGain = sale price − agency fee − (purchase price + works allowance − wear-and-tear deducted); tax = income tax + social levies after the holding allowances + surtaxLmnpAccountYear.topUp / cumTopUp (allocateOwnerTopUps)max(−closing before the top-up, 0) when the lender’s rate is 0LmnpAccountYear.cumTax + cumInterestTax (+ the resale tax − the CSG tax back paid after the sale)Σ (income tax + social contributions − CSG tax back) + Σ flat tax on interest [+ tax on the sale gain − the last CSG tax back, at the sale]LmnpWealthYear.cashIfSold < 0 (rental account + cash from the sale after tax)max(−(rental account at the sale + cash from the sale after tax), 0)| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
106.Your rental accountin French: Votre compte locatifcomputeLmnpAccount · LmnpAccountYear (lmnpAccount.ts) | The personal bank account this rental runs through, year by year. It opens with the cash left after the purchase; the rent comes in; the loan, the running costs, your income tax and social contributions go out; it earns interest when its balance is positive (taxed with the flat tax) and costs the lender’s rate when it is overdrawn. With no lender you top it up to €0 yourself. At the sale, what is in it plus the cash from the sale is what you end up with. Closing = Opening + interest after the flat tax + rent kept after costs − income tax − social contributions + CSG tax back + top-up | — (no standard symbol) | — |
107.Income tax on the rental resultin French: Impôt sur le revenuLmnpReelYearResult.incomeTax · lmnpTmi | The year’s taxable rental result — the rent minus the real costs, minus past losses and the wear-and-tear you can use — taxed at your own income tax bracket. In a loss year, or when the wear-and-tear covers the whole result, there is none. Taxable result × your income tax bracket (TMI) | FR: impôt sur le revenu, bénéfices industriels et commerciaux (BIC) non professionnels | CGI art. 34, 39 C, 156 I-1° ter; BOFiP BOI-BIC-CHAMP-40-20 |
108.Social contributions on the rental resultin French: Prélèvements sociauxLmnpReelYearResult.social · TaxConfig.lmnp.socialRate | The social levies (CSG, CRDS and the solidarity levy) on the same taxable result, at the flat rate for property income in the tax rules used by the report. Taxable result × social levies rate (TaxConfig) | FR: prélèvements sociaux sur les revenus du patrimoine | CSS art. L136-6; `lib/roi-engine/tax/config.ts` |
109.CSG tax back (earned last year)in French: CSG récupéréecsgDeductibleNextYear · taxSavingNextYear · taxCreditReceived | Part of the CSG paid on the rental result (6.8 points) is deducted from your taxable income the following year; the income tax you save then comes back to you. The report counts it the year after it is earned, and the last one with the sale. Taxable result × 6.8 % × your income tax bracket, received the next year | FR: CSG déductible | CGI art. 154 quinquies II |
110.Flat tax on that interestin French: Flat tax sur les intérêtsLmnpAccountYear.interestTax · TaxConfig.lmnp.savingsInterestTaxRate | The interest your rental account earns when it is positive is taxed like any savings interest, with the flat tax (12.8 % income tax + the social levies, 31.4 % in all), taken out of the account the same year. Interest paid to the lender when the account is overdrawn is not taxed; it is deducted from the rental result instead. Interest earned × 31.4 % | FR: PFU (prélèvement forfaitaire unique) / flat tax | CGI art. 200 A |
111.Tax on the sale gain (plus-value)in French: Impôt sur la plus-valuecomputeLmnpReelResale · computePlusValueParticuliers | When you sell, the gain — the sale price minus the agency fee, minus the purchase price adjusted for the works allowance and the wear-and-tear you deducted on the building — is taxed under the private capital-gains rules: income tax and social levies, each reduced by an allowance for every year held beyond the fifth, plus a surtax on large gains. It is paid out of the sale proceeds. Gain = sale price − agency fee − (purchase price + works allowance − wear-and-tear deducted); tax = income tax + social levies after the holding allowances + surtax | FR: plus-value immobilière des particuliers | CGI art. 150 U to 150 VH, 200 B, 1609 nonies G; LF 2025 art. 84 (réintégration des amortissements) |
112.You top up your rental accountin French: Argent que vous ajoutezLmnpAccountYear.topUp / cumTopUp (allocateOwnerTopUps) | With no lender, the cash you add whenever your rental account would close below €0 — exactly enough to bring it back to €0. It counts as cash you put in (an injection of your return), like the day-one cash. max(−closing before the top-up, 0) when the lender’s rate is 0 | — (no standard symbol) | — |
113.All tax paid so farin French: Tous les impôts payés jusqu’iciLmnpAccountYear.cumTax + cumInterestTax (+ the resale tax − the CSG tax back paid after the sale) | Everything your rental account has paid the tax office since the purchase, net of what came back: income tax and social contributions on the rental result minus the CSG tax back, PLUS the flat tax on the account’s interest and, in the sale year, the tax on the sale gain. It is the tax office’s total on the "Where the money goes" page. The report’s “Income tax + social” figure is smaller on purpose: it counts only the first part (the tax on the rental result, net of the CSG tax back), not the flat tax on interest nor the tax on the sale gain. Σ (income tax + social contributions − CSG tax back) + Σ flat tax on interest [+ tax on the sale gain − the last CSG tax back, at the sale] | — (no standard symbol) | — |
114.You pay in what the sale did not coverin French: Vous comblez le manque à la reventeLmnpWealthYear.cashIfSold < 0 (rental account + cash from the sale after tax) | When the sale price, after the agency fee, the loan left, the loan payoff costs, the tax on the gain and anything owed to the short-term lender, does not cover what is owed, your rental account plus the cash from the sale comes out below €0. You then pay the difference in from your own pocket, so the account closes at €0; it counts against your net gain. max(−(rental account at the sale + cash from the sale after tax), 0) | — (no standard symbol) | — |
headlineMwrrAfterSale · computeMwrrAfterSale / AfterIS / BeforeTax · terminalValueIrrFind R such that Σ Inj(t) × (1 + R)^(N−t) = Final amount (t = 0…N)Differs from textbookNot a textbook IRR on the property’s yearly cash flows: nothing is paid out before the sale, yearly cash stays in the company and grows at the account rate. That makes it the IRR of your own cash (money-weighted), close to a MIRR.computeInjections (Money injected, Inj(t)) · dynamicRoi[].ownersTopUp / beforeTaxInjectionInj(0) = E; after company tax / if you sell: Inj(t) = Owner top-up(t); before tax: BT(t) = BT(t−1) + real account interest(t) + Cash flow(t) + CC cash effect(t), Inj(t) = its top-up back to €0 (pooled the same way); with a lender’s rate > 0: Inj(t) = 0 for every yearfvFinalΣ Inj(t) + Total profit; Total profit = Σ yearly totals + year-N extras − E; yearly total = Cash flow + CC cash effect + account interest (− IS, after company tax and if you sell); extras before tax / after IS = Day-1 equity + max(Bank injection, 0) + Σ equity from loan + Appreciation (end of year); extras if you sell = max(Bank injection, 0) (paid back) + NSP − IS on gain − exit tax. The final amount if you sell = Net cash; after IS = Networth after ISterminalValueIrr().multipleFinal amount ÷ Σ Inj(t)netGain (Net Profit)Final amount − Σ Inj(t)computeCAGR · returnOnCashAnnualized · returnAfterISAnnualized · trueROIAtExitAnnualized (removed)CAGR = (X(N) ÷ (E + Σ top-ups(1…N)))^(1/N) − 1; X = Property Networth / after company tax / Net cash (floored at 0)ArchivedArchived because it treated every top-up as if paid on day 0 — it counted them but ignored their timing (the MWRR accounts for it). The code is kept at git tag archive/cagr-2026-09-25.core.cashFlowAnnual| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
115.Return on investment · Yearly return if you sell in year N (money-weighted)in French: Rendement de l’investissement · Rendement annuel si vous vendez en année N (TRI)headlineMwrrAfterSale · computeMwrrAfterSale / AfterIS / BeforeTax · terminalValueIrr | Yearly return on the cash you put in, taking into account when each euro went in. Three stages: before tax, after company tax, and if you sell (after all taxes; the headline figure). Find R such that Σ Inj(t) × (1 + R)^(N−t) = Final amount (t = 0…N)Differs from textbookNot a textbook IRR on the property’s yearly cash flows: nothing is paid out before the sale, yearly cash stays in the company and grows at the account rate. That makes it the IRR of your own cash (money-weighted), close to a MIRR. | IRR (FR: TRI); MWRR; cf. MIRR | Geltner et al. (2014); Brueggeman & Fisher; CFA Institute (GIPS) |
116.What you paid inin French: Ce que vous avez apportécomputeInjections (Money injected, Inj(t)) · dynamicRoi[].ownersTopUp / beforeTaxInjection | Cash you put in: the initial cash, then any cash you add to cover the company’s shortfalls (pooled across the properties). Before tax, the shortfalls are those of a second account that pays no IS but earns the same interest as the real (after-IS) account — the interest is not recomputed on the higher no-IS balance. Inj(0) = E; after company tax / if you sell: Inj(t) = Owner top-up(t); before tax: BT(t) = BT(t−1) + real account interest(t) + Cash flow(t) + CC cash effect(t), Inj(t) = its top-up back to €0 (pooled the same way); with a lender’s rate > 0: Inj(t) = 0 for every year | Equity contributions (CF(t) < 0) | Geltner et al. (2014) |
117.Final Amountin French: Montant finalfvFinal | What you hold at year N in that stage. Σ Inj(t) + Total profit; Total profit = Σ yearly totals + year-N extras − E; yearly total = Cash flow + CC cash effect + account interest (− IS, after company tax and if you sell); extras before tax / after IS = Day-1 equity + max(Bank injection, 0) + Σ equity from loan + Appreciation (end of year); extras if you sell = max(Bank injection, 0) (paid back) + NSP − IS on gain − exit tax. The final amount if you sell = Net cash; after IS = Networth after IS | Terminal value (FV); FR: valeur finale (valeur acquise) | Geltner et al. (2014) |
118.Multiplein French: MultipleterminalValueIrr().multiple | How many times the injected money you end up with. Final amount ÷ Σ Inj(t) | Equity multiple (EM) — industry convention | industry usage |
119.Total profitin French: Bénéfice totalnetGain (Net Profit) | Final amount minus everything injected. Final amount − Σ Inj(t) | — (no standard symbol) | — |
120.CAGR before tax · after company tax · if you sellin French: TCAM avant impôt · après IS · si vous vendezcomputeCAGR · returnOnCashAnnualized · returnAfterISAnnualized · trueROIAtExitAnnualized (removed) | No longer shown or computed: the money-weighted return (MWRR) is the only return figure since 2026-09-25. It was the constant yearly growth rate that turns the cash you put in into the year-N amount. CAGR = (X(N) ÷ (E + Σ top-ups(1…N)))^(1/N) − 1; X = Property Networth / after company tax / Net cash (floored at 0)ArchivedArchived because it treated every top-up as if paid on day 0 — it counted them but ignored their timing (the MWRR accounts for it). The code is kept at git tag archive/cagr-2026-09-25. | CAGR / geometric mean return — no RE-specific symbol; FR: TCAM | Geltner et al. (2014) |
121.Cash flow (year 1)in French: Cash-flow (année 1)core.cashFlowAnnual | Verdict card / home page line: year-1 cash flow (BTCF), per year. | BTCF₁ | Brueggeman & Fisher |
marketComparison*RatecomputeMarketComparisonBands · classifyMarketComparisonReturnBonds_net = B(1 − F); Stock_net = S(1 − F); Not worth it = [Bonds_net, +1.5 pt]; Real estate = [Bonds_net + 1.5 pt, Stock_net]; Stock = [Stock_net, +1.5 pt]computePropertyReturnComparison().afterInflationr × (1 − F) − IDiffers from textbookPlain subtraction; the textbook real rate uses Fisher: (1 + r)/(1 + I) − 1. Disclosed in the report.| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
122.Stock market return per year (S) · Tax and fees on stock market gains (F) · Inflation per year (I) · Government bonds rate per year (B)in French: Rendement des actions (S) · Impôts et frais (F) · Inflation (I) · Taux des obligations (B)marketComparison*Rate | Assumptions for the comparison chart. Defaults: S 10 %, F 40 %, I 1.7 %, B 4.5 %. | rₘ, r_f, π (inflation) | Geltner et al. (2014) |
123.Bonds · Not worth it · Real estate range · Stock marketin French: Obligations · Ne vaut pas le coup · Zone de l’immobilier · Marché actionscomputeMarketComparisonBands · classifyMarketComparisonReturn | Background bands of the comparison chart. The marker is the property’s yearly return if you sell (MWRR). Bonds_net = B(1 − F); Stock_net = S(1 − F); Not worth it = [Bonds_net, +1.5 pt]; Real estate = [Bonds_net + 1.5 pt, Stock_net]; Stock = [Stock_net, +1.5 pt] | — (no standard symbol) | — |
124.After inflationin French: Après inflationcomputePropertyReturnComparison().afterInflation | Return after tax and inflation (formula panel only, not plotted). r × (1 − F) − IDiffers from textbookPlain subtraction; the textbook real rate uses Fisher: (1 + r)/(1 + I) − 1. Disclosed in the report. | Real return (Fisher equation) | Geltner et al. (2014) |
verifiedTotaltotalInvestment · breakevenTargetMoney back = first t with Total(t) ≥ E + Σ Owner top-ups(1…t)computePortfolio().total| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
125.Totalin French: TotalverifiedTotal | Line drawn from an independently computed total, not from the top of the stacked bars, so a wrong segment can’t hide. | — (no standard symbol) | — |
126.Cash you put in (line) · Money back (marker)in French: Argent investi (ligne) · Argent investi récupéré (marqueur)totalInvestment · breakevenTarget | Dashed line at E, the cash put in at the start. The marker is the first year the chosen stage reaches E plus the top-ups added so far — the same test as the breakeven year. Money back = first t with Total(t) ≥ E + Σ Owner top-ups(1…t) | — (no standard symbol) | — |
127.GRAND TOTALin French: TOTAL GÉNÉRALcomputePortfolio().total | Sum of all properties of the one company: one account, one company tax, one exit tax, one compte courant repayment.Differs from textbookThe lender’s rate, the exit tax rate and the deductible CCA cap are one company-wide value each (the portfolio’s setting, else property #1’s). The Grand Total’s sell year is property #1’s. | — (no standard symbol) | — |
These terms belong to the Deal Evaluation page on branch feat/property-evaluation, which is not merged yet. Year-1 figures, before company tax. Formulas read from lib/dealEvaluation/evaluate.ts on that branch.
grossRentGrossRent = Rent per month × 12noiNOI = EffRent − OpExgrossYieldGrossRent ÷ TACDiffers from textbookFrench market practice divides by the price (sometimes with fees); here by the total cost including works and furniture.netYieldNOI ÷ TACleverageTAC ÷ EltvL ÷ TACDiffers from textbookTextbook LTV divides by the property value (V), not the total cost.spreadNet yield − iloanConstantDS ÷ L (DS includes loan insurance)dscrNOI ÷ DSDiffers from textbookDS includes loan insurance, so the ratio is a little lower than a bank’s.breakEvenOccupancy(OpEx + DS) ÷ GrossRentbreakEvenVacancyMonths(NOI − DS) ÷ Rent per month + Months without rentreserve6 × |Cash flow ÷ 12| + repair buffer (default 5 000 €)priceM2 · rentM2 · priceGap · rentGapPrice ÷ surface; Rent ÷ surface; gap = own ÷ local − 1NET_YIELD_ESTIMATE_FACTORLocal gross × 0.75| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
128.GrossRentin French: Loyer brutgrossRent | Rent for a full year, no vacancy. GrossRent = Rent per month × 12 | PGI / GPR (potential gross income / rent) | Brueggeman & Fisher; CCIM Institute |
129.NOIin French: NOInoi | Rent collected minus running costs: before the loan and before income tax. NOI = EffRent − OpEx | NOI = EGI − OE; FR: revenu net d’exploitation | Brueggeman & Fisher; Geltner et al. (2014); CCIM Institute |
130.Gross yieldin French: Rendement brutgrossYield | Full-year rent compared with everything you paid. GrossRent ÷ TACDiffers from textbookFrench market practice divides by the price (sometimes with fees); here by the total cost including works and furniture. | FR: rendement brut; ≈ 1 ÷ GRM | French market convention |
131.Net yieldin French: Rendement netnetYield | NOI compared with everything you paid. NOI ÷ TAC | FR: rendement net; ≈ cap rate on cost (R / y = NOI ÷ V) | Geltner et al. (2014) (y); French market convention |
132.Leveragein French: Effet de levierleverage | How much property you control per euro of your cash. TAC ÷ E | Equity multiplier V ÷ E | Geltner et al. (2014) |
133.LTVin French: LTVltv | Share of the total cost financed by the bank. L ÷ TACDiffers from textbookTextbook LTV divides by the property value (V), not the total cost. | LTV = L ÷ V; FR: quotité de financement | Geltner et al. (2014); Brueggeman & Fisher |
134.Leverage spreadin French: Écart de tauxspread | Whether each borrowed euro earns more than it costs. Net yield − i | Positive / negative leverage (NOI ÷ V vs. i) | Brueggeman & Fisher |
135.Loan constantin French: Constante de prêtloanConstant | Yearly loan cost per euro borrowed. DS ÷ L (DS includes loan insurance) | Loan constant / mortgage constant | Brueggeman & Fisher |
136.Rent vs. loan coverage (DSCR)in French: Couverture du prêt par le loyer (DSCR)dscr | How many times the NOI covers the loan payments. Safe ≥ 1.25, tight 1.0–1.25. NOI ÷ DSDiffers from textbookDS includes loan insurance, so the ratio is a little lower than a bank’s. | DSCR (B&F: DCR); FR: taux de couverture de la dette | Brueggeman & Fisher; CCIM Institute |
137.Break-even occupancyin French: Taux d’occupation du point mortbreakEvenOccupancy | Share of the full-year rent needed to pay all costs and the loan. (OpEx + DS) ÷ GrossRent | BER = (OE + DS) ÷ PGI | Brueggeman & Fisher; CCIM Institute |
138.Vacancy cushionin French: Marge de vacancebreakEvenVacancyMonths | Months without rent per year you can afford before the cash flow turns negative. (NOI − DS) ÷ Rent per month + Months without rent | — (no standard symbol) | — |
139.Suggested cash reservein French: Réserve de trésorerie conseilléereserve | When the cash flow is negative: six months of shortfall plus one big repair. 6 × |Cash flow ÷ 12| + repair buffer (default 5 000 €) | Reserves (working capital) | CCIM Institute |
140.Price / rent per m² · gapsin French: Prix / loyer au m² · écartspriceM2 · rentM2 · priceGap · rentGap | Price and rent per m² compared with the local average. Price ÷ surface; Rent ÷ surface; gap = own ÷ local − 1 | — (no standard symbol) | — |
141.Local net yield (estimated)in French: Rendement net local (estimé)NET_YIELD_ESTIMATE_FACTOR | When the local data has no net yield, it is estimated from the gross. Local gross × 0.75 | — (no standard symbol) | — |
An unfurnished rental you own yourself, with a rent excluding charges of at most €15,000 a year: income tax and social contributions are paid on 70% of that rent (a flat 30% allowance replaces every cost), and the tax on the gain when you sell. These are the words behind its "Where the money goes" page (one owner, a personal rental account, the tax office).
computeMicroFoncierAccount · LmnpAccountYear (microFoncierAccount.ts, the same step as lmnpAccount.ts)Closing = Opening + interest after the flat tax + rent kept after costs − income tax − social contributions + CSG tax back + top-upMicroFoncierYearResult.incomeTax · microFoncierTmi(Rent − charges included) × 70% × your income tax bracket (TMI)MicroFoncierYearResult.social · TaxConfig.microFoncier.socialRate(Rent − charges included) × 70% × 17.2%csgDeductibleNextYear · taxSavingNextYear · taxCreditReceived (microFoncier.ts)Rent excluding charges × 70% × 6.8% × your income tax bracket, received the next yearLmnpAccountYear.interestTax · TaxConfig.microFoncier.savingsInterestTaxRateInterest earned × 31.4%computeMicroFoncierResale · computePlusValueParticuliersGain = sale price − agency fee − (purchase price + purchase costs + works); tax = income tax + social levies after the holding allowances + surtaxLmnpAccountYear.topUp / cumTopUp (allocateOwnerTopUps)max(−closing before the top-up, 0) when the lender’s rate is 0LmnpAccountYear.cumTax + cumInterestTax (+ the resale tax − the CSG tax back paid after the sale)Σ (income tax + social contributions − CSG tax back) + Σ flat tax on interest [+ tax on the sale gain − the last CSG tax back, at the sale]MicroFoncierWealthYear.cashIfSold < 0 (rental account + cash from the sale after tax)max(−(rental account at the sale + cash from the sale after tax), 0)MicroFoncierYearResult.grossRent · aboveCap · firstYearAboveCapΣ (rent − charges included) of the household’s unfurnished rentals ≤ €15,000 a year| In this app | Definition and formula | Standard symbol | Source |
|---|---|---|---|
142.Your rental accountin French: Votre compte locatifcomputeMicroFoncierAccount · LmnpAccountYear (microFoncierAccount.ts, the same step as lmnpAccount.ts) | The personal bank account this rental runs through, year by year. It opens with the cash left after the purchase; the rent comes in; the loan, the running costs, your income tax and social contributions go out; it earns interest when its balance is positive (taxed with the flat tax) and costs the lender’s rate when it is overdrawn. With no lender you top it up to €0 yourself. At the sale, what is in it plus the cash from the sale is what you end up with. Closing = Opening + interest after the flat tax + rent kept after costs − income tax − social contributions + CSG tax back + top-up | — (no standard symbol) | — |
143.Income tax on 70% of the rent excluding chargesin French: Impôt sur le revenu sur 70 % des loyersMicroFoncierYearResult.incomeTax · microFoncierTmi | The rent of the year excluding the charges the tenant pays with it, minus a flat 30% allowance that stands for every cost (no interest, charges or works are deducted, and there is never a loss), taxed at your own income tax bracket. The charges inside the rent are never taxed. (Rent − charges included) × 70% × your income tax bracket (TMI) | FR: impôt sur le revenu, revenus fonciers (régime micro-foncier) | CGI art. 14, 28, 32 |
144.Social contributions on 70% of the rent excluding chargesin French: Prélèvements sociaux sur 70 % des loyersMicroFoncierYearResult.social · TaxConfig.microFoncier.socialRate | The social levies (CSG, CRDS and the solidarity levy) on the same 70% of the rent excluding charges, at the rate for rental income in the tax rules used by the report (17.2%: rental income kept that rate in 2026). (Rent − charges included) × 70% × 17.2% | FR: prélèvements sociaux sur les revenus du patrimoine | CSS art. L136-6; `lib/roi-engine/tax/config.ts` |
145.CSG tax back (earned last year)in French: Économie d’impôt sur la CSG (acquise l’année précédente)csgDeductibleNextYear · taxSavingNextYear · taxCreditReceived (microFoncier.ts) | Part of the CSG paid on the rent (6.8 points of the 70% taxed; CGI art. 154 quinquies II) is deducted from your taxable income the following year; the income tax you save then comes back to you. The report counts it the year after it is earned, and the last one with the sale. Rent excluding charges × 70% × 6.8% × your income tax bracket, received the next year | FR: CSG déductible | CGI art. 154 quinquies II |
146.Flat tax on that interestin French: PFU sur ces intérêtsLmnpAccountYear.interestTax · TaxConfig.microFoncier.savingsInterestTaxRate | The interest your rental account earns when it is positive is taxed like any savings interest, with the flat tax (12.8% income tax + the social levies, 31.4% in all), taken out of the account the same year. Interest paid to the lender when the account is overdrawn is not taxed, and under micro-foncier it is not deducted from anything either: the 30% allowance already stands for every cost. Interest earned × 31.4% | FR: PFU (prélèvement forfaitaire unique) / flat tax | CGI art. 200 A |
147.Tax on the sale gain (plus-value)in French: Impôt sur la plus-valuecomputeMicroFoncierResale · computePlusValueParticuliers | When you sell, the gain — the sale price minus the agency fee, minus the purchase price plus the purchase costs (the flat 7.5% or the actual ones) and the works (the flat 15% after five years or the actual ones) — is taxed under the private capital-gains rules: income tax and social levies, each reduced by an allowance for every year held beyond the fifth, plus a surtax on large gains. Nothing is added back. It is paid out of the sale proceeds. Gain = sale price − agency fee − (purchase price + purchase costs + works); tax = income tax + social levies after the holding allowances + surtax | FR: plus-value immobilière des particuliers | CGI art. 150 U to 150 VH, 200 B, 1609 nonies G |
148.You top up your rental accountin French: Vous alimentez votre compte locatifLmnpAccountYear.topUp / cumTopUp (allocateOwnerTopUps) | With no lender, the cash you add whenever your rental account would close below €0 — exactly enough to bring it back to €0. It counts as cash you put in (an injection of your return), like the day-one cash. max(−closing before the top-up, 0) when the lender’s rate is 0 | — (no standard symbol) | — |
149.All tax paid so farin French: Tous les impôts payés à ce jourLmnpAccountYear.cumTax + cumInterestTax (+ the resale tax − the CSG tax back paid after the sale) | Everything your rental account has paid the tax office since the purchase, net of what came back: income tax and social contributions on the rent minus the CSG tax back, PLUS the flat tax on the account’s interest and, in the sale year, the tax on the sale gain. It is the tax office’s total on the "Where the money goes" page. The report’s “Income tax + social” figure is smaller on purpose: it counts only the first part. Σ (income tax + social contributions − CSG tax back) + Σ flat tax on interest [+ tax on the sale gain − the last CSG tax back, at the sale] | — (no standard symbol) | — |
150.You pay in what the sale did not coverin French: Vous versez ce que la revente ne couvre pasMicroFoncierWealthYear.cashIfSold < 0 (rental account + cash from the sale after tax) | When the sale price, after the agency fee, the loan left, the loan payoff costs, the tax on the gain and anything owed to the short-term lender, does not cover what is owed, your rental account plus the cash from the sale comes out below €0. You then pay the difference in from your own pocket, so the account closes at €0; it counts against your net gain. max(−(rental account at the sale + cash from the sale after tax), 0) | — (no standard symbol) | — |
151.The micro-foncier limit (€15,000 of rent a year)in French: Le plafond du micro-foncier (15 000 € de loyers par an)MicroFoncierYearResult.grossRent · aboveCap · firstYearAboveCap | Micro-foncier is only allowed while the rent excluding charges of ALL the unfurnished rentals of your tax household together is at most €15,000 a year (the report checks this property alone: if you rent out other unfurnished homes, add their rent). A property above it in year 1 cannot use it; when the indexed rent passes it later, the réel regime becomes mandatory from that year — the report warns you and keeps the micro-foncier figures. Σ (rent − charges included) of the household’s unfurnished rentals ≤ €15,000 a year | FR: plafond du micro-foncier | CGI art. 32 |