Creating an Interactive Sheet Music Sales Dashboard: Automating ArrangeMe Sales Report Downloads with Playwright; Cleaning and Enriching Transaction Data with pandas; and Visualizing Sales, Commissions, and Purchase Locations with Streamlit and Plotly

(For the GitHub repository, please click here, and for the interactive dashboard, please click here.)

Summary‍ ‍

This interactive dashboard tracks sales of my sheet music arrangements, published through ArrangeMe and sold on Sheet Music Plus, Sheet Music Direct, the Sheet Music Direct app, and MuseScore. New sales reports are downloaded and published automatically on a schedule.

It’s built with Streamlit, pandas, Plotly and Playwright.

What's in the dashboard

Sidebar filters (apply to every chart and table)

  • Date Sold range

  • Transaction Type: Purchase (download) and/or View (subscription)

  • Artist(s), with an "All" toggle

  • Title(s), narrowed to the selected artists

Overview tab

  • Summary cards: titles sold, total sales, estimated commissions (with averages by transaction type), unique artists, and unique titles (active vs. deactivated)

  • Units sold and estimated commissions by artist and by title

  • A full title table with sheet music cover previews (click a row to enlarge)

  • A world map of purchases by country (location is only recorded for purchases, not views)

Artist / Title Deep Dive tab

  • Titles sold, sales and commissions over time

  • Titles sold by channel

  • Titles by publish date

  • Purchase vs. View breakdown, including commission per unit sold

How the data works

  1. Download: download_report.py logs into ArrangeMe with a headless browser (Playwright) and saves the latest sales report to data/raw/sales_report_latest.csv.

  2. Publish: update_and_push.py runs the download, then commits and pushes the new report to GitHub. On macOS, sheetmusic.plist schedules it to run automatically with launchd.

  3. Cleaning: dashboard.py corrects titles and adds artist and publish-date information by AME ID.

  4. Cover images: preview images are downloaded from the URLs in THUMBNAIL_URLS and re-checked weekly, so updated covers replace old ones.

The public dashboard never logs in anywhere. It reads the latest report committed to this repo, so no account credentials are stored in the cloud.

Tools Used

  • Python

  • pandas

  • Streamlit

  • Plotly

  • Playwright

  • Requests

  • Jupyter Notebook

  • Git

  • Streamlit Community Cloud

Next
Next

NYC Live MTA Bus Tracker Using Mapbox GL JS, MTA Bus Time API, AWS Lambda