A powerful Streamlit dashboard for analyzing your Substack newsletter's subscriber engagement, growth metrics, and list health.
Based on Sharyph's excellent newsletter audit playbook.
- 7 Key Metrics Dashboard: Track open rates, conversion rates, growth, and churn with industry benchmarks
- Post Analysis: See which posts drive the most engagement and conversions
- Subscriber Segmentation: Identify super engagers, at-risk subscribers, and geographic distribution
- Engagement Flow: Visualize how subscribers move through engagement states with Sankey diagrams
- List Cleaning Tools: Find inactive subscribers and optimize your list health
- Drag-and-Drop Upload: Easy data import with automatic validation
First, check if Python is already installed. Open your terminal and type:
python3 --versionIf you see a version number (3.9 or higher), skip to Step 2. If not, install Python:
Mac:
- Download Python from python.org/downloads
- Open the downloaded file and follow the installer
Windows:
- Download Python from python.org/downloads
- Important: Check the box that says "Add Python to PATH" during installation
- Follow the installer prompts
How to open a terminal:
- Mac: Press
Cmd + Space, type "Terminal", press Enter- Windows: Press
Win + R, type "cmd", press Enter
Option A: Download as ZIP (easiest)
- Click the green Code button at the top of this page
- Click Download ZIP
- Unzip the downloaded file
- Open your terminal and navigate to the folder:
cd ~/Downloads/substack-subscriber-analytics-main
Option B: Using Git (if you have it)
git clone https://github.com/yourusername/substack-subscriber-analytics.git
cd substack-subscriber-analyticsA virtual environment keeps this project's packages separate from your other Python projects. In your terminal (make sure you're in the project folder), run:
Mac/Linux:
python3 -m venv venv
source venv/bin/activateWindows:
python -m venv venv
venv\Scripts\activateYou'll know it worked when you see (venv) at the start of your terminal line.
With your virtual environment activated, run:
pip install -r requirements.txtstreamlit run app.pyYour browser should automatically open to the dashboard. If it doesn't, go to: http://localhost:8501
Each time you want to run the app, open your terminal and run:
Mac/Linux:
cd /path/to/substack-subscriber-analytics
source venv/bin/activate
streamlit run app.pyWindows:
cd \path\to\substack-subscriber-analytics
venv\Scripts\activate
streamlit run app.pyExport your complete newsletter data from Substack:
- Go to your Substack dashboard
- Navigate to Settings → Exports
- Click "Download a zip of all your data"
This zip file contains:
email_list.*.csv- Your subscriber listposts.csv- All your postsposts/folder - Engagement data (opens and deliveries per post)
For richer analytics including geographic data and multi-channel engagement:
- Go to your Substack dashboard
- Navigate to Subscribers
- Click "Export" to download
subscriber_details.csv
This unlocks:
- Geographic segmentation (by country/region)
- Multi-channel engagement tracking (email, web, comments, shares)
- Advanced inactive subscriber analysis
- Engagement flow Sankey diagrams
- When you first open the app, you'll see the upload modal
- Drag and drop your Substack export
.zipfile - The app validates and extracts your data automatically
- Optionally add
subscriber_details.csvfor enhanced analytics
Use the sidebar to navigate between views:
- Overview: Key metrics at a glance with conversion funnel
- Post Analysis: Engagement rates and conversion attribution by post
- Subscriber Analysis: Acquisition trends and source analysis
- Engagement Trends: Monthly open rate trends and activity
- Segments: Super engagers, at-risk subscribers, geographic breakdown
- Engagement Flow: Sankey diagrams showing subscriber journeys
- Inactive Subscribers: List cleaning recommendations and impact analysis
- Multiple Datasets: Upload and switch between different data exports
- Add Details: Enhance any dataset by adding
subscriber_details.csv - Delete: Remove old datasets you no longer need
Your data stays on your machine:
- All processing happens locally
- Uploaded data is stored in
.data/(gitignored) - No data is sent to external servers
substack-subscriber-analytics/
├── app.py # Main Streamlit application
├── data_loader.py # Data loading and parsing
├── metrics.py # KPI calculations
├── analytics.py # Advanced analysis functions
├── visualizations.py # Chart generation
├── upload_handler.py # File upload processing
├── config.py # Configuration settings
├── components/ # UI components
│ ├── upload_modal.py # Upload interface
│ └── data_manager.py # Dataset management
├── .data/ # User data (gitignored)
├── requirements.txt # Python dependencies
├── LICENSE # MIT License
└── README.md # This file
pandas >= 2.0.0
seaborn >= 0.13.0
matplotlib >= 3.7.0
streamlit >= 1.28.0
plotly >= 5.18.0
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.

