Performance starts with stored portfolio snapshots
A current balance cannot reconstruct the path a portfolio took. The service records aggregate snapshots on connect, synchronization and removal, then returns points for a requested range. The first tracked point is an explicit boundary: the API does not claim all-time performance for periods before reliable data exists.
Deposits and withdrawals are not investment return
External cash flows change portfolio value without representing profit or loss. Supported provider history is imported and valued near the event time so net contributions can be separated from market performance. Transfers whose history or historical USD price is unavailable reduce coverage instead of being silently classified as gain.
Modified Dietz accounts for timing
The API uses a Modified Dietz estimate when enough data exists. Each external flow is weighted by how long it was present in the selected period, producing a more meaningful return than dividing P&L by the opening value. It remains an estimate dependent on snapshot spacing, provider history and pricing quality.
Coverage is part of the result
Complete, partial, tracking-started and no-data states prevent an exact-looking percentage from outrunning its evidence. Product UI should show the coverage label near P&L and return, explain missing permissions or windows, and avoid ranking users or triggering alerts from a partial figure as though it were audited performance.
Request the range the user is viewing
Seven-day, thirty-day, ninety-day, one-year and all-time ranges have different start points but share the same coverage rules. Fetch a new range when the user selects it rather than downloading every snapshot in advance. Cache briefly at the BFF only if synchronization invalidates the cached series predictably.