Calculating how well your investments are doing can be tricky. There are lots of things that can change how much money you make, and different ways to figure it out. It's important for you to know what the numbers mean.
Some apps and brokers don't explain clearly how they work out your returns, which can be confusing. But with Capitally, you can pick what to include in your returns and choose how to calculate them.
This page covers the three methods and the options that shape them. For what each column in the Portfolio table holds β Invested Principal, Principal Change, the Total, Capital, Currency, Realized and Unrealized Returns, the yield metrics and the annualized rate columns β see Portfolio metrics reference.
Money Weighted Return (MWR / IRR)
Money Weighted Return (MWR), also known as Internal Rate of Return (IRR), is like an interest rate on a deposit account that exactly matches your portfolio's cash flows. It is the method Capitally uses by default, and it is solved the same way as XIRR in Excel or Google Sheets β iteratively, converging on a single rate. Capitally does not use Modified Dietz, the rough approximation other tools fall back on when an iterative solver isn't feasible.
One difference from the spreadsheet: XIRR always annualizes, while Capitally shows the return over the period you selected unless you ask for annualization. See Annualizing Rate of Return for the conversion.
Read more about Money Weighted Rate of Return on our blog.
Time Weighted Return (TWR)
TWR measures the return from your asset mix only, ignoring your actions.
Imagine you invest equal amounts in each asset based on its allocation. For one asset, you invest $100. For two assets with an 80% & 20% mix, you invest $80 and $20. If you change the allocation, you rebalance the dollar amounts accordingly.
Returns are based on End-of-Day prices. Your actions, other than choosing the asset mix, don't affect the returns.
Read more about Time Weighted Rate of Return on our blog.
Return on Investment (ROI)
ROI tracks all your cash flows, regardless of timing. It records everything you put in and take out of the portfolio as inflows and outflows. The ROI is calculated as outflows / inflows - 1.
Our algorithm ensures that money taken out and later put back in isn't counted twice. It does this by tracking the maximums of flows in both directions.
ROI is a simple measure and should be used with an understanding of its limitations. However, it can be useful for removing the effect of timing, such as when evaluating Dollar Cost Averaging by comparing ROI to TWR.
It is also the method to reach for when IRR misbehaves. Exercising employee stock options bought at a deep discount is the usual case: the sudden jump from strike price to market price produces a strange IRR, while ROI still gives a readable number. Note the trade-off in the other direction β because every reinvestment counts as both an outflow and a new inflow, ROI understates the return on a portfolio that recycles its own proceeds.
Read more about Return on Investment on our blog.
How yield to maturity differs from a rate of return
Yield to maturity looks forward; TWR, MWR and ROI look back. It is the rate that discounts a bond's remaining coupons and principal to today's dirty price β what the bond earns from here if you hold it to maturity and every payment arrives β reported as an effective annual rate, compounded yearly.
That makes it incomparable with an annualized realized return. Annualizing MWR restates what your money has already done, per year; yield to maturity is quoted per year by construction and says nothing about what you paid for the bond. Put the two side by side on the same holding and they will differ, correctly. Portfolio metrics has the definition, and the cases where the figure comes back blank.
Annualizing Rate of Return
Capitally does not automatically annualize rates. Instead, it shows the percentage gained or lost over the entire period.
This is useful for seeing a large number over a long time, but it doesnβt help compare different time periods. Itβs also much easier to understand "10% per year" than "61% over 5 years."
Therefore you can choose to annualize the returns. We recommend the Auto option, which annualizes returns for periods of at least 1 year.
p.a. or pa which stands for "per annum".With annualization on, every figure β including benchmark series such as CPI β is an average per-annum value rather than the cumulative change. Switch to Over Period to see the cumulative number. Watch the period boundaries when you check the arithmetic yourself: 2020 : 2025 spans six full calendar years, 1 January 2020 to 31 December 2025, not five.
An unexpectedly large percentage β 127% where you expected around 30% β is almost always a cumulative multi-year return rather than an error. If you are reconciling against a spreadsheet, remember that XIRR always annualizes: convert its result to Capitally's period figure with (1 + XIRR_RESULT) ^ (NUMBER_OF_DAYS / 365) - 1, or turn on Auto and compare annualized to annualized.
Annualizing shorter periods can help predict earnings, but itβs mostly useful for fixed-income sources like deposits or bonds. For other assets, volatility can greatly affect the numbers, as shown in the following graph:

What is included in returns
By default, returns include Fixed Income, Fees and Other cashflows (from "Other" transactions). This gives you the Total Return.
You can adjust these options to get different types of returns:
- Price Return: exclude everything
- Nominal Return: include only Fixed Income
Money that came out of your portfolio is not money you put in. A dividend is recorded as Fixed Income and counts towards your return, so buying shares with that cash adds nothing to your invested principal and nothing is counted twice β see How cash affects your returns.
These switches decide what counts as return; a filter removes lots from the computation before it starts. The filter equivalent of dropping income is Unit has Transaction Type: is not Dividend, Interest, Rent, Other. The difference shows up in withholding tax: excluding Fixed Income here leaves tax recorded on income transactions in Realized Returns, while the filter takes those lots out altogether.
Including Taxes
If you have taxes set up, you can include them in your returns:
- Paid: Includes only the tax declared as paid in transactions (like tax withheld)
- Due: Includes tax you paid and tax that is due from realized gains
- Potential: includes all taxes, including tax that would be due if you closed all your positions on the last day
Discounting by a benchmark
A discount benchmark subtracts a chosen benchmark's rate of return from your own rate of return. The result is your real return (after inflation) or excess return (after a chosen index).
Common uses:
- Real return after inflation β discount by US CPI, Poland CPI, or any other inflation indicator
- Alpha vs the market β discount by S&P 500, MSCI World, or your favourite index
- Premium over risk-free β discount by US 10Y Government Bond Yield or another bond yield
Open the Rate of Return tab in Portfolio and pick a benchmark from the Discount by selector, right next to the regular benchmark picker. The discount applies to every rate-of-return method β TWR, IRR, and ROI alike.
See Benchmarks for the full list of suitable benchmarks and how the math works.
Modifying options
Calculation options cover what goes into a return, whether it is annualized, how taxes are treated, and which rate of return method is used. Pick between MWR (IRR), TWR and ROI with the Return Rate option. You can set all of them once for the whole app, or change them for the view you are looking at.
Globally
To set default options for the entire application:
- Go to Settings
- Select Analysis
- Change the options
- Click Save
In Portfolio
To change calculation options within your portfolio:
- Click the button next to the currency selector.
- Your changes will take effect immediately.
- To apply these changes elsewhere in the app, save the new settings as default.

Changes made here stay in Portfolio. Summary uses whatever you saved as the default, but it has no currency selector β it always renders the project's default currency β and its benchmark is set separately from Portfolio's, which is the usual reason the same metric reads differently on the two pages.
Why your return differs from your broker or another app
Three things explain almost every mismatch: the calculation method, annualization, and the currency the figure is shown in. Capitally defaults to MWR (IRR), over the period you selected, converted to your project currency. Line those three up with the other tool and the numbers usually converge.
- Method β your broker may report ROI, TWR, or a proprietary formula it simply labels "return". Switch the Return Rate option to the same method before comparing.
- Annualization β spreadsheet
XIRRand many brokers always annualize; Capitally shows the period return unless you ask otherwise. See Annualizing Rate of Return. - Currency β Capitally converts everything to the viewing currency, so exchange-rate moves are part of your return. Switch the view to the asset's own currency to compare like for like.
- What's counted β dividends and fees are included by default, and realized and unrealized results are shown together. Brokers often leave some of that out.
- TWR specifics β Capitally's TWR works from closing prices and ignores your purchase and sale prices, as TWR is meant to. Tools that fold purchase prices in will land elsewhere.
- Missing transactions β some brokers cap export history, Interactive Brokers at one year for example, and one missing transaction changes everything after it.
- Scope β a lot opened inside the transaction view shows that lot's return, not the whole position's. Check the summary at the top and switch to the
maxperiod for the full picture.
Market value can differ slightly even when every transaction matches, because exchange-rate sources, valuation cut-offs and end-of-day price feeds don't line up perfectly between providers; correct closing prices sometimes arrive a few hours later or the next business day. A gap inside a fraction of a percent is expected. Anything larger is a data question rather than a methodology one β see Balances and cash don't match.
When the rate shows NaN or an extreme value
NaN means the IRR solver could not find a rate. MWR is a polynomial with as many possible roots as you have cash flows, so when large inflows and outflows alternate there can be several valid answers, or none the solver reaches within its 100 attempts. That is a property of IRR, not a fault in your data β TWR and ROI always return a number, so switching method is the fastest way to keep working.
To locate the cause, open the Rate of Return tab and scan the positions table underneath the chart for the row carrying the NaN. A portfolio-level NaN is usually one position's doing, because violent cash flows tend to stay local to a single asset.
Extreme percentages usually point at a transaction rather than at the math:
- -100%, or a spike into the thousands of percent β most often a share transfer recorded as a Buy at price 0, which tells Capitally the asset cost nothing. Change the type to Transfer and either leave the price empty or set it to the real cost basis, such as the fair market value on the day employee shares vested.
- A zero cost basis β with nothing invested there is no rate to solve for. Capitally will use whatever cash flows exist, a fee for instance, but the result is not meaningful.
- A price of zero or the wrong currency on any transaction in the position.
How returns are calculated
This is how your data is used to calculate the performance:
- All transactions are grouped into positions. In each group there are only transactions with the same asset and account.
- Automatic transactions are generated, like dividends or splits.
- Transactions are ordered in ascending order by their dates. If the date is the same, Splits go first, then Dividends, Buys, Sells and the rest.Order of two transactions with the same type and date is not defined. It will not be the same as the order they've been added. If it's important, add one minute to date of one of the transactions.
- Transactions are combined into Position Units in the First-In-First-Out order.
- All prices are converted to a selected viewing currency. When calculating Capital/Currency return, we use a constant FX rate from the day when Position Unit was opened.
- All selected Position Units are then aggregated. Their metrics are calculated for each relevant day - like start and end of the period, or days of transaction activity. These metrics include cashflows, fees, fixed income and everything needed to calculate the returns and ratesAll calculations are limited to 9 decimal places. Numbers are constantly rounded to minimize errors.
- Finally, the returns and rates are calculated by aggregating these metricsMWR is calculated through trial and error, starting with a ROI estimate and then using the Newton-Raphson method. Up to 100 tries and accepting answers within 0.1% accuracy. If the rate cannot be found,
NaNis shown which stands forNot a Number.