Stats & Auto Collection
Set up stat columns, configure auto collection, and visualize your data with charts.
Last updated: 2026-05-18
Stats is the core feature of Opseer. Define what metrics to track from your connected database, and Opseer collects them automatically every day. View trends with charts and receive daily reports via your configured alert channels.
Widget groups
Stat widgets are divided into two groups based on their purpose:
- Summary (Number, Gauge) — View today/yesterday metrics at a glance. No size selection, uniform sizing.
- Trend (Line, Bar, Area) — Analyze changes over time. Three size tiers: Small (4 per row) / Medium (2 per row) / Full (1 per row).
On the Stats page, summary widgets appear at the top and trend widgets at the bottom. Reordering is available within each group. Switching a widget's chart type from the ⚙ menu also moves it between summary/trend groups automatically.
Adding a stat column
Each stat column represents one metric you want to track over time. The create/edit page has a single settings card on the left and a terminal on the right (fixed block + log stream) so you can see the widget preview and change history as you configure.
Left card order: Chart type → Display name → Platform (if multi-DB) → Table → Aggregation/aggregation column → Date column → Conditions (WHERE) → Target value → Default period → Widget size → Save.
When selecting a chart type, summary and trend groups are visually separated. Selecting a summary type hides the size option, while trend types offer Small/Medium/Full size selection.
Create a column in Visual mode
Default authoring style. Select a table, choose an aggregation, and optionally filter by a date column. On multi-DB projects, pick the target DB via the platform selector.
Click "Add Column"
On the Stats page, click the add column button.
Pick chart type
Number card, gauge, line, bar, or area.
Enter display name
Give it a descriptive label like "Daily Signups". The internal ID (column_key) is auto-generated.
Pick platform (multi-DB only)
Choose which DB (Supabase / Neon) to query against. Single-DB projects skip this step.
Pick a table
Loaded via PostgREST OpenAPI (Supabase) or information_schema (Neon).
Pick aggregation
COUNT, SUM, AVG, MIN, MAX. SUM/AVG require an aggregation column.
Date column (optional)
If set, aggregates yesterday only (daily). If unset, aggregates the whole table daily (cumulative).
Conditions (optional)
Build WHERE clauses via GUI. AND/OR groups supported.
Display settings
Target value / default period / widget size, adjusted per chart type.
Save
Query validation runs automatically on save. Queries over 5s are rejected with index suggestions.
SQL Mode is temporarily disabled (Coming Soon). Existing SQL columns remain editable, but new creation is Visual-only. Re-enabling pending security review.
Default period
Each stat widget can have a default display period. Summary widgets default to "Today" and trend widgets default to "7d". Select "Follow Global" to use the dashboard's global period filter.
The global period filter offers Today/Yesterday/7d/30d/90d options. When selecting a period beyond the loaded data range, data is automatically fetched from the server.
Auto collection
Once stat columns are configured, Opseer collects values automatically every day at your project's configured collection time. Auto collection is available on all plans including Free.
- At your scheduled time, the Opseer Edge Function runs each stat column's query against your database
- Results are stored in the project_stats_data table in the Opseer DB
- Auto stats (Auth-based) are also collected at the same time
- If alert channels are enabled, a daily report is sent to your configured channels
Collection time and alert delivery
Auto collection time and alert delivery time share the same setting. You can view and change this time from 3 places:
- Stats page — collection time button at top left (click to modify)
- Project settings — auto collection item (read-only, click to navigate to alert settings)
- Alert settings — delivery time setting (alongside channel configuration)
Auto collection runs even without alert channels configured. Without channels, only collection runs — no report is sent.
Daily report delivery requires Starter plan or above. Free plan supports auto collection only.
Auto refresh
When accessing the Stats page or project dashboard, if the last collection time is more than 3 hours ago, an automatic refresh is triggered. The refresh runs server-side during page load so the latest values appear immediately; manual refresh shows a pulsing animation on the data area.
The collection timestamp is managed per project, so in team projects, when one member triggers a refresh, other members will see the updated data.
Auto stats (Supabase Auth)
When Supabase is connected, Auth-based auto stats become available:
- Total Users — Total number of users
- New Signups — Today's new registrations
Auto stats can be enabled/disabled from the Integrations page. Data is collected from the connected Supabase project's Auth users — no query configuration needed.
Auto stats can also be disabled from the Stats page. When disabled, collected data is preserved. To re-enable, go to the Integrations page.
Daily report
When alert channels (Slack, Discord, Telegram, Webhook) are configured, a daily report is sent after auto collection completes. Report order:
- Summary stats (Number, Gauge) — by sort_order
- Trend stats (Line, Bar, Area) — by sort_order
- Auto stats (Total Users, New Signups) — after separator
Each stat item shows yesterday's value, previous day's value, and change percentage (%).
Charts
Each stat column displays as a chart widget on your Stats dashboard. You can configure the chart type.
Chart types
- Summary: Number — Single metric + change vs previous day. Gauge — Current value against a target.
- Trend: Line — Track trends over time. Bar — Compare values across dates. Area — Line chart with filled area.
Widget menu
Each widget has a ⚙ button in the top-right that lets you adjust settings without opening the editor:
- Chart type — Switch between Number / Gauge / Line / Bar / Area. Switching across summary↔trend automatically moves the widget between groups.
- Widget size (trend only) — Small / Medium / Full.
- Header value — Latest / Sum / Average / Max. Controls how the period's values are summarized.
While a setting change is being applied, the widget pulses briefly to indicate the update is in progress.
Header value mode
The number shown in a widget's header aggregates values across the displayed period. Opseer auto-selects the mode based on your query and you can override from the menu:
- Latest — Most recent data point. Best for cumulative snapshots (total users, paid subscribers).
- Sum — Sum of all values in the period. Best for daily events (new signups, daily revenue).
- Average — Period average. Best for ratios (response time).
- Max — Peak value in the period. Best for records.
If the query has a date column filter, Sum is chosen automatically; otherwise Latest. A small badge next to the header value shows the current mode.
Backfill
Backfill lets you populate historical data for a stat column. When you add a new column, you can backfill past dates to immediately see trends instead of waiting for daily collection to accumulate data.
The backfill period depends on your plan:
- Free — Up to 7 days
- Starter ($9/mo) — Up to 90 days
- Plus ($24/mo) — Up to 90 days
- Max ($49/mo) — Up to 90 days
Backfill runs the stat query for each past date individually. For date-filtered columns, the :date_start and :date_end variables are set to each day's range. Make sure your date column has data for the backfill period.
Plan limits
The number of stat columns you can create is limited by your plan. This limit is shared across all projects (not per-project):
- Free — 5 stat columns total
- Starter ($9/mo) — 10 stat columns total
- Plus ($24/mo) — 30 stat columns total
- Max ($49/mo) — 100 stat columns total