Master global portfolio management with robust multi-currency support. Track funds in their native currencies, aggregate at the portfolio level, and maintain accurate FX rate snapshots for time-travel analysis.
Nagare is built from the ground up to handle multi-currency portfolios correctly. Unlike traditional fund forecasting systems that force everything into a single currency at storage time, Nagare preserves the source currency of every transaction and projection, then converts on-the-fly as needed.
1. Store: Always in sourceCurrency (e.g., a EUR fund stores all values in EUR)
2. Calculate: In sourceCurrency (projections stay in native currency)
3. Display: Convert on-the-fly to user preference (e.g., view EUR fund in USD)
4. Aggregate: Convert to reportingCurrency (e.g., portfolio-level metrics in USD)
5. Track: Snapshot FX rates used (for time-travel and audit trails)
No rounding errors from repeated conversions. A EUR 100M fund stays EUR 100M, converted only when displayed.
FX rate snapshots let you answer "What was the portfolio NAV in USD on Q3 2023 using Q3 2023 FX rates?"
View the same portfolio in multiple currencies without data loss. Switch between USD, EUR, GBP, etc.
Mix USD, EUR, GBP, JPY, CNY funds in a single portfolio. Aggregate metrics reflect true portfolio value.
Nagare supports 20+ major currencies out of the box:
New currencies can be added to the Currency enum in the database schema. Contact support or add it yourself in packages/types/src/enums.ts and run migrations.
Before tracking multi-currency funds, you need to configure your portfolio's currency settings. This defines how funds are aggregated and displayed.
The "home currency" of your portfolio. This is typically the currency of your LP base (e.g., USD for US-based funds, EUR for European funds).
baseCurrency: "USD"The currency used for portfolio-level aggregations and reports. Can be different from base currency (e.g., report in EUR even if base is USD).
reportingCurrency: "USD"curl -X POST https://api.nagarehq.com/api/v1/portfolio-config \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"baseCurrency": "USD",
"reportingCurrency": "USD",
"allowMultiCurrency": true,
"defaultFxRateSource": "ECB"
}'{
"portfolioConfigId": "PC-1710518400000-ABC123",
"baseCurrency": "USD",
"reportingCurrency": "USD",
"allowMultiCurrency": true,
"defaultFxRateSource": "ECB",
"tenantId": "your-tenant",
"createdAt": "2024-03-16T10:30:00Z"
}Each tenant (organization) has one portfolio configuration. If you need multiple configurations (e.g., different portfolios with different base currencies), use separate tenants.
FX rates are stored in the FXRate table. Each rate represents the exchange rate from one currency to another on a specific date.
curl -X POST https://api.nagarehq.com/api/v1/fx-rates \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fromCurrency": "EUR",
"toCurrency": "USD",
"rate": 1.0875,
"date": "2024-03-15",
"source": "ECB"
}'Retrieve rates for a specific currency pair and date range:
curl -X GET "https://api.nagarehq.com/api/v1/fx-rates?fromCurrency=EUR&toCurrency=USD&startDate=2024-01-01&endDate=2024-03-31" \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY"{
"rates": [
{
"fxRateId": "FX-1",
"fromCurrency": "EUR",
"toCurrency": "USD",
"rate": 1.0850,
"date": "2024-01-15",
"source": "ECB"
},
{
"fxRateId": "FX-2",
"fromCurrency": "EUR",
"toCurrency": "USD",
"rate": 1.0875,
"date": "2024-02-15",
"source": "ECB"
},
{
"fxRateId": "FX-3",
"fromCurrency": "EUR",
"toCurrency": "USD",
"rate": 1.0900,
"date": "2024-03-15",
"source": "ECB"
}
],
"count": 3
}For real-time conversions, fetch the most recent rate:
curl -X GET "https://api.nagarehq.com/api/v1/fx-rates/latest?fromCurrency=EUR&toCurrency=USD" \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY"Manually adding FX rates is tedious. Nagare includes a CLI script to bulk-import historical rates from the European Central Bank (ECB), which provides free, reliable daily rates for 40+ currencies.
cd apps/api
npx tsx scripts/import-ecb-fx-rates.ts --since 2020-01-01This script:
For production, schedule the import script to run daily via cron or Cloud Scheduler:
0 6 * * * cd /app && npx tsx scripts/import-ecb-fx-rates.ts --since yesterdayThe ECB provides rates for all major currencies against EUR. Nagare automatically creates inverse pairs (e.g., if ECB provides EUR→USD, Nagare also creates USD→EUR).
Each fund is denominated in a source currency. All fund parameters, transactions, and projections are stored in that currency.
curl -X POST https://api.nagarehq.com/api/v1/funds \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fundId": "EUROPEAN-VENTURE-I",
"fundName": "European Venture Fund I",
"fundType": "VENTURE_CAPITAL",
"currency": "EUR",
"vintage": 2024,
"parameters": {
"parameterType": "MASTER",
"totalCommitment": 100000000,
"expectedReturn": 2.5,
"fundLifeYears": 10
}
}'A typical global portfolio might include:
When calculating a scenario that includes all these funds, Nagare:
Nagare's FX conversion logic is designed for accuracy and auditability.
If a direct rate exists (e.g., EUR→USD), use it directly.
EUR 100M × 1.0875 = USD 108.75MIf only the inverse rate exists (e.g., USD→EUR), calculate the reciprocal.
USD 100M ÷ 1.0875 = EUR 91.95MIf neither direct nor inverse exists, use a common base (typically USD or EUR).
GBP 100M × 1.27 (GBP→USD) = USD 127MUSD 127M × 150 (USD→JPY) = JPY 19,050MIf source and target currencies are the same, return the value unchanged.
USD 100M → USD 100MWhen converting for a specific date, Nagare looks for the FX rate closest to (but not after) that date:
If no FX rate exists for the requested date (or earlier), the conversion will fail with an error:"No FX rate found for EUR→USD on or before 2024-03-15"Solution: Import historical FX rates using the ECB import script.
Every calculation in Nagare creates an FX rate snapshot—a record of which FX rates were used to convert currencies. This enables time-travel analysis: "What was our portfolio NAV in Q3 2023 using Q3 2023 FX rates?"
Answer questions like: "Why did our USD-equivalent NAV change? Was it fund performance or FX movements?"
Compare current forecast to historical forecast using the same FX rates (eliminates FX noise).
Demonstrate which FX rates were used for regulatory reporting at specific dates.
Scenario record{
"scenarioId": "SCN-123",
"fxSnapshot": {
"EUR/USD": 1.0875,
"GBP/USD": 1.2650,
"JPY/USD": 0.0067,
"SGD/USD": 0.7420
},
"snapshotDate": "2024-03-15"
}curl -X POST https://api.nagarehq.com/api/v1/fx-rates/convert \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 10000000,
"fromCurrency": "EUR",
"toCurrency": "USD",
"date": "2024-03-15"
}'{
"amount": 10000000,
"fromCurrency": "EUR",
"toCurrency": "USD",
"convertedAmount": 10875000,
"rate": 1.0875,
"date": "2024-03-15"
}curl -X POST https://api.nagarehq.com/api/v1/fx-rates/convert-batch \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversions": [
{"amount": 10000000, "fromCurrency": "EUR", "toCurrency": "USD"},
{"amount": 5000000, "fromCurrency": "GBP", "toCurrency": "USD"},
{"amount": 100000000, "fromCurrency": "JPY", "toCurrency": "USD"}
],
"date": "2024-03-15"
}'curl -X DELETE https://api.nagarehq.com/api/v1/fx-rates/FX-123 \
-H "Authorization: Bearer fnd_live_YOUR_API_KEY"Before creating multi-currency funds, import at least 2-3 years of historical FX rates. This ensures projections can convert past transactions correctly.
Automate the ECB import script to run daily. This keeps your FX rates current without manual intervention. Use a cron job or Cloud Scheduler.
Choose one reporting currency for all scenarios and dashboards (usually USD or EUR). Switching reporting currencies makes time-series comparisons difficult.
When reviewing historical scenarios, check the FX snapshot to understand which rates were used. This prevents confusion when comparing old vs new forecasts.
If your portfolio has a formal FX hedging strategy, document it in scenario descriptions or fund notes. Nagare calculates spot conversions by default (no hedging).
Occasionally check for missing FX rates (e.g., weekends, holidays). ECB doesn't publish rates on non-business days, so Nagare uses the most recent rate.
Error: "No FX rate found for EUR→USD on or before 2024-03-15"
Solution: Import FX rates for the required date range using the ECB import script. If the currency pair isn't supported by ECB, manually add rates via the API.
Cause: FX rate discrepancies (e.g., using spot rate for aggregation vs snapshot rate).
Solution: Ensure all aggregations use the same FX snapshot. Check the fxSnapshot field in the scenario record.
Common causes: Network issues, ECB XML endpoint down, invalid date range.
Solution: Check the ECB endpoint is accessible. Verify the date range is valid (not future dates). Re-run with --since flag for specific date.
Check: Are you using the direct rate or inverse? Cross-rate calculations?
Solution: Use the /fx-rates/convert endpoint to test conversions manually. Check the exact rate used via /fx-rates/latest.
Expected behavior: FX rates change over time. If you recalculate an old scenario with today's rates, USD equivalents will differ.
Solution: Use the snapshotted FX rates from the original calculation for apples-to-apples comparison. Check scenario.fxSnapshot.
With multi-currency support configured, explore Monte Carlo simulations for probabilistic forecasting and portfolio analytics for advanced metrics.