Skip to main content

Overview

The Analytics page aggregates data from platform_connections, scraped_media, and taxonomy_mapping to provide insights into content performance, fan engagement, and growth trends. Page: dashboard/src/pages/Analytics/index.jsx
Collections: platform_connections, scraped_media, taxonomy_mapping, fan_profiles

Metrics Tracked

Top-Level Stats

Implementation: dashboard/src/pages/Analytics/index.jsx:102-106

Platform Performance

Ranked bar chart showing:
  • Platform name (from platform_connections.platform)
  • Follower count
  • Average likes per post
  • Engagement rate ((likes + comments) / followers)
Sorted by: Followers (descending)

Top Content Tags

Source: taxonomy_mapping collection (links media to 6-concept taxonomy)
Display: Bar chart of top 10 tags by frequency
Example tags: solo, lingerie, POV, outdoor, teasing

Top Content by Likes

List of top 8 posts ranked by likes_count:
  • Media type (image/video)
  • Posted date
  • Like count

Content Type Breakdown

Source: scraped_media.media_type
Chart: Bar chart showing distribution (image, video, audio, unknown)

Data Loading

API Calls: Parallel fetch on mount

UI Components

StatCard

Displays single metric with icon, value, and label. Props:
  • icon — Phosphor icon component
  • label — Metric name
  • value — Formatted number (e.g., “12.5K”, “$450”)
  • color — Tailwind text color class
  • loading — Boolean (shows skeleton)
Implementation: Analytics/index.jsx:28-38

BarChart

Inline sparkline-style horizontal bars. Props:
  • data — Array of objects
  • labelKey — Field for label (e.g., "username")
  • valueKey — Field for bar width (e.g., "followers")
  • color — Tailwind bg color class (e.g., "bg-brand")
Features:
  • Auto-scales to max value
  • Smooth width transitions (500ms)
  • Number formatting (12345 → “12.3K”)
Implementation: Analytics/index.jsx:41-60

Plan Gating

Feature: analytics_basic
Required Tier: creator ($49/mo)
Component: <UpgradeGate>
Behavior: Shows upgrade prompt if user is on Starter plan

Number Formatting

Helper functions:
Examples:
  • fmt(12345)"12.3K"
  • fmt(1500000)"1.5M"
  • fmtUsd(450)"$450"

Fan Insights

Page: dashboard/src/pages/FanInsights/index.jsx (separate from Analytics)
Collection: fan_profiles

Fan Profile Schema

Insights Tracked

  1. Top Spenders — Ranked by total_spent
  2. Most Engaged — Ranked by engagement_score
  3. Recent Interactions — Last 10 by last_interaction
  4. VIP List — Filtered by tags contains “VIP”

Taxonomy System

Collections:
  • taxonomy_dimensions — 6 super-concepts (Intimacy, Aesthetic, Activity, Gaze, Location, Extras)
  • taxonomy_mapping — 3,208 classified tags across 6 concepts
Use in Analytics: Content tag breakdown shows which concepts perform best (e.g., “solo” gets 2x engagement vs “group”) Graph: Nodes/Universe/taxonomy_graph.json (18 super-concepts, 3,205 nodes)

Revenue Estimation

Field: platform_connections.monthly_revenue_est
Calculation: subscription_price × follower_count × 0.05 (assumes 5% conversion)
Revenue estimates are approximations based on industry averages. Actual revenue varies by platform, content type, and fan engagement.
Example:
  • Platform: OnlyFans
  • Followers: 10,000
  • Subscription: $9.99/mo
  • Estimated revenue: 10000 × 0.05 × 9.99 = $4,995/mo

Performance Optimization

Data Limits

  • scraped_media: 100 most recent (sorted by likes_count)
  • taxonomy_mapping: 500 most recent
  • platform_connections: 20 max
Why: Dashboard should load in less than 2 seconds. Full history available via Directus admin panel.

Caching Strategy

Current: No caching (live data on every load)
Future: 5-minute cache in Redis for aggregates

Refresh Button

Component: <ArrowsClockwise> icon button (top-right)
Behavior: Calls load() → Re-fetches all data → Updates UI

Empty States

Trigger: No data in collections (e.g., new user, no scrapes yet) UI: Centered message with icon:
  • “No platform data — connect a platform first.”
  • “No taxonomy tags yet — run a scrape and analysis.”
  • “No scraped media yet.”