Claude Code Plugins

Community-maintained marketplace

Feedback

Automatically convert uploaded data (CSV, Excel, JSON) into complete interactive dashboards with zero user input required. Detects patterns in PPC reports, sales data, analytics exports, and business metrics - then generates insights, recommendations, and visualizations instantly. Works seamlessly with CURV design system for on-brand outputs with tabs, funnels, filters, and multi-view layouts.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name dashboard-auto-generation
description Automatically convert uploaded data (CSV, Excel, JSON) into complete interactive dashboards with zero user input required. Detects patterns in PPC reports, sales data, analytics exports, and business metrics - then generates insights, recommendations, and visualizations instantly. Works seamlessly with CURV design system for on-brand outputs with tabs, funnels, filters, and multi-view layouts.

Dashboard Auto-Generation

Core Principle

Show first, refine later. Never ask "what do you want to see?" - analyze the data, detect patterns, and build a professional dashboard immediately.

When to Activate

Activate this skill when user:

  • Uploads a data file (CSV, Excel, JSON, TSV)
  • Says "analyze this data"
  • Asks for a "dashboard" or "report"
  • Wants to "visualize" or "understand" data
  • Mentions PPC, sales, analytics, or business metrics

Do NOT ask questions - just build the best dashboard you can from the data.

CURV Design System Integration (CRITICAL - ALWAYS INCLUDE)

⚠️ MANDATORY REQUIREMENT: Every dashboard MUST include the complete CURV header and footer exactly as shown below.

NEVER skip the header or footer. If you generate a dashboard without both, the output is incorrect and must be regenerated.

Header (MANDATORY - Copy this exact structure)

<!-- ========== CURV HEADER (REQUIRED) ========== -->
<header class="curv-header">
    <!-- Rotating background shape -->
    <div class="header-shape"></div>

    <!-- Header content -->
    <div class="header-content">
        <h1 class="hero-title">[Dashboard Name]</h1>
        <p class="hero-subtitle">[Description of data - e.g., "30-Day Amazon Advertising Analysis | Aug 11 - Sep 9, 2025"]</p>
        <p class="powered-by">POWERED BY CURV</p>
    </div>
</header>

Required CSS for Header:

.curv-header {
    text-align: center;
    margin-bottom: 40px;
    padding: 40px;
    background: rgba(3, 12, 27, 0.6);
    border-radius: 20px;
    backdrop-filter: blur(10px);
    border: 1.5px solid rgba(157, 78, 221, 0.5);
    position: relative;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
}

/* CRITICAL: Rotating background shape animation */
.header-shape {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 600px;
    height: 600px;
    background: linear-gradient(135deg,
        rgba(157, 78, 221, 0.15) 0%,
        rgba(157, 78, 221, 0.05) 50%,
        transparent 100%);
    border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
    transform: translate(-50%, -50%);
    animation: headerRotate 30s linear infinite;
    opacity: 0.3;
    z-index: 0;
}

@keyframes headerRotate {
    from { transform: translate(-50%, -50%) rotate(0deg); }
    to { transform: translate(-50%, -50%) rotate(360deg); }
}

.header-content {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.75rem;
    position: relative;
    z-index: 1;
    max-width: 800px;
}

.hero-title {
    font-size: 72px;
    font-weight: 700;
    color: #ffffff;
    letter-spacing: -2px;
    text-align: center;
    text-shadow: 0 0 25px rgba(255, 255, 255, 0.6),
                 0 0 50px rgba(255, 255, 255, 0.4),
                 0 0 100px rgba(157, 78, 221, 0.4);
    margin: 0;
}

.hero-subtitle {
    font-size: 20px;
    color: rgba(255, 255, 255, 0.8);
    text-align: center;
    margin: 0;
    max-width: 600px;
}

.powered-by {
    font-size: 14px;
    color: rgb(157, 78, 221);
    letter-spacing: 1px;
    text-align: center;
    text-transform: uppercase;
    font-weight: 500;
    margin-top: 0.5rem;
}

/* Responsive header */
@media (max-width: 768px) {
    .hero-title { font-size: 48px; }
    .hero-subtitle { font-size: 16px; }
}

Footer (MANDATORY - Copy this exact structure)

<!-- ========== CURV FOOTER (REQUIRED) ========== -->
<footer class="curv-footer">
    <div class="footer-title">[Dashboard Name]</div>
    <div class="footer-subtitle">Advanced [Data Type] Analytics for Amazon Sellers</div>
    <div class="footer-credits">Produced By Danny McMillan | CURV Tools | A Seller Sessions Production 2025</div>
</footer>

Required CSS for Footer:

.curv-footer {
    text-align: center;
    padding: 2rem;
    margin-top: 3rem;
    border-top: 1px solid rgba(157, 78, 221, 0.2);
    color: rgba(255, 255, 255, 0.5);
}

.footer-title {
    font-size: 16px;
    color: #ffffff;
    margin-bottom: 0.5rem;
}

.footer-subtitle {
    font-size: 12px;
    opacity: 0.7;
    margin-bottom: 1rem;
    color: rgba(255, 255, 255, 0.7);
}

.footer-credits {
    font-size: 11px;
    opacity: 0.5;
    color: rgba(255, 255, 255, 0.7);
    letter-spacing: 0.5px;
}

Tab Navigation (When Multiple Views)

<div class="tab-nav">
    <button class="tab active">πŸ“Š OVERVIEW</button>
    <button class="tab">πŸ” EXPLORER</button>
    <button class="tab">πŸ“ˆ FUNNEL</button>
    <button class="tab">πŸ’Ž OPPORTUNITIES</button>
</div>

Styling:

  • Inactive: Dark background rgba(255, 255, 255, 0.05), white text
  • Active: Purple background rgb(157, 78, 221), white text
  • Border radius: 12px
  • Padding: 12px 24px

Color System

/* Backgrounds */
--bg-primary: rgb(3, 12, 27);              /* Main background */
--bg-header: linear-gradient(180deg, rgb(18, 11, 41) 0%, rgb(13, 18, 41) 40%, rgb(4, 16, 32) 70%, rgb(3, 12, 27) 100%);
--bg-panel: rgba(255, 255, 255, 0.03);     /* Glassmorphic panels */

/* Accents */
--accent: rgb(157, 78, 221);               /* CURV Purple */
--accent-hover: rgb(177, 98, 241);
--accent-border: rgba(157, 78, 221, 0.5);

/* Status Colors */
--success: rgb(34, 197, 94);               /* Green - Top Growing */
--warning: rgb(234, 179, 8);               /* Yellow - Hidden Gem */
--danger: rgb(239, 68, 68);                /* Red - Drop-off/Critical */
--info: rgb(59, 130, 246);                 /* Blue - Clicks/CTR */

/* Text */
--text-primary: #ffffff;
--text-muted: rgba(255, 255, 255, 0.7);
--text-dim: rgba(255, 255, 255, 0.5);

Typography

/* Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');

body {
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    background: rgb(3, 12, 27);
    color: #ffffff;
}

.hero-title {
    font-size: 72px;
    font-weight: 700;
    letter-spacing: -2px;
    text-shadow: 0 0 25px rgba(255, 255, 255, 0.6),
                 0 0 50px rgba(255, 255, 255, 0.4),
                 0 0 100px rgba(157, 78, 221, 0.4);
}

.metric-value {
    font-size: 48px;
    font-weight: 700;
    letter-spacing: -1px;
}

.metric-label {
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: 1px;
    color: rgba(255, 255, 255, 0.7);
}

Glassmorphic Panel Template

.panel {
    background: linear-gradient(135deg, rgba(18, 11, 41, 0.6), rgba(13, 18, 41, 0.6));
    backdrop-filter: blur(10px);
    border: 1px solid rgba(157, 78, 221, 0.3);
    border-radius: 16px;
    padding: 24px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}

Button Styles

.btn-primary {
    background: linear-gradient(135deg, rgb(157, 78, 221), rgb(177, 98, 241));
    color: white;
    border: none;
    border-radius: 12px;
    padding: 12px 32px;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s ease;
}

.btn-primary:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 24px rgba(157, 78, 221, 0.4);
}

.btn-outline {
    background: transparent;
    color: rgb(157, 78, 221);
    border: 2px solid rgba(157, 78, 221, 0.5);
    border-radius: 12px;
    padding: 10px 28px;
}

Auto-Detection Patterns

1. PPC / Advertising Data

Detect columns like:

  • Placement, Campaign, Ad Group, Keyword, Search Term
  • Impressions, Clicks, Spend, Cost Per Click (CPC)
  • Sales, Revenue, ROAS, ACOS, CTR, Conversion Rate
  • Orders, Units, Add-to-Cart, Cart Adds

Auto-generate tabs:

  1. OVERVIEW - 6 key metrics + top performers table
  2. EXPLORER - Searchable/filterable table with all campaigns/keywords
  3. FUNNEL - Impressions β†’ Clicks β†’ Cart Adds β†’ Purchases (with CVR)
  4. OPPORTUNITIES - Hidden gems, bottlenecks, drop-offs

2. Sales / E-commerce Data

Detect columns like:

  • Date, Product, SKU, Category, ASIN
  • Units, Revenue, Profit, Price
  • Orders, Customers, Sessions
  • Returns, Refunds

Auto-generate tabs:

  1. OVERVIEW - Revenue, units, AOV, profit metrics
  2. EXPLORER - Product performance table with filters
  3. FUNNEL - Sessions β†’ Views β†’ Cart β†’ Purchase (if session data)
  4. OPPORTUNITIES - Low stock, high return rate, underperformers

3. Analytics / Traffic Data

Detect columns like:

  • Date, Source, Medium, Campaign, Keyword
  • Sessions, Users, Pageviews, Bounce Rate
  • Conversion Rate, Goal Completions, Events
  • Avg Session Duration, Pages per Session

Auto-generate tabs:

  1. OVERVIEW - Sessions, users, CVR, bounce rate
  2. EXPLORER - Source/medium breakdown with filters
  3. FUNNEL - Landing β†’ Engagement β†’ Conversion
  4. OPPORTUNITIES - High bounce sources, conversion opportunities

4. Accounting / Financial Data

Detect columns like:

  • Date, Account, Category, Transaction Type
  • Amount, Debit, Credit, Balance
  • Vendor, Customer, Invoice

Auto-generate tabs:

  1. OVERVIEW - Total income, expenses, profit, cash flow
  2. EXPLORER - Transaction table with filters (vendor, category, date)
  3. NO FUNNEL - Not applicable for accounting
  4. OPPORTUNITIES - Top expenses, late invoices, cash flow issues

5. Support Tickets / CRM Data

Detect columns like:

  • Ticket ID, Status, Priority, Category
  • Created Date, Resolved Date, Response Time
  • Agent, Customer, Satisfaction Score

Auto-generate tabs:

  1. OVERVIEW - Total tickets, avg resolution time, satisfaction
  2. EXPLORER - Ticket table with filters (status, agent, category)
  3. FUNNEL - New β†’ In Progress β†’ Resolved
  4. OPPORTUNITIES - Overdue tickets, low satisfaction, bottlenecks

Tab System (When to Use)

Use Tabs When:

  • Dataset has >100 rows (need explorer for search/filter)
  • Data supports funnel visualization (impressionsβ†’clicksβ†’conversions)
  • Multiple opportunity types exist (hidden gems, bottlenecks, drop-offs)

Single Page When:

  • Dataset <50 rows (all fits on overview)
  • Simple report with few metrics
  • No funnel or exploration needed

Tab Structure

<div class="dashboard-container">
    <div class="tab-nav">
        <button class="tab active" data-tab="overview">πŸ“Š OVERVIEW</button>
        <button class="tab" data-tab="explorer">πŸ” EXPLORER</button>
        <button class="tab" data-tab="funnel">πŸ“ˆ FUNNEL</button>
        <button class="tab" data-tab="opportunities">πŸ’Ž OPPORTUNITIES</button>
    </div>

    <div id="overview-tab" class="tab-content active">
        <!-- Overview content -->
    </div>

    <div id="explorer-tab" class="tab-content hidden">
        <!-- Explorer content -->
    </div>

    <div id="funnel-tab" class="tab-content hidden">
        <!-- Funnel content -->
    </div>

    <div id="opportunities-tab" class="tab-content hidden">
        <!-- Opportunities content -->
    </div>
</div>

<script>
document.querySelectorAll('.tab').forEach(tab => {
    tab.addEventListener('click', () => {
        // Hide all tabs
        document.querySelectorAll('.tab-content').forEach(content => {
            content.classList.remove('active');
            content.classList.add('hidden');
        });
        document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));

        // Show selected tab
        const tabName = tab.getAttribute('data-tab');
        document.getElementById(tabName + '-tab').classList.add('active');
        document.getElementById(tabName + '-tab').classList.remove('hidden');
        tab.classList.add('active');
    });
});
</script>

Overview Tab (Always Required)

Structure:

  1. Performance Summary Section (4-6 large metric cards)
  2. Top Performers Table (top 10 by primary metric)
  3. Insights Section (3-5 key insights with "What this means" tooltips)

Metric Cards with Icons:

<div class="metrics-grid">
    <div class="metric-card">
        <div class="metric-icon">πŸ‘οΈ</div>
        <div class="metric-content">
            <p class="metric-value">50.9K</p>
            <p class="metric-label">IMPRESSIONS</p>
            <p class="metric-detail">total</p>
        </div>
        <div class="metric-footer">
            <span class="market-share">9.7%</span>
            <span class="label">Market Share</span>
        </div>
        <div class="tooltip-trigger">ℹ️ What this means</div>
    </div>
    <!-- Repeat for other metrics -->
</div>

Icon mapping for PPC:

  • Impressions: πŸ‘οΈ
  • Clicks: πŸ–±οΈ
  • Basket Adds: πŸ›’
  • Purchases: πŸ’°
  • Spend: πŸ’³
  • Sales: πŸ“ˆ

Tooltip Content:

<div class="tooltip hidden">
    <p class="tooltip-text">[Explanation of metric]</p>
    <p class="tooltip-detail"><strong>Market Share:</strong> [Context about market share]</p>
</div>

Explorer Tab (When >100 Rows)

Structure:

  1. Search Bar (filter across all text columns)
  2. Performance Score Legend (color-coded badges)
  3. Sortable Table (click column headers to sort)
  4. Pagination (10/20/50 per page dropdown)

Search Implementation:

<div class="explorer-controls">
    <input type="text" id="search-input" placeholder="Search queries..." class="search-input">
    <select id="per-page" class="per-page-select">
        <option value="10">10 per page</option>
        <option value="20">20 per page</option>
        <option value="50">50 per page</option>
    </select>
    <span class="results-count">3 results</span>
</div>

Performance Score Badges:

<div class="performance-legend">
    <h3>Performance Score Legend</h3>
    <div class="legend-grid">
        <div class="legend-item">
            <span class="badge excellent">51-100%: Excellent</span>
        </div>
        <div class="legend-item">
            <span class="badge good">26-50%: Good</span>
        </div>
        <div class="legend-item">
            <span class="badge needs-work">0-25%: Needs Work</span>
        </div>
    </div>
</div>

Badge colors:

  • Excellent (51-100%): Green rgb(34, 197, 94)
  • Good (26-50%): Yellow rgb(234, 179, 8)
  • Needs Work (0-25%): Red rgb(239, 68, 68)

Sortable Table:

<table class="data-table sortable">
    <thead>
        <tr>
            <th class="sortable" data-column="query">SEARCH QUERY ⬍</th>
            <th class="sortable" data-column="score">SCORE ⬍</th>
            <th class="sortable" data-column="impressions">IMPRESSIONS ⬍</th>
            <th class="sortable" data-column="clicks">CLICKS ⬍</th>
            <th class="sortable" data-column="ctr">CTR % ⬍</th>
            <th class="sortable" data-column="roas">ROAS ⬍</th>
        </tr>
    </thead>
    <tbody id="table-body">
        <!-- Rows populated dynamically -->
    </tbody>
</table>

Classification Badges in Table:

<td>
    <span class="badge stable-performer">βœ“ STABLE PERFORMER</span>
    <span class="badge-negative">↓ -24%</span>
</td>

Badge types:

  • Rising Star: ⭐ RISING STAR (purple)
  • Stable Performer: βœ“ STABLE PERFORMER (blue)
  • Needs Attention: ⚠️ NEEDS ATTENTION (red)

Funnel Tab (When Funnel Data Exists)

When to Create Funnel:

PPC Data: Impressions β†’ Clicks β†’ Cart Adds β†’ Purchases E-commerce: Sessions β†’ Views β†’ Cart β†’ Purchase Analytics: Landing β†’ Engagement β†’ Goal Completion Support: New β†’ In Progress β†’ Resolved

Funnel Visualization:

<div class="funnel-container">
    <h2>Customer Journey Funnel</h2>
    <p class="funnel-subtitle">Track your customer journey from first impression to final purchase. Spot bottlenecks instantly and discover growth opportunities.</p>

    <div class="funnel-visual">
        <!-- Stage 1 -->
        <div class="funnel-stage" style="width: 100%;">
            <div class="stage-label">
                <span class="stage-icon">πŸ‘οΈ</span>
                <span class="stage-name">Impressions</span>
            </div>
            <div class="stage-metric">50.9K</div>
            <div class="stage-detail">9.7% market share</div>
        </div>

        <!-- Drop-off indicator -->
        <div class="funnel-drop">
            <span class="drop-badge critical">⬇ -94.9% drop-off</span>
            <div class="drop-arrow">↓</div>
        </div>

        <!-- Stage 2 -->
        <div class="funnel-stage" style="width: 85%; background: linear-gradient(90deg, rgba(59, 130, 246, 0.3), rgba(59, 130, 246, 0.1));">
            <div class="stage-label">
                <span class="stage-icon">πŸ–±οΈ</span>
                <span class="stage-name">Clicks</span>
            </div>
            <div class="stage-metric">2.6K</div>
            <div class="stage-detail">
                <span class="cvr-badge">5.1% CVR</span>
                <span class="drop-indicator critical">⚠️ Critical Drop-off</span>
            </div>
        </div>

        <!-- Continue for all stages -->
    </div>

    <div class="funnel-summary">
        <div class="summary-card">
            <p class="summary-value purple">0.62%</p>
            <p class="summary-label">Overall Conversion</p>
        </div>
        <div class="summary-card">
            <p class="summary-value red">94.9%</p>
            <p class="summary-label">Biggest Problem</p>
        </div>
        <div class="summary-card">
            <p class="summary-value yellow">Impressions β†’ Clicks</p>
            <p class="summary-label">Critical Stage</p>
        </div>
        <div class="summary-card">
            <p class="summary-value green">2</p>
            <p class="summary-label">Issues to Fix</p>
        </div>
    </div>

    <div class="funnel-diagram">
        <h3>πŸ’‘ Understanding Your Sales Funnel</h3>
        <div class="funnel-flow">
            <div class="flow-stage">
                <span class="flow-icon">πŸ‘οΈ</span>
                <span class="flow-label">Impressions</span>
                <span class="flow-description">Shoppers see your product in search results</span>
            </div>
            <span class="flow-arrow">β†’</span>
            <div class="flow-stage">
                <span class="flow-icon">πŸ–±οΈ</span>
                <span class="flow-label">Clicks</span>
                <span class="flow-description">Interested shoppers click to learn more</span>
            </div>
            <span class="flow-arrow">β†’</span>
            <div class="flow-stage">
                <span class="flow-icon">πŸ›’</span>
                <span class="flow-label">Cart Adds</span>
                <span class="flow-description">Convinced shoppers add to cart</span>
            </div>
            <span class="flow-arrow">β†’</span>
            <div class="flow-stage">
                <span class="flow-icon">πŸ’°</span>
                <span class="flow-label">Purchases</span>
                <span class="flow-description">Final step: completed sales</span>
            </div>
        </div>
    </div>
</div>

Funnel Styling:

.funnel-visual {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0;
    margin: 40px 0;
}

.funnel-stage {
    background: linear-gradient(90deg, rgba(157, 78, 221, 0.3) 0%, rgba(157, 78, 221, 0.1) 100%);
    border: 2px solid rgba(157, 78, 221, 0.5);
    border-radius: 12px;
    padding: 32px;
    text-align: center;
    position: relative;
    transition: all 0.3s ease;
}

.funnel-drop {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 12px 0;
}

.drop-badge {
    background: rgba(239, 68, 68, 0.2);
    border: 1px solid rgb(239, 68, 68);
    color: rgb(239, 68, 68);
    padding: 6px 16px;
    border-radius: 20px;
    font-size: 14px;
    font-weight: 600;
}

.drop-badge.critical {
    animation: pulse 2s ease-in-out infinite;
}

@keyframes pulse {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.6; }
}

.cvr-badge {
    background: rgba(34, 197, 94, 0.2);
    color: rgb(34, 197, 94);
    padding: 4px 12px;
    border-radius: 12px;
    font-size: 12px;
    font-weight: 600;
}

Drop-off Severity:

  • Critical (>80%): Red badge with pulse animation
  • Warning (50-80%): Yellow/orange badge
  • Normal (<50%): Muted display, no badge

Opportunities Tab (Always Include)

Structure:

  1. Opportunities Legend (category badges)
  2. Impact Level Filter Buttons (High/Medium/Low)
  3. Opportunity Cards (sorted by impact)

Opportunities Legend:

<div class="opportunities-legend">
    <h3>Opportunities Legend</h3>
    <div class="legend-grid">
        <div class="legend-category">
            <span class="category-icon">πŸ’Ž</span>
            <span class="category-label">Hidden Gem</span>
            <span class="category-description">Low market share, high conversion</span>
        </div>
        <div class="legend-category">
            <span class="category-icon">⚠️</span>
            <span class="category-label">Funnel Bottleneck</span>
            <span class="category-description">High traffic, poor conversion</span>
        </div>
        <div class="legend-category">
            <span class="category-icon">πŸ“Š</span>
            <span class="category-label">Share Opportunity</span>
            <span class="category-description">Strong metrics, growth potential</span>
        </div>
    </div>

    <h3>Impact Levels</h3>
    <div class="legend-grid">
        <div class="impact-level">
            <span class="badge high-impact">High Impact</span>
            <span>10,000+ impressions</span>
        </div>
        <div class="impact-level">
            <span class="badge medium-impact">Medium Impact</span>
            <span>3,000-10,000 impressions</span>
        </div>
        <div class="impact-level">
            <span class="badge low-impact">Low Impact</span>
            <span><3,000 impressions</span>
        </div>
    </div>
</div>

Impact Filter Buttons:

<div class="impact-filters">
    <p>πŸ’‘ Hover over any opportunity card for detailed performance breakdown</p>
    <div class="filter-buttons">
        <button class="filter-btn active" data-impact="high">
            ⚠️ HIGH IMPACT <span class="count">4</span>
        </button>
        <button class="filter-btn" data-impact="medium">
            🎯 MEDIUM IMPACT <span class="count">1</span>
        </button>
        <button class="filter-btn" data-impact="low">
            βœ“ LOW IMPACT <span class="count">0</span>
        </button>
    </div>
</div>

Opportunity Cards:

<div class="opportunities-grid">
    <div class="opportunity-card high-impact" data-impact="high">
        <div class="card-header">
            <span class="opportunity-icon">πŸ’Ž</span>
            <span class="impact-badge high">HIGH IMPACT</span>
        </div>
        <h3 class="opportunity-title">Hidden Gem</h3>
        <p class="opportunity-keyword">wireless headphones</p>
        <p class="opportunity-insight">Low market share but high conversion rate - untapped potential</p>

        <div class="opportunity-metrics">
            <div class="metric-row">
                <span class="metric-label">Impressions:</span>
                <span class="metric-value">15,420</span>
            </div>
            <div class="metric-row">
                <span class="metric-label">Clicks:</span>
                <span class="metric-value">892</span>
            </div>
            <div class="metric-row">
                <span class="metric-label">Purchases:</span>
                <span class="metric-value">87</span>
            </div>
            <div class="metric-row">
                <span class="metric-label">CVR:</span>
                <span class="metric-value success">0.56%</span>
            </div>
        </div>

        <button class="btn-primary">EXPLORE INSIGHTS</button>
    </div>
    <!-- More cards -->
</div>

Opportunity Detection Logic:

Hidden Gem:

  • Market share <10% (impressions)
  • CVR >0.4% or ROAS >3.0x
  • Badge: Purple πŸ’Ž

Funnel Bottleneck:

  • High impressions (>10,000)
  • Low CTR (<3%) OR low cart-to-purchase rate (<40%)
  • Badge: Red ⚠️

Share Opportunity:

  • All metrics above average
  • Market share potential (CTR >5%, CVR >0.5%)
  • Badge: Green πŸ“Š

Priority Calculation:

Impact Score = (Impressions / 1000) Γ— CVR Γ— ROAS
High Impact: >10
Medium Impact: 3-10
Low Impact: <3

Search & Filter Implementation

Search Functionality:

const searchInput = document.getElementById('search-input');
const tableBody = document.getElementById('table-body');

searchInput.addEventListener('input', (e) => {
    const searchTerm = e.target.value.toLowerCase();
    const rows = tableBody.querySelectorAll('tr');

    let visibleCount = 0;
    rows.forEach(row => {
        const text = row.textContent.toLowerCase();
        if (text.includes(searchTerm)) {
            row.style.display = '';
            visibleCount++;
        } else {
            row.style.display = 'none';
        }
    });

    document.querySelector('.results-count').textContent = `${visibleCount} results`;
});

Sortable Table:

document.querySelectorAll('.sortable').forEach(header => {
    header.addEventListener('click', () => {
        const column = header.getAttribute('data-column');
        const rows = Array.from(tableBody.querySelectorAll('tr'));
        const isAscending = header.classList.contains('asc');

        rows.sort((a, b) => {
            const aVal = a.querySelector(`[data-column="${column}"]`).textContent;
            const bVal = b.querySelector(`[data-column="${column}"]`).textContent;

            // Handle numeric vs text sorting
            if (!isNaN(aVal) && !isNaN(bVal)) {
                return isAscending ? aVal - bVal : bVal - aVal;
            }
            return isAscending ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);
        });

        // Clear existing order
        tableBody.innerHTML = '';
        rows.forEach(row => tableBody.appendChild(row));

        // Toggle sort direction
        document.querySelectorAll('.sortable').forEach(h => h.classList.remove('asc', 'desc'));
        header.classList.add(isAscending ? 'desc' : 'asc');
    });
});

Insight & Recommendation Cards

Insight Cards with Tooltips:

<div class="insights-section">
    <h2>πŸ“Š Key Insights</h2>
    <div class="insights-grid">
        <div class="insight-card success">
            <div class="insight-icon">βœ“</div>
            <div class="insight-content">
                <h3>Product Pages outperform all placements</h3>
                <p class="insight-metric">5.84x ROAS vs 2.1x average</p>
                <div class="insight-tooltip">
                    <span class="tooltip-trigger">πŸ’‘ What this means</span>
                    <div class="tooltip-content hidden">
                        <p>Product Pages deliver nearly 3x better return than other placements. Every Β£1 spent generates Β£5.84 in sales.</p>
                        <p><strong>Recommendation:</strong> Increase budget allocation to Product Pages by 30%.</p>
                    </div>
                </div>
            </div>
        </div>
        <!-- More insights -->
    </div>
</div>

Recommendation Cards:

<div class="recommendations-section">
    <h2>🎯 Actionable Recommendations</h2>
    <div class="recommendations-grid">
        <div class="recommendation-card">
            <div class="rec-number">1</div>
            <div class="rec-content">
                <h3>Reallocate 40% of "Rest of Search" budget to "Product Pages"</h3>
                <p class="rec-reason">Rest of Search shows 33.5% ACOS vs Product Pages at 17.1% ACOS</p>
                <div class="rec-impact">
                    <span class="impact-label">Expected Impact:</span>
                    <span class="impact-value success">Overall ACOS drops from 25.5% to ~22%</span>
                </div>
                <div class="rec-urgency high">πŸ”΄ High Priority</div>
            </div>
        </div>
        <!-- More recommendations -->
    </div>
</div>

Performance Summary Cards

Conversion Rate Cards (for Funnel):

<div class="performance-summary">
    <h2>Performance Summary</h2>
    <p class="summary-subtitle">Conversion rates show how effectively you move customers through your sales funnel</p>

    <div class="conversion-cards">
        <div class="conversion-card blue">
            <p class="conversion-value">5.1%</p>
            <p class="conversion-label">CLICK RATE</p>
            <p class="conversion-description">How appealing your listing is compared to competitors</p>
        </div>
        <div class="conversion-card green">
            <p class="conversion-value">21.6%</p>
            <p class="conversion-label">ADD-TO-CART RATE</p>
            <p class="conversion-description">How convincing your product details and pricing are</p>
        </div>
        <div class="conversion-card yellow">
            <p class="conversion-value">56.1%</p>
            <p class="conversion-label">PURCHASE RATE</p>
            <p class="conversion-description">How well you convert cart additions to actual sales</p>
        </div>
        <div class="conversion-card purple">
            <p class="conversion-value">0.62%</p>
            <p class="conversion-label">OVERALL CVR</p>
            <p class="conversion-description">Your complete funnel: from impression to purchase</p>
        </div>
    </div>
</div>

File Naming Convention

[dashboard-name]-[date].html

Examples:
- ppc-placement-dashboard-2025-10-19.html
- sales-performance-dashboard-2025-10-19.html
- website-analytics-dashboard-2025-10-19.html

Quality Gates

CRITICAL - Before delivering ANY dashboard, verify:

🚨 MANDATORY (Dashboard is INVALID without these):

  • βœ… CURV header with rotating background animation (.header-shape with @keyframes headerRotate)
  • βœ… Hero title with white glow effect (text-shadow: 0 0 25px...)
  • βœ… "POWERED BY CURV" text in purple (rgb(157, 78, 221))
  • βœ… CURV footer with three lines: title, subtitle, credits
  • βœ… Footer credits: "Produced By Danny McMillan | CURV Tools | A Seller Sessions Production 2025"

⚠️ OUTPUT FORMAT REQUIREMENT:

  • βœ… Must be standalone HTML file (NOT React JSX, NOT component code)
  • βœ… Complete <!DOCTYPE html> with <head> and <body>
  • βœ… All CSS in <style> tag (no external stylesheets)
  • βœ… All JavaScript in <script> tag (no external files)
  • βœ… File opens directly in browser without build tools

Standard Quality Checks:

  • βœ… Tab navigation (if >100 rows or funnel exists)
  • βœ… All metric cards have icons and tooltips
  • βœ… Funnel visualization (if applicable data)
  • βœ… Opportunities tab with impact levels
  • βœ… Search/filter working in Explorer tab
  • βœ… Sortable table headers
  • βœ… Color-coded badges (green/yellow/red)
  • βœ… Purple accent color rgb(157, 78, 221) used consistently
  • βœ… Dark background rgb(3, 12, 27)
  • βœ… Responsive layout (works on mobile)
  • βœ… JavaScript for tabs, search, sort included
  • βœ… All tooltips functional (hover or click)

Example Output Structure

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PPC Placement Dashboard - CURV Tools</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
    <style>
        /* CURV Design System CSS */
        /* [Complete CSS from examples above] */
    </style>
</head>
<body>
    <!-- Hero Header -->
    <div class="hero-header">
        <h1 class="hero-title">PPC Placement Performance</h1>
        <p class="hero-subtitle">30-Day Analysis (Aug 11 - Sep 9, 2025) β€’ 3,917 data points analyzed</p>
        <p class="powered-by">POWERED BY CURV</p>
    </div>

    <!-- Tab Navigation -->
    <div class="tab-nav">
        <button class="tab active" data-tab="overview">πŸ“Š OVERVIEW</button>
        <button class="tab" data-tab="explorer">πŸ” EXPLORER</button>
        <button class="tab" data-tab="funnel">πŸ“ˆ FUNNEL</button>
        <button class="tab" data-tab="opportunities">πŸ’Ž OPPORTUNITIES</button>
    </div>

    <!-- Tab Content -->
    <div id="overview-tab" class="tab-content active">
        <!-- Overview content -->
    </div>

    <div id="explorer-tab" class="tab-content hidden">
        <!-- Explorer content -->
    </div>

    <div id="funnel-tab" class="tab-content hidden">
        <!-- Funnel content -->
    </div>

    <div id="opportunities-tab" class="tab-content hidden">
        <!-- Opportunities content -->
    </div>

    <!-- Footer -->
    <footer class="curv-footer">
        <p>PPC Placement Performance</p>
        <p>Advanced Search Performance Analytics for Amazon Sellers</p>
        <p>Produced By Danny McMillan | CURV Tools | A Seller Sessions Production 2025</p>
    </footer>

    <script>
        /* JavaScript for tabs, search, sort, tooltips */
    </script>
</body>
</html>

Success Criteria

This skill works correctly when:

  • βœ… User uploads file β†’ Complete tabbed dashboard generated automatically
  • βœ… Header and footer match CURV production tools exactly
  • βœ… Purple accent color used throughout
  • βœ… Funnel visualization shows drop-offs with CVR
  • βœ… Opportunities categorized by impact level
  • βœ… Search and sort fully functional
  • βœ… All tooltips provide useful context
  • βœ… Dashboard is visually identical to SQPR Analyser style
  • βœ… Zero questions asked before generation
  • βœ… User can make immediate business decisions from output