What to do today, what changed overnight, and what's stuck.
Reference numbers
web · music · catalogueToday's actions
stalest · most-urgent · most-actionable- Loading…
Operations queues · from the database
DB · … every count = a pending human decision- Loading…
What changed · last 24h
Linear · publishes · licensing · payouts- Loading…
B2B · sales pipeline
CRM · … open CRM →Closed this month
Business outstanding
To chase — stale + inbound awaiting us
To-dos · in priority order
click any to open in LinearMikey
- Loading…
Waiting on Giles
- Loading…
Up & down
7-day · 30-day · auto from data sourcesRisers
Fallers
Achievements · last 7 days
auto · publishes · inquiries · payouts- Loading…
What the database taught us
from the June 2026 operations discovery- Loading…
Worth knowing
curated · edits todata/intranet/this-week.md
The dev copy of the real site is live on the Mac mini — code from GitLab, Karel's database restore (40,673 chants), site/admin/API on localhost 8800/8001/8002. All rebuild work happens there; production untouched.
The plan is v2: priority order, no weeks — P1 newsletter, P2 website, P3 matchday social + Stan, then the checking sheets, lyric sweep, enrichment import, vlogger programme. Full list: docs/strategy/fanchants-plan-v2.md.
This page is the Heartbeat — the end state is the business steering from here. The operations queues above come straight from the database; each count is a pending human decision. Next: one-click actions per queue.
Effort streaks · this week
visible push-against targetWhat changed this week
auto-digest · last 7 daysSecondary tiles
click to drill into sourceA · Revenue & streams overview
All values USD, from FanChants_KPI_Master.xlsx. Tournament months (WC, EURO) flagged on the trend.
Routenote (primary, in FanChants_KPI_Master.xlsx) stacked with Sounddrop (data/finance/sounddrop-monthly.csv) and Ditto payouts (when populated). All values converted to USD; Ditto payouts are converted from GBP at the rate in config.js → finance.usd_to_gbp_rate.
Lifetime totals from each distributor pipeline. Hover for per-distributor totals; Sounddrop and Ditto are gitignored sensitive sources bundled at build time.
Where every dollar of streaming revenue actually comes from, combined across distributors. Routenote contributes its Store-Mix sheet; Sounddrop contributes per-service rows from sounddrop-by-service.csv; SoundOn from soundon-by-service.csv (GBP→USD at config rate). Ditto only reports a single lifetime payout — no service breakdown to merge.
Routenote reports a single stream count and a single net USD per row — Premium vs. free isn't broken out at source. The chart below uses the standard industry split (Spotify Premium ≈ 75% of revenue, ≈ 35% of streams) to give Mikey an estimate. Wired to be swapped when a real split becomes available.
B · Catalogue health
Source of truth for catalogue: scripts/enrichment/chants_by_originaltune_snapshot.csv (22,649 chants).
Per-album annualised earnings × Routenote $25/yr All-Access cost frames each album as Green/Yellow/Amber/Red. Green <$10/yr, Yellow $10–100, Amber $100–500, Red >$500.
Spotify artists where multiple RouteNote 'Album Artist' variants map to one profile. File requests with Routenote Support to merge.
C · Spotify playlist programme
Two tracks. Track 1 — @FanChants official, zero-trademark. Track 2 — Giles dev curator programme + personal accounts (trademark-fair-use).
WC2026 playlist rollout
cadence · coverage · personasPublish cadence
status=ok across all cohorts · click a tile for URLsWC2026 nation coverage
…Persona slate
Per-playlist metrics
…Profile-display cap is 200 — see docs/decisions/2026-05-09-wc2026-publishing-cadence.md.
D · Web analytics (Google Analytics 4)
- Create a GCP service account, grant it
Vieweron the GA4 property. - Download the JSON key to
~/.fanchants/ga-credentials.json. - Open
dashboard/config.jsand paste the numeric property ID intoga.property_id. pip install google-analytics-data --break-system-packages.- Refresh.
Full step-by-step walkthrough in dashboard/README.md.
E · Operational pipelines
From reports/2026-04/changes.csv (the English-pyramid CSV apply). The 2,094-row global anomalies workbook is referenced — clicking the chip below opens the file.
F · More numbers worth watching
Top 100 albums by trailing-12 normalised USD. Verdict per the Premium Upgrade Analysis sheet (Strong / Watch / Skip).
Per-album, per-tournament-month USD vs. its baseline. WC = Qatar 2022. EURO = 2024.
T · TikTok analysis
TikTok is structurally different from streaming DSPs — pays per-view at ~$0.005/1000 views, but moves a huge volume. ~1.2bn plays/year per the 2026 estimate; revenue flows through SoundOn (TikTok's own distributor). Direct-deal negotiation in progress.
Sums TikTok rows from data/finance/soundon-by-service.csv per reporting period. Lag of ~6 weeks while SoundOn waits on TikTok's monthly report.
SoundOn views vs GBP per month. The slope is effective revenue-per-view — useful to track when the direct-deal lands.
TikTok is the largest single SoundOn service. The rest of the SoundOn fan-out (Spotify, Facebook/Instagram story, YouTube CID, etc.) is shown for context.
- PLAYS/YEAR · ~1.2bn across the catalogue (2026 estimate)
- REVENUE/YEAR · ~£600 via SoundOn — currently the only path TikTok pays out on
- EFFECTIVE CPM · ~£0.0005 per 1000 views
- DIRECT DEAL · negotiating — direct-deal economics would 10×+ the per-view rate
- CONTENT ID · TikTok's Content ID matches FanChants audio against creator UGC; SoundOn collects the per-view share. This is how the bulk of those 1.2bn plays earn anything at all.
TikTok is the largest single audio surface FanChants reaches by raw volume, and the lowest yielding per view. The dynamics are different from DSP streaming: volume scales superlinearly with cultural moments (cup finals, Eurovision, viral creators picking up a chant), but revenue is bounded by the CPM until the direct deal lands. Folding TikTok into a generic "Revenue" tile loses both the volume signal and the deal-pending story.
When the direct deal closes, this page is where the new per-view rate gets plotted as a goal line on the views-vs-revenue chart.
H · Finance
Reads data/finance/financial-summary.csv — Giles updates it after each month-end close. Streaming USD from the KPI workbook is auto-converted at the rate in config.js when the GBP cell is left blank.
I · B2B licensing pipeline
Reads data/licensing/inquiries.csv. Edit the CSV after every inquiry — the dashboard recomputes conversion rates and surfaces stale entries.
K · Releases
Pitch + Canvas + Artist Pick + social status per release. Reads data/releases/upcoming.csv (FAN-303). The editorial pitch is the only hard deadline — it closes at release.
L · FanCapo moderation
Reads data/fancapo/moderation-status.json, generated from the local dev meta DB and legacy FanCapo approvals. Snapshot only: no alerts, no emails, no DB writes.
Capos with two or more rejected legacy approvals. Member emails are stripped from the committed snapshot.
J · CRM (B2B outreach)
Reads data/crm/snapshot.json — a JSON snapshot of the Django CRM (webapp/crm/), regenerated by python manage.py export_dashboard_snapshot. Run alongside dashboard/build.py on the morning cron.
The B2B buckets — contacts, outreach, replies, deals, won value over the last 30 days. Which bucket is converting.
Where the CRM's organizations sit across the B2B market map.
Per active campaign — delivery, opens, replies, deals. Click a row to open it in the CRM.
Replies and hot-classified contacts where no follow-up action has been logged since the reply landed. Top 25, most-recent-first.