Analytics
The Analytics page (labelled "Wall of Shame — Internal Analytics") turns your collected roasts into product insights, showing how much feedback you're getting, how heated it is, and which recurring themes (AI tags) cause the most pain. It is read-only reporting built on top of your submissions data.
Where to find it and who can see it
Analytics lives at Dashboard → Analytics (/dashboard/analytics). It is served by the GET /api/analytics endpoint, which requires you to be signed in.
Analytics is workspace-scoped. If you are a team member rather than the owner, the page resolves your workspace via getWorkspaceContext and shows the workspace OWNER's analytics — all figures are aggregated across the owner's forms, not just your own. There is no separate per-member view.
Viewing analytics itself is not role-gated beyond being authenticated: owners, admins, editors and viewers can all open the page. The role restrictions only bite on the upstream action that produces the data (running AI analysis), not on reading the resulting charts.
Members never see their personal data here — they always see the owner's workspace totals.
If you own no forms and hold no active team membership, you are treated as the owner of your own (empty) workspace and will see the empty state.
Choosing a time range
A dropdown in the top-right lets you switch between Last 7 days, Last 30 days and Last 90 days. The default is Last 30 days.
The selected range is passed to the API as ?range=7d|30d|90d. Every metric on the page — totals, heat distribution, top pain points and hottest roasts — only counts roasts created within that window (created_at on or after the cut-off). Anything older is excluded.
Changing the range refetches all figures; there is no separate apply button.
Only submissions of type “roast” are included in this page. Praise submissions are deliberately excluded from every metric here.
The four summary cards
Across the top are four stat cards summarising the selected window:
Total Roasts — the number of roast-type submissions received in the range. Avg Heat Level — the average of all heat levels, mapped onto the five-point scale and shown with its emoji and label (or N/A if no heat data). Top Pain Point — the single most common AI tag, with the percentage of roasts carrying it shown underneath. Topics Identified — how many distinct AI tags surfaced (capped at the top 8 themes).
Average heat is computed by mapping lukewarm…1 … nuclear…5, averaging, then rounding back to the nearest named level.
Top Pain Point and Topics Identified are empty (“N/A” / 0) until submissions have been run through AI analysis to generate tags.
Heat levels explained
Every roast carries a heat level describing how harsh the feedback is. There are five levels, ordered from mildest to most severe: Lukewarm (😐), Warm (😬), Hot (😤), Fire (🔥) and Nuclear (🤬). Each has a distinct colour used in the bars and badges (Lukewarm blue → Nuclear deep red).
Heat level is set when the roast is first submitted (it is stored on the submission at creation time, supplied via the widget), not derived afterwards by AI. Submissions without a heat level are ignored in the heat distribution and average.
Heat level and AI tags are independent: heat comes from submission time, tags/sentiment come from running AI analysis later.
Top Pain Points (AI tag breakdown)
The large left-hand panel ranks the recurring themes in your feedback. These themes are the AI tags attached to each submission. For each of the top 8 tags it shows the tag name, how many roasts carry it, a progress bar sized by its share of total roasts, the percentage, and an emoji reflecting the average heat of roasts carrying that tag.
Clicking a topic highlights (selects) it; clicking again deselects. This is a visual highlight only — it does not currently filter the rest of the page.
If no AI tags exist yet, this panel shows “No AI tags detected yet. Tags are generated when submissions are analysed.” Tags only appear after you run AI analysis on individual submissions.
Tags are ranked purely by frequency; ties are broken by insertion order.
A roast with no tags contributes to Total Roasts but to no pain point.
Heat Distribution and the Insight callout
The right-hand panel breaks down your roasts by heat level, showing the percentage of roasts at each of the five levels with a coloured bar.
Below the distribution, an automatic Insight line appears when any roasts are Fire or Nuclear. It states what percentage of roasts are “Fire” or “Nuclear” combined. If that figure is 40% or higher it advises focusing on high-heat issues for maximum impact; below 40% it notes that most feedback is moderate.
The Insight callout is generated client-side from the same numbers — it is a fixed rule, not a separate AI call.
If there are no Fire/Nuclear roasts in the window, the Insight line is hidden entirely.
Hottest Roasts
At the bottom, up to four “hottest” roasts are surfaced as cards. They are chosen by heat tier, highest first (Nuclear → Fire → Hot → Warm → Lukewarm), and within a tier by most recent, stopping once four are found.
Each card shows a video thumbnail (or the heat emoji if there's no thumbnail), a hover play overlay for video roasts, a heat badge, a truncated quote of the text content, the relative time it was received, and up to two of its tags.
These cards are display-only on this page; there is no inline playback control wired up here beyond the hover state.
If no roasts exist in the window, the Hottest Roasts section is omitted.
How AI analysis populates these insights
The pattern-finding parts of this page — pain points, topics, tag emojis on cards — depend on AI tags, which are produced by running AI analysis on a submission via POST /api/submissions/{submissionId}/analyze. That call runs three OpenAI operations in parallel: sentiment scoring, tag generation, and a summary; it then saves sentiment_score, ai_tags and ai_summary back onto the submission.
Until a submission has been analysed it has no tags, so it will count towards Total Roasts and heat distribution but will not contribute to Top Pain Points or Topics Identified. To get richer analytics, run AI analysis on your submissions from the submissions area.
Note: the Analytics page reads only ai_tags (plus heat level) — the sentiment score and AI summary produced by analysis are stored on the submission and surfaced elsewhere, not directly charted on this page.
Running AI analysis is a paid feature: the workspace owner's plan must include aiAnalytics (Flame or Inferno). On the Spark plan the analyze call returns a 403 prompting an upgrade.
AI analysis requires the analyze permission. Owners, admins and editors can trigger it; viewers cannot (403 Forbidden).
Analysis is rate-limited to 10 requests per user per hour. Re-analysing an already-analysed submission returns the cached result unless forced.
Plan gating is keyed on the OWNER's plan, so a member's analytics richness depends on the owner's subscription.
Empty and loading states
While data loads, a spinner is shown. If there is no roast data in the selected window (Total Roasts is zero) the page shows an empty state explaining that analytics will appear once your widget starts collecting roasts — covering heat distribution, top pain points and your hottest feedback.
A separate stats endpoint (GET /api/submissions/stats) also exists for the broader dashboard. It returns all-time and 30-day counts split by submission type (praise/roast) and status (pending), plus the ten most frequent recent roast tags and a 30-day-vs-previous-30-day comparison. That feeds dashboard summary widgets rather than this Analytics page.
Network errors during fetch fail silently into the empty state rather than showing an error message.
/api/submissions/stats is likewise scoped to the workspace owner and counts only the owner's data.
Frequently asked questions
- Why is my “Top Pain Point” showing N/A even though I have lots of roasts?
- Pain points come from AI tags, and tags only exist after a submission has been run through AI analysis. If none of your roasts in the selected window have been analysed yet, there are no tags to rank. Run AI analysis on your submissions (requires a Flame or Inferno plan) to populate this.
- Does the Analytics page show praise as well as roasts?
- No. Every metric on this page filters to submissions of type “roast”. Praise is excluded here. Broader praise/roast counts appear in the dashboard summary, which is fed by a separate stats endpoint.
- I'm a team member — why do the numbers not match my own submissions?
- Analytics is workspace-scoped to the owner. Members always see the owner's aggregated analytics across all the owner's forms, not a personal view.
- How is the heat level decided — does AI set it?
- No. Heat level is captured when the roast is submitted (via the widget) and stored on the submission. AI analysis adds tags, a sentiment score and a summary, but it does not change the heat level shown in these charts.
- Can a viewer use this page?
- A viewer can open and read the Analytics page. What they can't do is trigger the AI analysis that generates tags — that needs the analyze permission (owner, admin or editor) and a plan with AI analytics enabled.
- Why do only four roasts appear under Hottest Roasts?
- The page deliberately surfaces at most four, picked by highest heat tier first and most recent within a tier, to highlight the feedback worth acting on rather than listing everything.
- Clicking a pain point highlights it but nothing else changes — is that a bug?
- No. Selecting a topic is currently a visual highlight only; it does not filter the heat distribution or hottest roasts. It simply marks the topic you're focusing on.