Turns out every individual post's own analytics page has an "Export" button
(SinglePostAnalytics_<Name>_<id>.xlsx) giving exactly the detail that was being
hand-logged: Profile Viewers/Followers Gained from the post, and the Reactions/
Comments/Reposts/Saves/Sends/Link/Premium-button breakdown behind the Aggregate
Analytics file's single blended "Engagements" number.
Matches each file to a post by its own "Post URL" field, not the numeric id in
the filename - confirmed those two ids are actually different LinkedIn schemes,
so filename-based matching would have been wrong. Loaded once per render
(load_post_details) rather than re-parsed per table row.
All 4 of Mckinley's real posts are now auto-covered (55/80/17/365 impressions),
replacing the 1-of-4 hand-logged coverage from before. Kept showing both
engagement numbers side by side in the table/report - the per-post export's own
breakdown sum has been observed to disagree with the aggregate export's
Engagements figure for the same post more than once now.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Calendar now matches the Overview tab for real: reuses _month_day_tiles to show
the default month's day-by-day breakdown underneath the month-box grid (not just
the month boxes alone), and the New Followers bar chart now overlays star markers
on publish days via the Page's own mark_posts(), using TEAM_BASELINE_DATE-filtered
data the same way the Page's own fts is filtered to >= BASELINE_DATE (so the
calendar/chart show the real June-October window, not the export's full noisy
~365-day span). Month-click-to-expand isn't interactive yet - would need its own
per-person callback wiring - so it always shows the most recent month.
Impressions, Daily Engagement Rate, Audience Demographics, and Content
Demographics now sit on one row (4 cards), and both demographics tables are
capped to their top 5 rows by Percentage instead of showing everything.
Logged two more real posts in post_details_tracker.py from screenshots (the
July 9 and Oct 22 posts) - only one post left unlogged.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
LinkedIn's export has no per-post Profile Viewers/Followers Gained attribution,
and its "Engagements" column is a single blended number - none of that exists
anywhere in the Aggregate Analytics file. Each individual post's own analytics
panel does show it, so this is a hand-logged, per-post-URL dict
(post_details_tracker.py, same add-an-entry pattern as the other two trackers).
Added as extra columns to the Posts table (both the live dashboard and the
downloadable report) alongside the exported Impressions/Engagements, rather
than replacing them - the two Engagement numbers have been observed to
genuinely disagree for the same post (export said 25, the post's own panel
summed reactions+comments+reposts+saves+sends to 20), so both are shown
instead of one silently overriding the other.
Seeded with one real logged post (the July 2 post: 3 profile viewers, 0
followers gained, 15 reactions, 5 comments).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>