Core concepts

A handful of ideas. Once you have them, everything else is mechanical.

The mental model

Everything in Ploxir hangs off one chain: account → workspaces → projects → sources → snapshots → widgets.

Your account            plan (Free / Pro / Team) lives HERE └─ Workspace: acme      limits come from the owner's plan ├─ Project A — Storefront │  ├─ Source: Stripe (live)          → snapshots │  ├─ Source: Plausible (acme.com)   → snapshots │  └─ Project widgets: MRR · Refund rate · Top pages ├─ Project B — Mobile app │  ├─ Source: RevenueCat             → snapshots │  └─ Project widgets: Active subs · Trial starts └─ Portfolio └─ Workspace widgets: Total revenue (merges every matching source)
  • Your account is you — your login, your 2FA, your subscription plan.
  • A workspace is a tenant: members, projects, sources, widgets, settings. Fully isolated from every other workspace.
  • A project is one business (a SaaS, a store, an app) with its own dashboard.
  • A source is one connection to one external service — Stripe with a specific account, one Plausible site.
  • A snapshot is the latest data Ploxir fetched from a source — the cache widgets read at render time.
  • A widget is a tile that turns source data into a number, chart, table, or breakdown.

Account

Your account holds your sign-in methods (email/password, Google, Apple, GitHub), two-factor auth, and — importantly — your subscription plan. Plans belong to accounts, not workspaces: one Pro or Team plan covers every workspace you own. See Plans & billing and the limits section below.

Workspace

A workspace is a tenant: it holds a roster of members, every project, every connected data source, and every widget. Workspaces are fully isolated — data and secrets never leak across them.

You can belong to several workspaces at once — your personal one, a client's, an agency's — and switch between them from the workspace picker in the sidebar. Each workspace lives at its own URL:

ploxir.com/w/acme/         — Acme's portfolio ploxir.com/w/acme/p/abc    — Acme's "Storefront" project ploxir.com/w/personal/     — your personal workspace

The slug after /w/ identifies the active workspace. Bookmarks and Slack links deep-link directly — no need to switch first. Member rosters, notification preferences, and two settings that shape every number live per workspace:

  • Timezone — decides where "today" and "this month" start and end for every range on every dashboard. If your daily numbers look shifted, check this first (Settings → General, Admin+).
  • Reporting currency — optional. When set, every monetary widget is converted into it using daily ECB FX rates. When unset ("Native"), each source shows its own currency and Ploxir never silently sums different currencies into one number (Admin+).

The four roles

A member is a user attached to a workspace with a role. Roles are per workspace, not global — the same person can be Owner in one workspace and Viewer in another. Every server action re-checks the caller's role on the server, so permissions hold even if someone crafts a request by hand. In order of power:

  • Viewer — read-only. Sees every dashboard and can inspect a source's event history, but edit affordances (kebab menus, "New project" buttons, add-widget tiles) are hidden entirely.
  • Editor — builds the dashboards: create projects, create / edit / resize / rearrange / delete widgets on both the project pages and the portfolio, formula widgets, project settings and logo, hide/show a project on the portfolio, and the Refresh button (force-sync). Editors can not connect, modify, or delete data sources.
  • Admin — wires the data plumbing and runs the team: everything an Editor can do, plus create / rename / reconnect / delete sources, reveal webhook URLs, start history imports, delete projects, invite and remove members (Admins can change roles only between Editor and Viewer — they can't touch other Admins), and workspace settings (name, timezone, reporting currency, Slack/Discord notifications).
  • Owner — exactly one per workspace: everything an Admin can do, plus change the workspace URL slug, transfer ownership, and delete the workspace. The Owner's account plan sets the workspace's limits.
Why can't Editors add sources?
Source credentials are a production trust boundary — a Stripe key, an OAuth token, a webhook URL. Editors shape how data is displayed; Admins control what data enters the workspace. If an Editor needs a new connector, an Admin connects it once and every Editor can build on it.

Members join via invitations: single-use links bound to the invited email address, valid for 7 days, revocable and re-sendable until accepted. Full details in Workspaces & members.

Project

A project is one of your businesses (a SaaS, a site, an app). Each project has its own grid of widgets, its own data sources, and its own dashboard page. How many you can create per workspace depends on the owner's plan — see the limits table below.

Why projects?
So one workspace can track multiple businesses at once without metrics colliding. Your indie studio with 5 products gets 5 cleanly-separated dashboards plus a workspace portfolio that rolls them up. A project you don't want in the roll-up can be hidden from the portfolio via its sidebar menu.

Deleting a project archives it — its sources and widgets disappear from every dashboard, and the portfolio stops aggregating them immediately.

Data source

A data source is a connection to one external service. Sources live inside a project. There are two families:

Native connectors (51 platforms)

Purpose-built integrations — Stripe, Shopify, GA4, Plausible, RevenueCat, and 46 more — each shipping its own set of ready-made widgets (1,284 across all connectors). You authenticate one of three ways depending on the platform: one-click OAuth ("Connect with X"), paste an API key, or — for the crypto wallet connector — simply paste a public address (BTC, EVM, or SOL; no credential involved at all). The full per-platform setup recipes live in Data sources.

The 3 generic sources

For anything without a native connector, bring your own data:

  • Webhook ("Any platform") — Ploxir issues you a unique URL; you POST events to it and build widgets that count, sum, and break down those events. See Custom webhooks.
  • Your own endpoint (HTTP/JSON) — Ploxir polls a JSON endpoint you control and widgets map paths out of the response.
  • Uptime monitor — give it up to 20 URLs; Ploxir GETs each one and a 2xx/3xx response (or a status code you specify) within 10 seconds counts as up.

Source lifecycle

  • Credentials die eventually. When a token is revoked or expires, the source and its widgets turn red with a Reconnect prompt and automatic retries stop — a dead credential is never silently rendered as healthy zeros. Reconnecting an API-key source swaps the key on the same source, so every widget and all history are preserved.
  • Deleting a source removes its widgets with it, at the same instant — a widget is never left silently rendering frozen data from a dead source. Deletion is an archive, not a hard delete: for Stripe, reconnecting the same account later revives the source and its widgets.

How data flows

Data reaches your dashboard through three paths:

  • Webhook push (seconds). Ten providers register their webhooks automatically when you connect: Stripe, Shopify, Patreon, Twitch, Paddle, Lemon Squeezy, PayPal, Beehiiv, Zendesk, and Datadog. Your own generic webhook sources are push too. Updates appear on the dashboard live over a streaming connection — no page reload.
  • Scheduled poll (hours). Everything else is re-fetched on a per-platform cadence — 6 hours for most connectors, 2 hours for fast-moving ones (Datadog, Sentry, crypto wallet), 24 hours for AdSense (whose earnings finalize with a delay anyway). Some platforms (Gumroad, RevenueCat, Chargebee, …) can additionally push if you paste Ploxir's receiver URL into their webhook settings — see each platform's entry in Data sources.
  • Manual refresh (now). The Refresh button in the dashboard header force-syncs everything immediately — all sources in the workspace from the portfolio, the project's sources from a project page (Editor+).

Snapshots vs events

Behind the scenes, polled and OAuth sources produce snapshots — a blob holding the latest fetched state. Widgets read from the freshest snapshot at render time; snapshots are a short-lived cache (about 7 days), not your historical record. Webhook sources skip snapshots and read stored event rows directly, so webhook widgets can be queried over any date range. Either way the widget surface looks the same.

Long-term history builds forward from the day you connect: Ploxir records daily datapoints (kept for 400 days) that power charts and vs-previous deltas. Stripe is the one exception — connecting it triggers a full backfill of your account history.

Widget

A widget is a tile on a dashboard. Each one reads from one or more sources and renders one of these kinds:

  • KPI — a single number with an optional sparkline and trend arrow
  • Ratio — one value divided by another (refund rate, ARPU, LTV:CAC)
  • Chart — a time-series area chart, full-tile
  • Table — recent rows (transactions, orders, pageviews, …)
  • Breakdown — bar list (top countries, top pages, top customers)
  • Status — green/red dots for uptime checks
  • Cohort — retention grid
  • Funnel — conversion steps
  • Tool — utility tiles (clock, countdown, sticky note, goal, links)

Widgets live on two planes: project widgets sit on a single project's dashboard and read from that project's sources. Workspace widgets sit on the portfolio page and roll up every matching source across every project — KPIs summed, charts time-aligned, tables interleaved with a project column. See The workspace portfolio for the merge rules.

Which date range does a widget show?

Every dashboard has a page-level range switcher (Today / 7 days / This month / …), but a widget's effective window follows a precedence:

  1. A per-widget range lock (set from the widget's kebab menu) always wins.
  2. Otherwise, a range you explicitly picked in the page switcher applies.
  3. Otherwise, the widget's own default range applies — that's why a fresh revenue widget shows a "30D" chip on a page you never touched.
  4. Otherwise, the page default: Today.

Point-in-time widgets — MRR, account balances, open tickets — describe current state, so they ignore ranges entirely and show no range chip.

Plan limits live on the account

Subscription plans belong to user accounts, not workspaces. A workspace's effective limits come from its owner's plan:

PlanWorkspaces you can ownProjects per workspaceMembers per workspace
Free131
Pro3101
Team10Unlimited10
EnterpriseUnlimitedUnlimitedUnlimited
  • Invited members consume no quota of their own — their personal plan (or lack of one) never affects a workspace they were invited into.
  • Limits gate creation only. If you downgrade, nothing existing is ever locked or deleted — you just can't create more workspaces, projects, or invitations past the cap.
  • Ownership transfer moves the workspace onto the new owner's plan — and is blocked if the recipient is already at their workspace limit.

Prices, upgrades, and the beta arrangement are covered in Plans & billing.

FAQ

Why does my new revenue widget say "30D" when the page is on Today?

Because you haven't explicitly picked a page range, the widget's own default range (30 days for most revenue widgets) applies. Pick any range in the page switcher and the widget follows it; lock a range from the widget's kebab menu and it stops following the page entirely.

Why doesn't my MRR tile change when I switch the range?

MRR, balances, and other current-state widgets describe right now, not a window of time. They ignore the range switcher by design and don't show a range chip.

Can an Editor connect our Stripe account?

No — connecting, reconnecting, and deleting sources is Admin+. Credentials are a trust boundary: Editors build and arrange widgets on data an Admin has wired in.

What happens to my widgets if I delete a source?

They're removed together with it, at the same instant — never left showing a frozen last value. Deletion is an archive rather than a hard delete; for Stripe, reconnecting the same account later restores the source and its widgets.

How fresh are my numbers?

Push sources (Stripe, Shopify, your own webhooks, and the other auto-registered providers) update within seconds. Polled sources refresh every 2–24 hours depending on the platform. The Refresh button force-syncs everything immediately.

Can two projects or two workspaces share one source?

No. A source belongs to exactly one project in exactly one workspace. If you need the same Stripe account in two places, connect it twice — this keeps blast-radius bounded if one workspace is compromised.

A teammate on the Free plan joined our Team workspace — does that limit us?

No. Only the workspace owner's plan matters. Invited members bring no quota and their own plan is irrelevant inside your workspace.

Why do my "today" numbers look shifted?

Day boundaries follow the workspace timezone (Settings → General). If it's still UTC while you're in New York, "today" starts around 8 pm your time. An Admin can fix it in one click; every range recalculates immediately.