Dashboard channel reporting: reconcile tabs, split Google Ads, refine classification, add per-channel growth chart#7
Open
SushankSinha wants to merge 3 commits into
Open
Conversation
added 2 commits
July 1, 2026 01:23
…harts; analytics terminology
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Makes the dashboard's channel reporting consistent and complete: the per-channel tabs now tie out to the Overview, Google Ads is split from organic Google into its own channel and tab, several channels that leaked into "Other" are correctly classified, and every channel tab gets the same 30-day growth chart as the Overview, populated with its own data.
Closes #6.
Description
Builds on the
session_any_sourcechange (PR #4, issue #3).1. Tab reconciliation. Per-session classification (
classified_sessions) now resolves a session's source the same wayattributed_signupsdoes.2. Google Ads as its own channel.
SOURCE_CASE_SQLclassifiesutm_source=googleasgoogle_ads(checked before organic Google so a paid click is paid even with a google.com referrer). Adds agoogleAdsConversionscount to/api/totals, a/api/google-adslanding-page endpoint, an Overview card, a sidebar tab, and aGoogleAdsTabcomponent.3. Classification refinements.
utm_medium=youtube/utm_medium=linkedinroute to those channels (recovering links mis-taggedutm_source=description); the Brevo match widens toreferrer_domain ILIKE '%brevo%'; the AI-chat sub-source also matchesutm_source(chatgpt / perplexity / copilot); ecosia and regional Yahoo are added to "Other search engine". These correct headline channel counts and tidy the Other drill-down without changing the Other total for the relabels.4. Per-channel growth charts. New
/api/source-growth?source=endpoint returns daily conversions over the last 30 days plus the all-time cumulative total per channel (same shape as/api/user-growth). TheUserGrowthChartgains optionaltitle/cumulativeLabel/dailyLabelprops, and the LinkedIn / YouTube / Google / Google Ads tabs render it between the cards and the table. Fetched only for the active channel tab.Validated on a full local replica: tab totals match the Overview for every range tested; Google split is clean (
google + google_adsequals the old combined Google); classification refinements move the expected counts with the Other total preserved for relabels.What type of PR
googleAdsConversionsto the/api/totalsresponse shape)Screenshots
Overview tab with separate card for Google Ads Attribution

LinkedIn, Youtube and Google Analytics with chart
Checklist
analytics_dashboard(backendserver/index.js+ frontend tab/card/chart files).tsc -bclean; verified on a full local replica.google + google_adsequals the previous combined Google count.