Appearance
Reporting Dashboard - TODO
Everything discussed and noted during the June 2026 reporting sessions. Items marked [done] are implemented but uncommitted on the current branch.
Done (uncommitted)
- [done] KPI cards with secondary percentage display (e.g. "41.8% of plays")
- [done] Remove ALL CAPS from widget labels
- [done] Deduplicate metric pills in Daily Metrics (standard wins over bunny)
- [done] Categorized pill selector (Core, Engagement, Clicks, Video)
- [done] Data-aware UI: hide categories/metrics/stages with zero data
- [done] Chart z-ordering: higher-value series drawn behind lower-value ones
- [done] Increase chart series slots from 4 to 8
- [done] BaseSelect custom dropdown (replace all native selects)
- [done] Searchable BaseSelect for enterprise/workspace dropdown
- [done] Workspace switch confirm dialog when viewing a report
- [done] Shared design system: unified buttons, inputs, selects, overlays
- [done] Engagement funnel: hide zero stages, hide entirely when only impressions
- [done] Video Completion widget (horizontal bars, not donut)
- [done] Per-resource breakdown: dynamic metrics from report selection, hide zero-value
- [done] User avatar menu with My Reports link and Log out
- [done] Preview mode: shows exactly what non-authenticated customer sees
- [done] Merged "Edit layout" + "Edit report" into single Edit flow
- [done] Toolbar: normal [Edit] [Preview], edit mode [Report settings] [Preview] [Done]
- [done] Section widgets (Engagement, Video, Daily Metrics, Per-resource) removable in edit mode
- [done] Engagement funnel: add/remove stages in edit mode from available metrics
- [done] Report cards: "Opened 2h ago" relative time, hover-to-reveal delete
- [done] Inline title editing in edit mode (click to rename, enter/blur saves, escape cancels)
- [done] Saved report URL sync (edits to layout/metrics update the stored report URL)
- [done] CSV export (Export CSV button in toolbar, downloads visible metrics)
- [done] Active range zoom: relative 1% threshold across all series (replaces absolute 300)
- [done] Bar chart strong colors (80% opacity vs 15% for line fill)
Edit mode polish
Remove all empty KPI cards [done]
- "Remove empty" button in edit mode next to "+ Add metric"
- Removes all KPI cards where the value is 0
- Batch removal via
removeByKeys()to avoid index-shifting bugs
Drag-and-drop section reordering [done]
- All sections (Engagement, Video Completion, Daily Metrics, Per-resource) reorderable via DnD in edit mode
- Dynamic rendering via
visibleSectionscomputed fromsectionOrderref - Drag handle + remove button per section
user-select: none in edit mode [done]
- Disable text selection on all widgets during edit mode (prevents accidental selection during drag)
- Only allow text selection on editable fields (e.g. report name)
Drag-and-drop stage reordering [done]
- Engagement funnel: reorder stages via DnD in edit mode (impressions pinned to top)
- Any widget with ordered items (funnel stages, chart series) should support reordering where it makes sense
Smart caching on stage removal [done]
- Removed redundant
metricsfromuseCountsanduseBucketsquery keys (API always fetches 'base') - Engagement funnel uses single
useReportTotalscall for all candidates instead of separate stage-only fetch - Removing/reordering stages is now instant (no refetch)
Resize section widgets [done]
- Height presets (compact/normal/tall) cycling button in edit mode for Daily Metrics chart
- CSS variable
--section-heightflows from section-wrap to chart-wrap - Click button to cycle: compact (200px) -> normal (320px) -> tall (480px)
Charts
Per-creative comparison chart [done]
- Bar chart comparing a selected metric across all creatives
- Dropdown to switch metric (only shows metrics with data)
- Auto-switches to horizontal bars when 6+ creatives
- Section only visible when 2+ creatives in scope
- Respects
--section-heightfor resizing
Heatmap [done]
- Weekday x hour grid showing activity distribution
- Uses Bunny hourly-summary data (already cached)
- Dropdown to switch metric, hover tooltips with values
- Color intensity scales from transparent to primary color
Chart type selector [done]
- Line/Bar toggle in Daily Metrics chart header
- Switches between
<Line>and<Bar>Chart.js components with same data - Future: stacked bar (multi-creative), heatmap (temporal distribution)
Humology needs (relayed by McSneaky, 29 Jun 2026)
- [done] Custom metrics — supported via Bunny custom metric columns
- [done] Different view % — Watched 25/50/75/100% available as KPI cards, funnel stages, and chart series
- [done] Impressions — standard metric
- [done] Interacted — standard metric
- [done] View-through rate — computed metric (watched_100 / impressions), added to COMPUTED_METRICS
- Device type breakdown — Bunny CSV Device column is already parsed, needs UI (filter or breakdown widget)
- Country breakdown — not in current data sources, needs backend support
Flow-based metrics
Flow step reporting
- Show metrics per flow step (operator): how many users reached each step
- Drop-off funnel through the flow
- Which answers/paths are most popular
- Needs flow structure from creative JSON + per-step tracking data
Flow comparison
- Compare flow performance across creatives
- "Which flow variation converts best?"
Conversation metrics
- Average conversation depth (how many steps)
- Most common exit points
- Answer distribution per question
My Reports improvements
Rename reports [done]
- Double-click report name on card to inline edit
- Enter to confirm, Escape to cancel, blur to save
- Uses existing
reportsStore.rename()
Report card customization
- Color picker for card accent color (persist in saved report)
- Optional image/thumbnail on cards
My Reports access
- Already accessible from user avatar menu [done]
- Consider also showing in sidebar or dashboard
Per-resource breakdown improvements
Dynamic chart per resource [done]
- SVG sparkline per resource card showing daily trend of first selected metric
- Pure SVG path, no Chart.js dependency
- Reuses cached buckets data (no extra API calls)
Sort/filter resources [done]
- Search input to filter resources by name
- Sort pills for each visible metric (click to sort, click again to toggle asc/desc)
- Active sort pill shows arrow indicator
Report templates
Template presets
- Pre-built report configurations for common use cases: "VAST Video", "Interactive", "Standard Display"
- Each template pre-selects relevant KPI cards, widgets, and chart metrics
- Template selector in report builder when creating a new report
Save as template
- Save current report layout/metrics as a reusable template
- Available from Edit mode or toolbar
Data-aware metric filtering
Hide irrelevant metrics
- VTR and video metrics should not appear when creative(s) have no video data (plays = 0)
- Extend existing zero-data hiding to computed metrics and KPI card picker
- Applies across all widgets: KPI picker, chart pills, funnel stage picker
Engagement section with no data
- Engagement funnel shows "No data for this date range" even when there's genuinely no engagement data
- If only impressions are selected with no engagement metrics, consider: show impressions instead, or warn that there are no engagement metrics to compare against
- Alternatively: auto-remove empty sections when exiting edit mode
- User can already remove it manually in edit mode, but default state should be smarter
Per-resource breakdown improvements (cont.)
Chart pills don't affect per-resource breakdown
- Selecting different metrics in Daily Metrics pills doesn't update per-resource breakdown metrics
- Per-resource should either sync with chart selection or have its own independent metric picker
Filter resources label
- "Filter resources..." placeholder is unclear — should say "Filter creatives..." or "Search creatives..." since resources are creatives in this context
Chart tooltip improvements
Richer tooltip for computed metrics
- VTR tooltip currently only shows "View-through Rate: 93.8%"
- Should also show the underlying values: e.g. "1,142 of 1,217 plays" or "watched_100 / impressions"
- Similarly for CTR: show "clicks / impressions" breakdown
- Gives context to the percentage without needing a second chart
Other
Seconds in View multi-unit display [done]
formatDuration()already auto-scales: seconds -> minutes -> hours- Metric uses
format: 'duration'which routes throughformatDuration
Export
- [done] CSV download of visible metrics (Export CSV button in toolbar)
- PDF export of the report view
Sharing
- Share report URL (already works since URL is source of truth)
- Consider short URL generation for cleaner sharing
Date range comparison
- Compare current period vs previous period
- Should be opt-in via a "Compare" toggle, not always-on
- Delta arrows on KPI cards (up/down percentage change)
- Could also compare across campaigns/creatives