The Moodmix Control Room
What you'll learn
~30 min- Build a private browser-based analytics dashboard from CSV exports
- Parse and visualize Spotify for Artists and Shopify data
- Identify geographic overlaps between listeners and merch buyers
- Generate actionable next-move recommendations from your own data
What you’re building
You have ~50K monthly listeners on Spotify. You have a Shopify store selling merch. But those are two separate dashboards with two separate mental models. You have no idea which cities are streaming your music AND buying your desk pads. You can’t easily see if a track blowing up in Chicago translates to merch sales in Chicago.
You’re going to build a single dashboard that combines both data sources and tells you exactly where the opportunities are.
Everything in this lesson runs in your browser. Your Spotify and Shopify data never leaves your computer. There’s no server, no upload, no third-party analytics service. You open an HTML file, drag in your CSV exports, and the dashboard renders locally. When you close the tab, the data is gone. This matters when you’re working with revenue numbers and listener geography.
Getting your data
Before building the dashboard, you need two CSV exports:
Spotify for Artists
- Log in to artists.spotify.com
- Go to Music > select a time period (last 28 days works well)
- Click Export (top right) to download the streaming data CSV
- The CSV includes columns like: track name, streams, listeners, and sometimes city/country (availability varies by account level and export type — if your export lacks city-level data, the dashboard’s geographic sections will use the sample data fallback)
Shopify
- Log in to your Shopify admin
- Go to Analytics > Reports > Sales by product
- Export as CSV
- Also export Customers by location if available
If you’re just getting started and don’t have significant Spotify or Shopify data, you can still build the dashboard. The prompt below includes a “generate sample data” mode that creates realistic mock data so you can see the dashboard in action. Swap in your real CSVs when they’re ready.
The prompt
Start your AI CLI tool and paste this prompt:
Build a single self-contained HTML file called control-room.html that serves as aprivate analytics dashboard for an independent music artist. It combines Spotifystreaming data and Shopify merch sales data from CSV uploads.
REQUIREMENTS:
1. DATA INPUT - Two file upload zones (drag-and-drop + click): one for Spotify CSV, one for Shopify CSV - Parse CSV files client-side using PapaParse (load from CDN) - Auto-detect column headers (Spotify and Shopify export formats vary) - Add a "Load Sample Data" button that generates realistic mock data for both sources so the dashboard works without real CSVs
2. DASHBOARD SECTIONS (name each section after a song-related theme):
a. "THE DROP" — Key Metrics (top of page) - Total streams (last period) - Total unique listeners - Top track by streams - Total merch revenue - Total merch orders - Best-selling product
b. "FREQUENCY" — Top Tracks Chart - Horizontal bar chart showing top 10 tracks by stream count - Use Chart.js (load from CDN) - Orange color scheme (#f97316 primary)
c. "CITY LIGHTS" — Geographic Analysis - Top 10 cities by Spotify listeners (bar chart) - Top 10 cities by Shopify orders (bar chart) - Side-by-side comparison to spot overlaps - Highlight cities that appear in BOTH lists (these are your strongest markets) - IMPORTANT: Normalize city names before comparing — lowercase, strip state/country suffixes (", CA", ", US"), handle common abbreviations (NYC→New York, LA→Los Angeles, SF→San Francisco). Spotify and Shopify format city names differently.
d. "THE GAP" — Opportunity Zones - Table showing: cities with high streams but low/zero merch sales - Table showing: cities with merch sales but low streams (potential ad targets) - Each row: city, streams, merch orders, revenue, gap indicator
e. "NEXT MOVE" — Action Prompts - Based on the data, generate 3-5 plain-language recommendations, like: "Your top streaming city is Chicago (4,200 listeners) but you have 0 merch orders there. Consider a targeted Instagram ad for the desk pad." "Richmond has your highest merch-to-listener ratio (3.2%). This is your strongest local market." - Recommendations should use natural language, not analyst jargon
3. DESIGN - Dark theme: background #0a0a0a, cards #141414, borders #262626, text #e5e5e5 - Accent color: #f97316 (orange) for charts and highlights - Clean sans-serif font (Inter from Google Fonts CDN) - Responsive grid layout -- 2 columns on desktop, 1 on mobile - Section headers should be bold with the section name (e.g., "THE DROP") - Dashboard title: "MOODMIX CONTROL ROOM"
4. TECHNICAL - Pure HTML/CSS/JS in one file - PapaParse for CSV parsing (https://cdn.jsdelivr.net/npm/papaparse@5/papaparse.min.js) - Chart.js for visualizations (https://cdn.jsdelivr.net/npm/chart.js) - All processing happens client-side. No data is sent anywhere. - Data persists only during the browser session (no localStorage) - Add a visible "YOUR DATA STAYS LOCAL" badge in the headerWhat you get
After your AI CLI tool finishes, you’ll have one file: control-room.html. Open it in your browser.
With sample data
Click Load Sample Data first. You should see:
- THE DROP metrics panel with stream counts, revenue, and top track/product
- FREQUENCY bar chart showing your top tracks ranked by streams
- CITY LIGHTS side-by-side city charts for Spotify and Shopify
- THE GAP tables highlighting mismatches between streaming and merch geography
- NEXT MOVE 3-5 actionable recommendations in plain language
With your real data
- Export your Spotify CSV from artists.spotify.com
- Export your Shopify CSV from your admin
- Drag each file onto its respective upload zone
- Watch the dashboard populate with your actual numbers
The most valuable insight from this dashboard is the geographic comparison. When you see that Miami has 3,000 listeners but zero merch orders, that’s a specific, actionable finding. Maybe you run a targeted ad. Maybe you price a Miami-exclusive bundle. Maybe you book a gig there. The data tells you where the gap is; you decide what to do about it.
If something is off
| Problem | Follow-up prompt |
|---|---|
| CSV parsing fails | The CSV upload isn't parsing my Spotify export. The file uses semicolons instead of commas as delimiters. Add auto-delimiter detection in PapaParse config. |
| Charts don’t show | The Chart.js charts are blank. Make sure Chart.js is fully loaded before creating any charts. Wrap chart creation in a DOMContentLoaded handler and add error handling for the CDN load. |
| City matching misses similar names | The geographic comparison isn't matching "New York" (Spotify) with "New York City" (Shopify). Add fuzzy matching that normalizes city names: strip "City", handle common abbreviations (NYC, LA, SF), and compare lowercase. |
| Sample data doesn’t look realistic | The sample data is too uniform. Make the streams follow a power-law distribution (top track 5x more than 10th), scatter the cities realistically across the US, and make merch orders much smaller than stream counts (typical conversion is < 0.1%). |
Customize it
Add time-series trends
Add a "WAVELENGTH" section with a line chart showing streams per day over theselected period. If the Spotify CSV includes date data, plot it as a time series.Add a second line for merch orders per day. This shows whether release spikescorrelate with merch purchase spikes.Add product performance breakdown
Add a "MERCH RACK" section that breaks down Shopify sales by product. Show adonut chart of revenue by product category (t-shirts, desk pads, hats, etc.).Below it, show a table with: product name, units sold, revenue, average order value.Sort by revenue descending.Export a report
Add an "Export Report" button that generates a markdown file summarizing:- Key metrics from THE DROP- Top 5 tracks and top 5 cities- The 3 best opportunities from THE GAP- All NEXT MOVE recommendationsFormat it as a clean report I could send to a manager or booking agent.Add release correlation
Add a "RELEASE RADAR" section. I'll input my release dates (as a simple JSON array).On the streams time-series chart, add vertical markers at each release date. Thisshows the impact of each release on streaming numbers -- does a new single spikestreams across the whole catalog?🔍Why private dashboards beat third-party analytics
Services like Chartmetric, Soundcharts, and Spotify for Artists give you dashboards. So why build your own?
- Cross-platform: No third-party tool combines your Spotify data with your Shopify data. They’re separate ecosystems. Your dashboard bridges them.
- Custom questions: You can’t ask Chartmetric “which cities stream me but don’t buy merch?” Your dashboard answers exactly the questions you care about.
- Privacy: Your revenue numbers, geographic data, and listener demographics stay on your machine. No uploading to yet another analytics service.
- Free: No monthly subscription for another SaaS tool. You built it once, you use it forever.
- Extensible: When you want a new metric or chart, it’s one follow-up prompt away. Try asking Chartmetric to add a custom section.
The tradeoff: you don’t get real-time data or API integrations. You’re working with CSV exports, which means periodic manual updates. For an independent artist checking numbers weekly, that’s perfectly fine.
When Things Go Wrong
Use the Symptom → Evidence → Request pattern: describe what you see, paste the error, then ask for a fix.
Putting it all together
Over these four lessons, you’ve built the foundation of a complete toolkit:
- Release Asset Engine (Lesson 1) — one command generates platform-ready artwork
- Campaign Generator (Lesson 2) — one metadata file produces captions, hashtags, calendar, and an EPK
- Episode Builder (Lesson 3) — one notes file generates all YouTube publishing metadata
- Control Room (Lesson 4) — one dashboard shows where listeners and buyers overlap
These tools connect. The asset engine’s output feeds into the campaign generator’s EPK. The campaign calendar drives your posting schedule. The episode builder handles your YouTube content. And the control room tells you what’s working and where to focus next.
Try it yourself
- Open your AI CLI tool in an empty folder.
- Paste the main prompt.
- Click Load Sample Data to see the dashboard in action.
- If you have real Spotify and Shopify CSVs, drag them in and see your actual data.
- Pick one customization (time-series trends or product breakdown work well) and add it.
Key takeaways
- CSV exports are your raw material — Spotify for Artists and Shopify both let you export data. Your dashboard turns those exports into intelligence.
- Geographic overlap is the highest-value insight — knowing where listeners and buyers overlap (or don’t) drives real business decisions.
- Private dashboards protect your data — no uploads, no third parties, no subscriptions. Everything runs in your browser.
- Action prompts beat raw numbers — the NEXT MOVE section translates data into “do this next” recommendations, which is what you actually need.
- This is the orchestrator pattern at scale — you didn’t write a charting library or a CSV parser. You directed your AI CLI tool to combine existing tools (PapaParse, Chart.js) into something specific to your needs.
Your dashboard shows that Austin has 2,800 Spotify listeners but zero Shopify merch orders. What does this tell you?
What’s next
In the next lesson, you’ll build The Royalty Reconciliation Tool — a CLI that ingests royalty CSVs from multiple distributors, reconciles the numbers, and flags discrepancies. Independent artists lose 10-25% of their royalties to reporting errors. This tool catches what you’d otherwise miss.