The portfolio dashboard

The portfolio is your workspace landing page —ploxir.com/w/<slug>. Where a project dashboard shows one project's sources, the portfolio rolls every project and source in the workspace up into a single screen: total revenue across all your Stripe accounts, active users across every app, errors across every service — one tile each, no tab-switching.

Portfolio widgets vs. project widgets

A project widget reads from a specific data source. A portfolio widget fans out across every source of a given kind in the workspace and merges the results. Add a "Net revenue" portfolio widget and it sums every Stripe source across every project; add "Visitors" and it totals every analytics source it finds.

  • Pick a metric from the picker (widgets are grouped by platform) — the widget binds to the source kind, not one specific source.
  • It automatically picks up new sources of that kind as you connect them — no need to edit the widget. (This stops applying only if you convert the widget to a custom composition with hand-picked sources.)
  • It skips archived sources and projects you've hidden — the Hide option in a project's sidebar menu removes it from every portfolio rollup without deleting anything.

Each widget streams in independently — you'll see skeleton tiles fill in one by one on a large workspace instead of waiting for the slowest source.

How values are merged

Each widget shape merges in the way that's actually correct for it:

  • Numbers (KPIs) are summed across sources (e.g. revenue from three Stripe accounts), and the vs-previous delta is computed on the merged totals.
  • Charts are time-aligned by calendar day in your workspace timezone and summed, so one line represents the whole workspace — even when connectors bucket their days differently.
  • Tables interleave rows from every source, newest first (top 20 shown), with a Project column so you can see where each row came from.
  • Breakdowns sum items that share a label across sources (top 10 shown).
  • Rates (refund rate, conversion, open rate…) are recomputed from the underlying totals — never a naive average of per-source percentages, which would let a tiny source count as much as a huge one.
  • Status widgets (uptime checks) concatenate every source's checks into one list.
  • Cohorts and funnels aren't merged — a retention grid tracks one population and a funnel tracks one journey, so cross-source blending would be meaningless.
Currencies are never blindly summed
If your sources report different currencies, Ploxir does not add them into one meaningless number. Same-currency sources sum together; a mixed-currency KPI shows each currency's total on its own line so €, $, and £ stay separate. A mixed-currency chart draws the dominant currency's line and notes how many other currencies were omitted, so the number is never read as the whole picture.

Want one real total instead? Set an optional reporting currency for the workspace (the currency switcher in the dashboard toolbar, or Settings → General — Admin+). Every monetary widget is then FX-converted into it before merging, using daily ECB reference rates — charts convert each point at its own date's rate, not one blended rate — so mixed-currency workspaces still get a single honest number. Leave it on "Native" to keep currencies separate.

Some metrics simply aren't additive. Unique-user counts (visitors, reach, DAU) would double-count anyone present in more than one source, so instead of a wrong sum the widget shows the largest single source — a true lower bound — with a "largest of N sources · uniques can't be summed" note. The same policy applies to their charts.

See who contributes what
Hover a KPI tile and it flips over to a per-project breakdown — each project's contribution to the merged number, with its color dot. No configuration needed.

Time range and range chips

The range switcher at the top (Today, 7 days, This month, 30 days, 1 year, All time, or a custom from→to range) applies to every widget at once. Day boundaries are computed in your workspace timezone, so "today" means your today — not UTC.

Each range-following widget shows a small chip next to its title — (1D), (7D), (MTD), (30D), (1Y), or (ALL) — telling you exactly which window its number covers. Custom ranges show no chip; the chart x-axis dates carry the window instead. The window a widget actually uses is resolved in this order:

  1. A per-widget range lock (kebab menu → Range → Today / Last 7 days / This month / Last 30 days / Last year / All time). "Follow timeline" removes the lock.
  2. The page range, when you've explicitly chosen one with the switcher.
  3. The widget's own default range — many metrics ship with a sensible default (revenue defaults to 30 days), which is why a fresh revenue widget can show a (30D) chip on a page you haven't touched.
  4. Otherwise Today, the implicit page default.

Point-in-time widgets — current MRR, an account balance, open tickets — measure a state, not a window. They ignore the range entirely: no chip, and the kebab menu hides the Range option for them. If the range switcher "doesn't work" on a widget, that's why.

The custom composer

The Custom widget button in the picker builds one tile from hand-picked parts. Each part is a source plus a metric: a native connector metric (Stripe net revenue, Shopify orders…), a webhook event with an aggregation (count, running count, sum/avg/last of a payload field, distinct), or an HTTP/JSON endpoint path. Parts are summed into one value — there is no subtraction or free-form math (use a formula widget for ratios).

  • Display as: Number, Text, Chart, Table, Breakdown, or List — the palette only offers what your chosen sources can actually produce.
  • Custom compositions bind to the exact sources you picked. A source you connect later does not join automatically — that's the trade-off versus a standard fan-out widget.
  • A standard fan-out widget can be converted the other way: kebab → Edit → "Convert to custom composition (hand-pick sources)".
  • This is also how webhook and HTTP/JSON data gets onto the portfolio — those sources don't appear as platform groups in the portfolio picker; you reach them through Custom widget parts.

Formula widgets

Formula widgets compute business ratios from widgets you already have. They exist on the portfolio only, under Ratios & formulas in the Add-widget picker. Eight templates:

TemplateFormula
ARPUrevenue / customers
LTVARPU / churn rate
CACacquisition spend / new customers
LTV:CAC ratioLTV / CAC
Rule of 40growth % + profit margin %
NRR(start + expansion − churn − contraction) / start
Gross margin(revenue − COGS) / revenue
CAC payback (months)CAC / (ARPU × gross margin)

Each input is either a KPI widget already on your portfolio (picked by name) or a constant you type (a churn rate, monthly ad spend, COGS…). The value recomputes live with its inputs — change the range and the formula follows. If a source feeding a referenced widget is broken, the formula card shows an amber warning naming it, so a formula built on a dead source never looks healthy. Removing a formula never touches the widgets it references.

Notes and dashboard tools

Tool widgets need no data source — they pin context next to your numbers. All of them ignore the time range:

  • Note / sticky — lightweight markdown, edited directly on the tile. It autosaves as you type; copy and clear buttons sit in the tile header.
  • Clock — current time in any timezone, for global teams.
  • Countdown — days/hours until a launch, deadline, or quarter-end.
  • Goal progress — a target plus a manually updated current value, shown as a progress bar (number, currency, or percent).
  • Quick links — a bookmark panel for the dashboards you open daily.

Grid, layout and density

  • Drag any tile to reorder — the order persists for everyone. The kebab menu also has Move left / Move right.
  • Resize from the kebab menu: any span from 1×1 to 6×6 (columns × rows).
  • Style from the kebab: background color, text color, chart color, a glossy finish — or reset to theme defaults.
  • The grid fits as many columns as your screen allows; on phones it collapses to two.

Dashboard density (Settings → General) controls the tile size: Comfortable (larger tiles, right for laptops), Compact, or Dense (small tiles that maximise what a big monitor shows). It's a per-user preference — your choice doesn't change what teammates see.

Refreshing and live updates

The portfolio updates in real time: when a webhook fires or a sync completes, the affected widgets refresh on their own over a live connection — you never reload the page. The toolbar's Refresh button shows how long ago the workspace last synced and force-syncs every source in the workspace right now — useful for poll-only sources that otherwise update on a 2–24 hour cadence. See Real-time updates for which sources push and which are polled.

Roles apply here too
Viewers see the portfolio read-only — the add and edit affordances are hidden, not just disabled, and every change is re-checked server-side. Editors and above can build and rearrange everything on this page. See Workspaces & members.

FAQ

Why does a widget show a (30D) chip when I haven't picked a range?

Many metrics ship with their own default window — revenue defaults to the last 30 days, because "revenue today at 9am" is usually $0 and useless. The widget's own default applies until you explicitly choose a page range or set a per-widget range lock; the chip always tells you the window actually in use.

Why doesn't the range switcher change my MRR widget?

MRR, balances, and open-ticket counts are point-in-time states, not windowed flows — "MRR over the last 7 days" isn't a thing. Those widgets ignore the range, show no chip, and have no Range option in their kebab menu.

I connected a second Stripe account. Do I need to edit my widgets?

No. Standard portfolio widgets fan out across every source of their kind, so the new account joins the merge automatically. The one exception is a widget you've converted to a custom composition — that binds to the exact sources you picked, and you'd add the new one in its edit dialog.

Why do I see two stacked amounts on one tile instead of a total?

Your sources report different currencies, and adding €, $, and £ into one number would be nonsense — so the tile shows each currency's total separately. To get one real number, set a workspace reporting currency (toolbar currency switcher, Admin+); everything is then FX-converted before merging.

Can I subtract one metric from another in the custom composer?

No — composer parts are always summed. For ratio math (revenue per user, margin, LTV:CAC) use the eight formula templates; there's no free-form formula editor beyond those today.

Why does a "visitors" widget say "largest of N sources"?

Unique-user counts can't be summed across sources — the same person on two properties would be counted twice. Rather than show an inflated number, the widget shows the largest single source (a true lower bound) and says so.

How do I see which project contributes what to a number?

Hover the KPI tile — it flips to a per-project breakdown with each project's share of the merged value.

How do I keep a project out of the portfolio?

In the sidebar, open the project's menu and choose Hide. Its sources stop contributing to every portfolio widget; the project page itself keeps working, and Show in the same menu brings it back at any time.

Can my custom webhook events appear on the portfolio?

Yes — build a Custom widget and add a part that points at your webhook source: pick the event name and an aggregation (count, sum of a payload field, latest value…). Webhook sources don't appear as a platform group in the portfolio picker; the composer is the path.

My formula widget errors about mixed currencies. Why?

One of its input widgets is merging more than one currency, so its headline value only covers the dominant currency — computing a formula on that slice would silently ignore the rest, and Ploxir refuses to. Set a workspace reporting currency so the input becomes one honest number, and the formula computes.