Ga4 Dashboard
repo: ~/Projects/ga4-dashboard · 4 commits · 0 in last 24h, 0 in last 7d ·
Skills used
- /www1
- /trailing-slash1
- /canonical1
- /data1
- /table1
Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
464db7f · 2026-08-04 · Fix A: duplicate-domain dedup; Fix B: wire table column sort
Fix A (etl.py): after building the results list, normalize each property's
domain (lowercase, strip scheme/www./trailing-slash) and group by normalized
key. For any domain shared by >1 property, pick the canonical as the one with
the highest sessions_7d (tie-break: newest create_time) and set
duplicate_domain=True/canonical=False on the rest. Every entry now carries
both fields. ETL run confirmed 10 duplicates flagged across 126 properties.
Fix A (server.js): active-site headline count now excludes non-canonical
duplicates (54 real active vs. inflated 64). filterData() respects a
"Hide duplicates" checkbox (default checked, persisted to localStorage).
Duplicate cards and table rows get an opacity-0.6 "is-dup" class and a
muted "dup" badge.
Fix B (server.js): table <th> headers wired with onclick="tableSort(key)".
Added colValue(), NUMERIC_COLS, sortByState(), and tableSort() — numeric
cols sort descending by default, text cols A-Z. Active sort header gets
.sorted class + directional arrow. render() uses sortByState() when a
column sort is active in table mode.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
f917b8b · 2026-08-04 · Add GA4 fleet traffic dashboard (local, port 9710)
ETL script (etl.py) auto-discovers all accounts + properties via GA4 Admin API,
pulls 7d + 30d traffic metrics, writes cache/data.json. Server (server.js) serves
the cache instantly with basic-auth, sort, density slider, grid/table toggle, and
drill-down links to GA4 reports. 126 properties across 2 accounts, 0 errors, $0 cost.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
File tree
6 files tracked. Click any to browse the source at HEAD.
rendered in 0ms