Source: https://wealthfolio.app/docs/faq/

# Wealthfolio FAQ

Answers to the questions we see most often about imports, transfers, FX, performance metrics, self-hosting, and more.

* * *

Last updated September 10, 2026

This FAQ is the front door. For deeper explanations, follow the links inside each answer to the [concept docs](https://wealthfolio.app/docs/concepts/) and [user guide](https://wealthfolio.app/docs/guide/dashboards/).

## Getting started

### What is Wealthfolio?

A local-first, open-source investment tracker. The core app is free, your data stays on your device, and [Wealthfolio Connect](https://wealthfolio.app/connect/) is an optional paid service if you want automatic broker sync or end-to-end encrypted multi-device sync.

### Which platforms is Wealthfolio on?

Desktop (macOS, Windows, Linux), iOS, and self-hosted web. Each platform runs its own local database. See the [Self-Hosting guide](https://wealthfolio.app/docs/guide/self-hosting/) for the server build.

### Is the core app free?

Yes. The desktop and self-hosted core are free forever. Connect is a subscription for broker sync and device sync — everything else works without it.

### What's the fastest way to get started?

For each existing position, add a `TRANSFER_IN` activity with the **External** flag checked — it seeds the lot at your current quantity and cost basis without recording a fictional buy. Add a single `DEPOSIT` for your cash balance. You can switch to full `BUY`/`SELL` tracking going forward. See [Activity Types](https://wealthfolio.app/docs/concepts/activity-types/#workflow-styles) for both styles.

## Data, privacy, and backup

### Where is my data stored?

Locally, in an SQLite database.

-   **Windows:** `%APPDATA%\Wealthfolio`
-   **macOS:** `~/Library/Application Support/com.teymz.wealthfolio/`
-   **Linux:** `~/.local/share/com.teymz.wealthfolio/`
-   **Mobile (iOS):** App sandbox storage, backed up to iCloud if enabled.
-   **Self-hosted:** Data volume mounted at `/app/data` inside the container.

With Connect, data is encrypted on-device before syncing — we never see your portfolio data.

### How do I back up before a big change?

Settings → **Exports** → choose the **Full database (SQL)** option. This is a complete snapshot you can restore later. CSV and JSON exports are also available for individual collections. See [Export & Backup](https://wealthfolio.app/docs/guide/data-export/).

### How do I move Wealthfolio to a new computer?

The simplest path: copy the data directory from the old machine (see paths above) to the same location on the new machine. Alternatively, export the full database SQL on the old machine and import it on the new one.

### Can I sync across devices?

Yes, with [Wealthfolio Connect](https://wealthfolio.app/connect/). Sync is end-to-end encrypted on-device — we can't read your portfolio. See the [Connect & Broker Sync guide](https://wealthfolio.app/docs/guide/connect-broker-sync/).

### Does Wealthfolio track me or collect data?

No. The only external calls the app makes are to market-data providers (for prices) and the updater (to check for new versions). No analytics, no telemetry.

## CSV import

### What does the CSV need to look like?

UTF-8, with a header row, ISO dates, decimal points (not commas), and one activity per row. The mapping step in the importer lets you align your broker's column names to Wealthfolio's fields. See the [CSV Import guide](https://wealthfolio.app/docs/guide/csv-import/) for the full reference.

### Why is my import failing with "missing symbol" or "$ in price"?

Two common gotchas:

-   **Missing symbol:** every row needs a symbol. For pure cash flows (deposits, withdrawals, interest), use `$CASH-<CCY>` — e.g. `$CASH-USD`.
-   **$ in price fields:** strip currency symbols before import. `$57.50` should be `57.50`. Same for thousands separators (`1,234.56` → `1234.56`).

Full troubleshooting list: [CSV Import → Troubleshooting](https://wealthfolio.app/docs/guide/csv-import/#7--troubleshooting).

### Can I import a cash-only or bank account?

Yes. Use the `$CASH-<CCY>` symbol (e.g. `$CASH-EUR`) on `DEPOSIT`, `WITHDRAWAL`, `INTEREST`, `FEE`, and `TAX` rows. The importer treats those as pure cash activities — no security lookup is needed.

### Will re-importing the same file duplicate activities?

The importer detects exact duplicates by date + symbol + quantity + price + amount and skips them. If you're re-importing with corrections, you'll see how many rows are new vs. duplicates in the preview before confirming.

### Is there a per-broker recipe?

Yes — Schwab, Fidelity, Vanguard, IBKR, Robinhood, Trading 212, Questrade, BofA, and Guideline are documented in the [CSV Import guide](https://wealthfolio.app/docs/guide/csv-import/#5--broker-recipes). If your broker isn't listed and you'd like to contribute a recipe, open a PR on [GitHub](https://github.com/wealthfolio/wealthfolio).

## Activities, transfers, dividends, splits

### How do I record a transfer between accounts?

Create a `TRANSFER_OUT` on the source account and a matching `TRANSFER_IN` on the destination account. For securities transfers, Wealthfolio preserves the original cost basis. See [Activity Types — Transfers](https://wealthfolio.app/docs/concepts/activity-types/#7--how-transfers-work).

**Same-day gotcha:** if both activities are dated the same day, give the OUT an earlier timestamp than the IN. Otherwise the IN may be processed before the lot exists on the source side.

### How do I transfer an asset out (e.g., crypto sent to a wallet)?

Use a `TRANSFER_OUT` on the source account with the **External** flag checked — Wealthfolio closes the lots via FIFO without realising a gain, since the asset moved to an untracked destination. If the destination is another Wealthfolio account, leave the External flag unchecked and pick the destination account — Wealthfolio will create the matching `TRANSFER_IN` and preserve the original cost basis.

### How do I record dividend reinvestment (DRIP)?

Create a `DIVIDEND` activity with the **DRIP** subtype. Wealthfolio records both the dividend income and the resulting share purchase in one step. The CSV importer auto-detects DRIP rows in most broker formats. See [Dividend subtypes](https://wealthfolio.app/docs/concepts/activity-types/#dividend-subtypes).

### How do I record a stock split?

Add a `SPLIT` activity on the split date with the ratio (e.g. 4-for-1). Wealthfolio adjusts both quantity and per-share cost.

**Don't double-apply.** If your broker CSV already reflects post-split quantities and your price feed (e.g. Yahoo) shows adjusted prices, you may not need a `SPLIT` activity at all. Add one only if your historical quantities are pre-split.

### Can I track options, short positions, bonds, or RSUs?

Partial support today:

-   **Options:** in the Add Activity form, pick `Buy` or `Sell`, then switch the asset toggle from **Stock** to **Option** to get the Call/Put, strike, and expiration fields plus a **Position** (Open / Close) toggle. Writing a call or put is `Sell` + asset **Option** + **Open** (the button reads "Sell to Open"). An `Option Expiry` adjustment subtype cleans up expired contracts, and the standard 100x multiplier is applied automatically. See [Options (calls & puts)](https://wealthfolio.app/docs/guide/activities/#options-calls--puts).
-   **Short stock and ETF positions:** use Sell Short to open a signed short lot and Buy to Cover to close it. Plain sells never accidentally open a short.
-   **Covered calls and complex options strategies:** not first-class strategy objects yet, though the underlying option trades can be recorded.
-   **Bonds:** tracked as securities. Record coupon payments as `INTEREST` against the bond symbol; Wealthfolio attributes the income to that bond and includes it in the bond's income and total return. Dedicated coupon-specific UI and reporting are not yet available.
-   **RSUs / free shares:** use `TRANSFER_IN` with the **External** flag checked and the cost basis you want to record (typically the vest-date price for tax purposes).

### How do I record selling (writing) a call or put option?

The easy-to-miss step is the **asset toggle**: pick the trade type first, then switch it from **Stock** to **Option** to reveal the option contract fields. To sell/write a call or put:

1.  **Activities → + Add Manually → Add Transaction**, then pick the `Sell` type.
2.  Under **Asset & Account**, switch the asset toggle from **Stock** to **Option**. Choose **Call** or **Put**, then set the symbol, **strike**, and **expiration**.
3.  In the **Trade** section set **Position** to **Open**, then enter the number of **Contracts** and the **Premium/Share** (Wealthfolio applies the 100x multiplier for you — enter `1.25`, not `125`). The button reads **Sell to Open**.

Close it later with `Buy` + asset **Option** + **Close** (Buy to Close), or use the `Option Expiry` adjustment subtype if it expires worthless. Buying an option to open is the mirror: `Buy` + asset **Option** + **Open**. Full walkthrough: [Options (calls & puts)](https://wealthfolio.app/docs/guide/activities/#options-calls--puts).

### How do staking rewards work?

Use `INTEREST` with the **Staking Reward** subtype. Wealthfolio records both the income and the resulting token acquisition in one step.

### How do I record withholding tax on dividends?

Two patterns work:

-   **Gross + tax:** record the `DIVIDEND` at the gross amount and a separate `TAX` activity for the withholding.
-   **Net:** record the `DIVIDEND` at the net amount your broker actually deposited. You lose the gross/withholding breakdown but cash reconciles cleanly.

### Are fees double-counted if I use both inline fees and FEE activities?

Yes, if you log the same fee twice. Pick one: either include the commission as the `fee` field on the `BUY`/`SELL`, or create a separate `FEE` activity — not both. See [How fees work](https://wealthfolio.app/docs/concepts/activity-types/#6--how-fees-work).

## Symbols & market data

### Which ticker format does Wealthfolio use?

Symbols are **provider-agnostic**. Each asset stores a canonical ticker (e.g. `RY`, `AAPL`) plus an optional exchange MIC code (e.g. `XTSE` for Toronto). Wealthfolio's resolver translates that into whatever format each market-data provider expects — Yahoo wants `RY.TO`, Börse Frankfurt wants `XETR:RY`, OpenFIGI wants an ISIN, and so on.

When you add an asset, you can type either the bare ticker or the exchange-qualified form your provider uses (e.g. `RY.TO`) — Wealthfolio parses the suffix into a ticker + MIC pair. The Yahoo suffix table is the most common case and is documented in [Market Data & FX](https://wealthfolio.app/docs/concepts/market-data-and-fx/).

### The same ticker exists on two exchanges — how do I pick the right one?

Add the exchange to the symbol when creating the asset — either as a Yahoo suffix (`IWDA.AS` for Euronext Amsterdam) or a MIC code in the dedicated exchange field. Once the asset is created, edit its **Exchange** setting any time to switch.

If a specific provider needs a different format for that asset (e.g. one of your custom scrapers wants `IWDA-AMS`), add a **per-provider override** in the asset's **Market Data** tab.

### Which market data providers are supported?

Built-in providers today:

-   **Yahoo Finance** — equities, ETFs, crypto, FX, commodities. Default for most users.
-   **Alpha Vantage**, **Finnhub**, **MarketData.app** — additional equity coverage (BYO API key).
-   **OpenFIGI** — bond / ISIN lookup.
-   **Börse Frankfurt** — German exchange listings.
-   **Metal Price API** — precious metals spot prices.
-   **US Treasury Calc** — Treasury / CUSIP data.
-   **Custom providers** — point at any JSON, HTML, table, or CSV source. See [Custom Market Data Providers](https://wealthfolio.app/docs/guide/custom-providers/).

Per asset you can set a **preferred provider** and, when a provider needs a non-standard symbol, a **per-provider override**. The resolver falls through providers based on capability, health, and rate-limit headroom.

### My security isn't on Yahoo. What do I do?

Two paths:

1.  Try the other built-in providers (Alpha Vantage, Finnhub, OpenFIGI for bonds, Börse Frankfurt for DE-listed). Set the asset's **preferred provider** under **Market Data**.
2.  Build a [custom market data provider](https://wealthfolio.app/docs/guide/custom-providers/) pointed at any public JSON API, HTML page, HTML table, or CSV. No coding required.

### A provider expects a different symbol than the one I stored — fix?

Open the asset → **Market Data** tab → set a **per-provider override**. For example, the asset's canonical symbol is `SHOP` but your custom provider fetches it as `SHOP-CA` — record the override and Wealthfolio uses it whenever it queries that provider, leaving the canonical symbol untouched.

### My custom security defaults to USD — can I change it?

Yes. Open the asset → **Edit** → set the **Currency** field. The next quote update will use the currency you set. Note that _quote unit currency_ (what the provider returns — e.g. GBp pence) can differ from the asset's currency (GBP); Wealthfolio normalizes minor units automatically.

### Why did prices stop updating?

Most common causes:

1.  The provider returned bad or stale data. Check the [Health Center](https://wealthfolio.app/docs/guide/health-center/) — it flags suspect quotes.
2.  The symbol delisted. Switch to manual quotes in the asset's settings.
3.  The provider is rate-limited or its circuit breaker tripped after repeated failures. Wait a few minutes; Wealthfolio falls back to the next capable provider when one is unhealthy.
4.  The provider expects a different symbol than the canonical one — add a per-provider override (see above).

### Will Wealthfolio keep fetching quotes for tickers I no longer hold?

No. Once an asset has zero quantity across all accounts and no recent activities, Wealthfolio stops scheduling quote refreshes for it. Historical quotes are retained.

## Multi-currency & FX

### Why does my gain/loss look wrong in my base currency?

Wealthfolio uses the FX rate **on the trade date** to convert each activity into your base currency. When the FX rate moves later, your unrealized gain/loss in base currency will move too — even if the security price didn't change. Worked example and the math: [Market Data & FX](https://wealthfolio.app/docs/concepts/market-data-and-fx/#fx-and-gain-loss).

### Can I change an account's currency after creating it?

No — the account currency is set at creation. Workaround: create a new account in the correct currency and use `TRANSFER_IN` to move the holdings over (cost basis is preserved).

### Can goals be in a non-base currency?

Goals are currently denominated in your base currency. Multi-currency goals are on the roadmap.

### How are FX rates fetched, and can I override them?

Rates come from your configured market data provider. To override, go to **Settings → Exchange Rates** and enter a manual rate for any pair — Wealthfolio will use your rate instead of the fetched one for that date forward.

## Performance metrics

### What does the percentage on my dashboard actually mean?

-   **Per-account %**: money-weighted return (MWR) — captures the impact of your timing decisions.
-   **Total portfolio %**: time-weighted return (TWR) — strips out contributions/withdrawals so it's comparable to a benchmark.

The two can disagree, and that's not a bug. See [Performance Metrics](https://wealthfolio.app/docs/concepts/performance-metrics/) for the full breakdown.

### Why did my return spike to a huge number?

Usually one of:

-   **Tiny starting denominator.** If your portfolio started at $100 and grew to $50,000, the % return is enormous. Common on long timeframes for recently-funded accounts.
-   **Manually-quoted asset with a step change.** Going from no price to a price creates a one-day jump.
-   **Bad provider data.** Yahoo occasionally returns spurious spikes; the Health Center flags these.

### Why does my account show profit but a specific holding shows a loss?

Two different lenses. The account % blends realized gains (sales + dividends + interest) with unrealized gains (current market value vs. cost basis). A single holding might be down, while realized income and other holdings carry the account into profit.

### Cost basis: FIFO only? Why no LIFO or average cost?

FIFO today, intentionally. It's the most defensible default for tax reporting in most jurisdictions and keeps lot accounting simple to reason about. LIFO and weighted-average cost are planned — additional cost-basis methods will be added in future versions. See [Cost Basis & Lots](https://wealthfolio.app/docs/concepts/cost-basis-and-lots/).

### Is "average cost" a moving average or FIFO?

The cost-basis accounting is **FIFO**. The **average cost** you see on a holding is just a display figure — the total cost basis of your open lots divided by the shares remaining. It is _not_ a moving-average accounting method, and Wealthfolio doesn't keep a running moving-average price.

This matters when you sell: realized gains close the **oldest lot first** (FIFO), not at a moving-average price. So in jurisdictions that tax on a moving average — such as Austria's _gleitender Durchschnittspreis_ — Wealthfolio's realized-gain figures will diverge from your tax calculation, and you'll need to reconcile manually.

Moving-average / weighted-average cost (WAC) is planned — additional cost-basis methods will be added in future versions. See [Cost Basis & Lots](https://wealthfolio.app/docs/concepts/cost-basis-and-lots/).

## Accounts & contribution limits

### How do I archive an account?

Settings → **Accounts** → edit the account → toggle **Active** off. Archived accounts keep their data but are hidden from the dashboard.

### TFSA / RRSP / 401(k) / IRA contribution tracking — how does it work?

Mark the account type, then Wealthfolio sums all `DEPOSIT` activities for the period and compares against the contribution limit you set. Full walkthrough: [Contribution Limits](https://wealthfolio.app/docs/guide/contribution-limits/).

### Why don't TRANSFER\_INs count toward contribution room?

By design — transfers between your own accounts aren't new contributions. If a transfer should count (e.g. a rollover from an external account that isn't tracked in Wealthfolio), use a `DEPOSIT` instead.

### Can I track real estate, vehicles, or other alternative assets?

Yes. Add the asset with kind **Property**, **Vehicle**, **Collectible**, **Precious Metal**, or **Liability**. The **Purchase price** field acts as cost basis. Update value manually as the asset appreciates or depreciates. See [Manage Accounts](https://wealthfolio.app/docs/guide/accounts/).

### Can I have a virtual / combined account spanning brokers?

There's no first-class "virtual account" yet. Two workarounds:

-   Build it as a custom security (a fund-of-funds symbol you update manually).
-   Use **Account Groups** in Settings to roll up performance and net worth across multiple real accounts without double-counting.

## Self-hosting & Connect

### Can I self-host? Do I still need Connect?

You can self-host for free. Connect is **optional** and only needed if you want automatic broker sync via SnapTrade, or end-to-end encrypted device sync. Self-hosting + manual imports needs nothing else. See [Self-Hosting](https://wealthfolio.app/docs/guide/self-hosting/).

### "Permission denied" or "attempt to write a readonly database" after upgrading

In **3.4.0+**, the Docker container runs as UID 1000 instead of root. If your existing data volume is root-owned, SQLite will fail to write.

**Fix:** stop the container, then:

```
sudo chown -R 1000:1000 /path/to/your/wealthfolio/data
```

Start it again. See the [self-hosting troubleshooting section](https://wealthfolio.app/docs/guide/self-hosting/#troubleshooting).

### Why is my self-hosted instance hitting wealthfolio.app?

The release-check ping (looking for updates). It carries no portfolio data. To disable, toggle off **Settings → General → Check for updates automatically**inside the app.

### Custom providers can't reach my LAN or reverse proxy

Wealthfolio doesn't block private IP ranges for custom providers — if the host resolves and responds, the fetcher runs. If you're not getting through, the issue is usually downstream: DNS, container networking, the reverse proxy's ACLs, or TLS verification. Test the provider URL from the same shell or container Wealthfolio runs from to isolate.

### Can mobile connect to my self-hosted instance?

Not natively, but the web interface works as a Progressive Web App. On iOS Safari, open your self-hosted URL and choose Add to Home Screen — you get app-like access. Full native iOS app for self-hosted instances is on the roadmap.

### Which Docker image should I pull?

`wealthfolio/wealthfolio` on Docker Hub. Pin to a specific tag for production (`wealthfolio/wealthfolio:3.4.0`) — `latest` will follow new major versions.

### OIDC / SSO support?

Yes — supported on the self-hosted web edition. Sign in through any OpenID Connect provider (Keycloak, Authentik, PocketID, Authelia, …) alongside or instead of the simple password; a successful SSO login mints the same session. Enable it with the `WF_OIDC_*` variables and set an email/subject allowlist. See the [OIDC configuration reference](https://wealthfolio.app/docs/guide/self-hosting/configuration/#single-sign-on-oidc).

## Addons & AI

### Where can I find addons?

The official discovery page is in flight. For now, browse the [wealthfolio-addons topic on GitHub](https://github.com/topics/wealthfolio-addons) or ask in [Discord](https://discord.gg/WDMCY6aPWK).

### How do I install a downloaded addon?

Download the `.zip` file, then **Settings → Add-ons → +** and select the zip. Wealthfolio will prompt for the permissions the addon requests before enabling it.

### How do I develop my own addon?

Start with the [Addon Development guide](https://wealthfolio.app/docs/addons/getting-started/). You'll need Node.js and pnpm. The dev mode supports hot-reload.

### Is the AI assistant private? Does it need a paid API?

You pick. Configure **Ollama** for fully-local inference (free, no data leaves your machine), or BYO API key for OpenAI, Anthropic, or any OpenAI-compatible endpoint. The assistant uses function-calling against your local database — it never sends raw rows to the model, only the result of explicit, typed queries. Full details: [AI Assistant](https://wealthfolio.app/docs/guide/ai-assistant/).

## Troubleshooting

### Windows SmartScreen or antivirus blocks the installer

Wealthfolio is signed, but some AV vendors flag new releases until they re-scan. Common fixes:

-   **SmartScreen:** click **More info** → **Run anyway**.
-   **Kaspersky / similar:** add an exception for the installer.
-   **Verify the download:** compare the SHA-256 hash from [releases on GitHub](https://github.com/wealthfolio/wealthfolio/releases).

### AppImage shows a blank screen on Linux

Usually a missing WebKit dependency. Install the recommended packages:

-   **Ubuntu / Debian:** `sudo apt install libwebkit2gtk-4.1-0 libsoup-3.0-0`
-   **Fedora:** `sudo dnf install webkit2gtk4.1 libsoup3`

If issues persist, run the AppImage from a terminal to see the error output and file an issue.

### The updater isn't working

Check that the app can reach `wealthfolio.app` (the release feed). If you're behind a corporate proxy, set `HTTPS_PROXY` in your environment. Worst case, download the new version manually from [GitHub releases](https://github.com/wealthfolio/wealthfolio/releases).

### Where are the application logs?

-   **Windows:** `%LOCALAPPDATA%\com.teymz.wealthfolio\logs`
-   **macOS:** `~/Library/Logs/com.teymz.wealthfolio`
-   **Linux:** `~/.local/share/com.teymz.wealthfolio/logs`

Attach the relevant log when filing an issue.

### My portfolio isn't updating

Try in order:

1.  Update to the latest version.
2.  Restart the app.
3.  Check your internet connection.
4.  Trigger a manual refresh — hover over the total value on the home page and click **Update Portfolio**.
5.  Open the [Health Center](https://wealthfolio.app/docs/guide/health-center/) — it'll flag stale quotes or data inconsistencies.

### I'm getting errors when importing data

Checklist:

1.  First row of the CSV is headers, not data.
2.  UTF-8 encoded, comma-separated, no smart quotes.
3.  Strip `$`, currency symbols, and thousands separators from numeric fields.
4.  Dates in ISO-8601 (`2025-03-15`) or a format the mapping step recognizes.
5.  Activity types and symbols mapped correctly in the preview step.
6.  For cash activities, the `amount` column is filled in.

Full reference: [CSV Import](https://wealthfolio.app/docs/guide/csv-import/).

* * *
