Financial Insights
Bliss generates AI-powered financial reports that analyze your patterns across four cadences — monthly, quarterly, annual, and portfolio-specific.
How it works
Sixteen financial lenses organized into six categories (Spending, Income, Savings, Portfolio, Debt, Net Worth) examine your transaction and portfolio data. Each insight is generated by your configured LLM provider and persisted additively — old insights are kept for historical context, not replaced. A data-completeness check runs before every generation so partial periods are never compared to full ones.
The prompt sent to the LLM is built in four cacheable layers (identity, tier addendum, lens-specific rubrics, few-shot examples) so providers like Anthropic and Gemini can serve repeat runs from cache. Before the call, a deterministic JS pre-pass computes the heavy lifting — month-over-month deltas, top movers, top-category share vs the user’s own 6-month baseline, anomalies (categories above 2σ from their own mean), savings-rate decomposition, and net-worth split between contributions and market change. The model writes prose about pre-computed signals rather than recomputing arithmetic, which is the single biggest reason output quality is high and consistent across providers.
Output is structured: each provider validates the response server-side (Anthropic via forced tool use, OpenAI via strict response_format: json_schema, Gemini via responseSchema). When the model genuinely has nothing to report — completeness gate fails, no active lenses, or it returns an empty array — the page surfaces a “No insights for this period yet — try regenerating in a few minutes” message instead of fabricating filler.
The four tiers
Monthly (2nd of each month)
A month-over-month and year-over-year health check. Covers spending velocity, category concentration, income stability, savings rate, and net worth trajectory for the previous month.
Quarterly (3 days after quarter close)
Seasonal trend analysis across a full quarter. Identifies patterns that monthly snapshots miss — holiday spending spikes, quarterly income cycles, and longer-term drift. Includes a passive income outlook (see below) and how much of the quarter’s income was passive.
Annual (January 3rd)
A comprehensive year-in-review covering all six categories. Compares the full year against the prior year and highlights the biggest shifts in your financial profile.
Portfolio (every Monday)
Equity-specific intelligence powered by the SecurityMaster reference table. Analyzes the portfolio’s asset-class mix (stocks, index / sector / bond ETFs, REITs, funds, government and corporate bonds, real estate, crypto — the same classes as Equity Analysis) with a fixed-income summary, sector + industry concentration, and dividends. Sector concentration is measured against your whole equity book: individual stocks and REITs count by their sector, and broad ETFs count as diversified exposure — part of the total, never flagged as a sector — so a portfolio that is mostly a world ETF plus a few tech stocks doesn’t read as “100% Technology”. Bonds, property and crypto are never flagged as a sector either. (When ETF composition data is available, an ETF is split across the sectors it holds.) The dividend figure is Bliss’s own 12-month projection for your stocks and ETFs (see Passive Income), not an estimate from yields. Weighted P/E vs the broader market is included as context only; third-party fundamentals data is approximate and the lens is intentionally tuned not to alarm. Holdings whose Twelve Data fundamentals are flagged as untrusted (see the Maintenance guide) are silently excluded from the insight rather than fed to the model with potentially-wrong numbers — wrong data is worse than missing data here.
Passive income outlook
The Portfolio, Quarterly and Annual tiers include a Passive income outlook whenever you hold something that produces income or have an income stream. It uses the numbers from the Passive Income projection: the next 12 months of income (investment income and other streams like allowances shown separately), what actually arrived over the last 12 months, the share of your essential spending it covers, the largest sources, and income that stops within the year (a bond maturing, a lease ending).
- Warning when 20% or more of projected income ends within 12 months, or one holding or stream is more than half of it.
- Positive when essential-spending coverage crosses 25%, 50%, 75% or 100% since the previous insight of the same tier.
- Figures are always described as gross (before tax); floating-rate and inflation-linked income is flagged as based on the rates you assumed; allowance and welfare streams are never called investment income.
- When fewer than 80% of your holdings have income terms, the insight says the projection is incomplete, names what’s missing, and shows a Set up income terms link to the Passive Income page.
Enabling insights
Insights use the same LLM provider you configured for transaction classification. Pick one in .env:
LLM_PROVIDER=gemini # or openai, or anthropic
GEMINI_API_KEY=your_api_keySee Choosing Your External Services for full provider setup details.
The insights tier uses whichever model is configured for your provider (per-provider defaults are documented in Choosing Your External Services). You can override via env var:
INSIGHT_MODEL=gpt-4.1 # override the active provider's default insight modelA daily cron job at 6 AM UTC acts as a scheduling heartbeat — it checks each tier’s calendar window and only triggers generation when the window is open. The portfolio tier runs on its own cron at 5 AM UTC every Monday.
Without a configured LLM provider, the insights page remains accessible but empty.
Using the insights page

The insights page organizes your reports into browsable categories:
- Category tabs — Filter by Spending, Income, Savings, Portfolio, Debt, or Net Worth
- Severity chips — Focus on what matters: Positive, Info, Warning, or Critical
- Tier badges — Each insight shows which cadence generated it (Monthly, Quarterly, Annual, Portfolio)
- Period selector — Browse insights from any past period
- Manual refresh — Pick a tier and period, then generate on demand. Use the
forceoption to bypass the completeness check for partial periods - Dismiss and restore — Hide insights you’ve acted on. Dismissed state persists even when the same period is regenerated
Deduplication
Insights are deduplicated by (tier, periodKey, dataHash). If your underlying data hasn’t changed since the last generation, regenerating a period is a no-op — no duplicate insights are created.
Retention
Each tier has a different retention window:
| Tier | Retention |
|---|---|
| Monthly | 2 years |
| Quarterly | 5 years |
| Annual | Forever |
| Portfolio | 1 year |
Expired insights are cleaned up via the TTL retention service.
Next steps
- Choosing Your External Services — which LLM to use for insights
- AI Classification — insight quality depends on accurate classification
- Investment Portfolios — the portfolio tier uses SecurityMaster fundamentals
- Explore the Insights spec for full technical details