Legacy Tool
This tool requires the old Universal Analytics (pre-GA4) data format. It may still work if you have historical UA exports, but is not compatible with GA4.
BCG Matrix Generator
Use cases
Creates BCG matrix charts from Google Analytics Excel exports using matplotlib.
Normalizes sessions and revenue to 0-100 scale, sizes bubbles by session volume, and divides into four quadrants at 50/50 crosshairs.
Auto-generates cascading reports one URL depth level deeper for each category folder.
Platform
Jupyter Notebook (requires Python environment)
Input
GA landing page Excel export
Output
BCG matrix PNG charts by category
Features
- Four-quadrant BCG framework (Finders, Keepers, Losers, Weepers)
- Cascading reports one folder level deeper per category
- Bubble sizing proportional to session volume
- Configurable url_depth for folder extraction (default 2)
- 300 DPI PNG export for presentations
How to use
- 1 Export the GA landing page report as Excel with Sessions and Revenue (sheet must be named Dataset1)
- 2 Upload the Excel file to the notebook (export all rows; it warns under 100)
- 3 Set url_depth for folder extraction level
- 4 Configure quadrant labels and text styling
- 5 Allow Chrome to download multiple files when prompted
- 6 Download PNG charts (main + cascading by category)
Frequently asked questions
- What exact file format does the notebook expect?
- An Excel export from Google Analytics containing a sheet named 'Dataset1' with columns called Landing Page, Sessions and Revenue. A CSV will not work because the code reads a named Excel sheet. The notebook also warns if fewer than 100 rows are imported, which usually means you exported only the visible rows rather than all rows.
- What do the chart axes actually represent?
- Each axis is scaled to a percentage of the best-performing folder: 100 times the folder's sessions (or revenue) divided by the maximum across folders. The quadrant lines sit at 50, meaning half the top performer's value, so the quadrants are relative to your best folder, not averages or absolute thresholds. Bubble size is proportional to the same sessions share.
- Why do the cascading sub-category charts stop before covering every category?
- Categories are processed in descending sessions order and the loop breaks entirely at the first category with fewer than three subfolders, rather than skipping it. Any lower-traffic categories after that point get no chart, so a small category early in the list can cut the run short.
- Are pagination and filter URLs handled?
- In the drill-down reports, subfolder rows containing 'page' or '=' are removed to strip pagination and parameter URLs. Note the match is a substring check, so a genuine folder with 'page' in its name (for example landing-pages) is also excluded.
- Why do I only get one PNG downloaded?
- The notebook triggers a separate browser download for the main chart plus one per category. Chrome blocks multiple automatic downloads by default, so watch for the popup asking to allow the site to download multiple files and approve it, otherwise only the first PNG arrives.
Want me to run this for you?
I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.
Related Tools
Capture screenshots at GA visitor resolutions using Pyppeteer async browser automation.
Analyse Google core update impact by URL folder using Ahrefs data.
Calculate competitive share of voice from Ahrefs traffic data with Excel chart export.
Detect significant traffic changes in GSC data to identify Google update impacts.
Calculate organic traffic share using ranking positions and CTR curves.
Calculate percentage changes between two values quickly.
Need something built for your business?
This tool started as bespoke client work. I build custom scripts, data pipelines, and full apps for SEO and product data problems that off-the-shelf tools don't solve.
Tell Me What You Need