Files
LinkedIn-Analytics-Dashboard/monthly_report_notes.py
T
beantownbabeandClaude Sonnet 5 f9f27401db Add Reports tab: monthly campaign progress reports
New "Reports" tab for the 3-month LinkedIn campaign, combining dashboard
data with the Follower Directory rather than a standalone HTML/PDF
workflow. For each campaign month it shows KPI tiles (including a new
Monthly Growth Rate, this month's net new followers as a percentage of
the followers already on the page at the start of that month, resets
every month against its own starting count), the follower growth chart,
every post published that month, an Audience Composition breakdown
sourced live from the Follower Directory (sector/seniority/country, both
this month's cohort and the all-time snapshot), and curated monthly
narrative notes (features shipped, data quality fixes, Directory
updates, outstanding items). Reuses the existing reportlab PDF pipeline,
extended with the same sections, and mirrored in the static exporter
with live-only controls disabled.

New files: monthly_report_notes.py (per-month curated narrative,
July populated), follower_directory_data.py (parses the Directory's
DATA array directly so numbers can't drift from the hand-maintained
source of truth).

Also fixes three pre-existing bugs found while building this: average
engagement rate was displaying 100x too small (a 0-1 fraction shown
as-is instead of scaled to a percentage), the Sector/Seniority/Country
breakdown tables were silently truncated below their own stated totals
(a hardcoded top-5 display cap plus a separate top-10 country cap
inside composition_stats itself), and the static exporter had no
support for dbc.Table, dropping the <table> tag entirely.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-05 09:56:19 +02:00

67 lines
4.1 KiB
Python

"""Curated, hand-written narrative for each month of the 3-month LinkedIn campaign
(July, August, September 2026, plus an end-of-campaign report). Growth numbers are
computed live from the exports elsewhere (see report.compute_period_stats), this file
only holds the "why", which lives in git history and project context, not in any
dataframe. Keyed by the same "YYYY-MM" strings report.report_month_options() produces.
Add August's and September's entries here as those months are written up, no other
code changes are needed for the Reports tab or PDF to pick them up.
"""
NOTES = {
"2026-07": {
"features_shipped": [
"Initial dashboard build (Jul 21): Overview, Content, Followers, Visitors, "
"Competitors, and Growth tabs, weekly-pace tracking, PDF report generation, "
"data upload with live refresh, and a static HTML export builder for sharing "
"via NextCloud.",
"Posts table made scrollable instead of growing indefinitely, and the file "
"finder hardened to ignore non-export files sitting in the same folder (Jul 22).",
"Follower Directory and Follower Study linked directly from the Followers tab "
"hero banner (Jul 31).",
"Followers by Country map expanded from 14 hardcoded country centroids to a "
"near-complete world table, with a console warning for any country still "
"missing one (Jul 31).",
"Calendar month drill-down tiles, a follower-breakdown expand toggle, a CTR "
"explainer, and manual post title overrides added across the Followers and "
"Content tabs (Jul 31).",
],
"data_quality": [
"File finder no longer crashes when a stray non-export file, a manual roster "
"or an Office lock file, sits in the same folder as the real LinkedIn exports.",
"Country map no longer silently drops a country if it is missing a centroid, "
"it now warns in the console instead, and the on-screen country count is "
"computed from the same rollup as the map so the two can never disagree.",
"Visitors category breakdown (Location, Seniority, Company size) is no longer "
"lost month to month. LinkedIn only reports a category once it clears a "
"per-export minimum-visits threshold, so a single-snapshot approach was "
"silently losing real categories that dipped below the threshold one week and "
"reappeared the next. Replaced with an append-only running-total log "
"(visitor_history.py).",
"Conversion Rate chart no longer silently drops days with zero tracked "
"visitors but a real follower change (LinkedIn lets people follow a Page "
"directly from a feed post, with no page visit at all). Every day now shows, "
"with those days flagged instead of hidden.",
],
"follower_study": [
"Grew and was actively reclassified throughout July as new followers were "
"screenshotted and profiled by hand.",
"A seniority and sector classification fix landed Jul 31 (backup preserved as "
"follower_directory_BACKUP-before-student-sector-fix.html), plus several "
"individual profile confirmations (Dominique Elser, Anna Bujak, Emma Xia, "
"Marten Edwards, Mudabar Ahmad Mubashar, Martin Schroter) that corrected "
"taglines into real titles and employers.",
"Not yet brought under git version control during July itself, that happened "
"Aug 3 and falls outside this report.",
],
"outstanding": [
"The end-of-week report explaining every dashboard chart to the bosses was "
"due Fri Jul 31, status needs confirming with the user before marking this "
"done.",
"The conversion-rate weekly-bucket and 3 to 7 day match-window widening "
"discussed Jul 28, to make the follow-attribution pattern more convincing "
"across multiple weeks, is still conceptual, not implemented.",
],
},
}