--- 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) ```html

[Dashboard Name]

[Description of data - e.g., "30-Day Amazon Advertising Analysis | Aug 11 - Sep 9, 2025"]

POWERED BY CURV

``` **Required CSS for Header:** ```css .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) ```html ``` **Required CSS for Footer:** ```css .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) ```html
``` **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 ```css /* 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 ```css /* 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 ```css .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 ```css .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 ```html
``` ## 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: ```html
πŸ‘οΈ

50.9K

IMPRESSIONS

total

ℹ️ What this means
``` **Icon mapping for PPC:** - Impressions: πŸ‘οΈ - Clicks: πŸ–±οΈ - Basket Adds: πŸ›’ - Purchases: πŸ’° - Spend: πŸ’³ - Sales: πŸ“ˆ ### Tooltip Content: ```html ``` ## 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: ```html
3 results
``` ### Performance Score Badges: ```html

Performance Score Legend

51-100%: Excellent
26-50%: Good
0-25%: Needs Work
``` **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: ```html
SEARCH QUERY ⬍ SCORE ⬍ IMPRESSIONS ⬍ CLICKS ⬍ CTR % ⬍ ROAS ⬍
``` ### Classification Badges in Table: ```html βœ“ STABLE PERFORMER ↓ -24% ``` **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: ```html

Customer Journey Funnel

Track your customer journey from first impression to final purchase. Spot bottlenecks instantly and discover growth opportunities.

πŸ‘οΈ Impressions
50.9K
9.7% market share
⬇ -94.9% drop-off
↓
πŸ–±οΈ Clicks
2.6K
5.1% CVR ⚠️ Critical Drop-off

0.62%

Overall Conversion

94.9%

Biggest Problem

Impressions β†’ Clicks

Critical Stage

2

Issues to Fix

πŸ’‘ Understanding Your Sales Funnel

πŸ‘οΈ Impressions Shoppers see your product in search results
β†’
πŸ–±οΈ Clicks Interested shoppers click to learn more
β†’
πŸ›’ Cart Adds Convinced shoppers add to cart
β†’
πŸ’° Purchases Final step: completed sales
``` ### Funnel Styling: ```css .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: ```html

Opportunities Legend

πŸ’Ž Hidden Gem Low market share, high conversion
⚠️ Funnel Bottleneck High traffic, poor conversion
πŸ“Š Share Opportunity Strong metrics, growth potential

Impact Levels

High Impact 10,000+ impressions
Medium Impact 3,000-10,000 impressions
Low Impact <3,000 impressions
``` ### Impact Filter Buttons: ```html

πŸ’‘ Hover over any opportunity card for detailed performance breakdown

``` ### Opportunity Cards: ```html
πŸ’Ž HIGH IMPACT

Hidden Gem

wireless headphones

Low market share but high conversion rate - untapped potential

Impressions: 15,420
Clicks: 892
Purchases: 87
CVR: 0.56%
``` ### 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: ```javascript 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: ```javascript 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: ```html

πŸ“Š Key Insights

βœ“

Product Pages outperform all placements

5.84x ROAS vs 2.1x average

πŸ’‘ What this means
``` ### Recommendation Cards: ```html

🎯 Actionable Recommendations

1

Reallocate 40% of "Rest of Search" budget to "Product Pages"

Rest of Search shows 33.5% ACOS vs Product Pages at 17.1% ACOS

Expected Impact: Overall ACOS drops from 25.5% to ~22%
πŸ”΄ High Priority
``` ## Performance Summary Cards ### Conversion Rate Cards (for Funnel): ```html

Performance Summary

Conversion rates show how effectively you move customers through your sales funnel

5.1%

CLICK RATE

How appealing your listing is compared to competitors

21.6%

ADD-TO-CART RATE

How convincing your product details and pricing are

56.1%

PURCHASE RATE

How well you convert cart additions to actual sales

0.62%

OVERALL CVR

Your complete funnel: from impression to purchase

``` ## 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 `` with `` and `` - βœ… All CSS in `

PPC Placement Performance

30-Day Analysis (Aug 11 - Sep 9, 2025) β€’ 3,917 data points analyzed

POWERED BY CURV

``` ## 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