SEO/content analytics vs product analytics:- SEO/content focuses on discovery (impressions, queries, positions, indexability, crawl/index health) and how search behavior drives visits; product analytics focuses on user behavior after arrival, feature usage, conversion funnels and retention. SEO is upstream (visibility + intent); product analytics is downstream (engagement + monetization). Measurement needs and time windows differ (search can have long tail effects), and joins require careful URL / attribution alignment.Key metrics to provide content teams (grouped by dashboard):1. Visibility & query performance- Impressions (GSC), clicks (GSC), average position, search CTR (clicks/impressions), top queries by impressions/clicks2. Landing-page performance (page-level SEO → product)- Landing-page impressions & clicks (GSC), sessions (analytics), users, new users, bounce rate, avg. session duration, pages per session3. Conversion & value- Landing-page conversions (goal completions or e-commerce), conversion rate (conversions / organic sessions), revenue per organic session, assisted conversions4. Site health & technical SEO- Crawl errors, index coverage, sitemap status, page speed, canonical issues5. Funnel + query → conversion- Top queries → landing pages → conversion rates, query-level conversion valueDashboards to deliver:- Site Overview (trends: impressions, clicks, organic sessions, conversions, avg position)- Landing Page Detail (time-series + cohort conversion, top queries mapping)- Query to Outcome (query → landing page → conversion funnel)- Technical Health (crawl errors, index coverage, 404s, redirect chains)- Experimentation / Content Tests (A/B, topic cluster performance)How to join Google Search Console exports to product events (end-to-end organic measurement):1. Export & store- Pull GSC data via Search Console API into a warehouse (BigQuery/Redshift). Export fields: date, country, device, query, page, clicks, impressions, ctr, position.- In parallel, ingest product analytics/events (GA4, Snowplow, server logs) with event timestamps and page_location / landing_page_path and UTM params into same warehouse.2. Normalize keys- Normalize GSC 'page' to canonical path: strip protocol, host, trailing slashes, default index pages, lowercase, remove URL params that aren’t part of canonical (but keep UTM for session attribution if used). Use site’s canonical mapping if available (sitemaps or CMS).- Normalize product event page_location the same way; parse and remove tracking params, reconstruct path.3. Join strategy & attribution window- Primary join: GSC.page (normalized) = events.landing_page_path AND date = event_date. Because GSC reports on search impressions/clicks by date of search, use click date. For session-level attribution, join GSC click -> analytics session by: - Matching on landing page + date + device + country (optional) to narrow. - If you capture gclid/UTM on landing, match by UTM or clientId (if you pass GSC click id via redirect — often not available).- Use time-windowed joins: consider a click leading to a session within 0–2 days (most immediate) but check behavior; for organic clicks use same-day session >= click_time - small tolerance.4. SQL example (BigQuery-like) — join page-level GSC aggregates to sessions:sql
WITH gsc AS (
SELECT
PARSE_DATE('%Y-%m-%d', date) AS date,
REGEXP_REPLACE(LOWER(REGEXP_REPLACE(page, r'https?://[^/]+', '')), r'\?.*$', '') AS path,
SUM(clicks) AS clicks,
SUM(impressions) AS impressions
FROM `proj.gsc_table`
GROUP BY date, path
),
sessions AS (
SELECT
DATE(event_time) AS date,
REGEXP_REPLACE(LOWER(REGEXP_REPLACE(page_location, r'https?://[^/]+', '')), r'\?.*$', '') AS path,
COUNT(DISTINCT session_id) AS sessions,
SUM(IF(event_name='purchase', value, 0)) AS revenue,
SUM(IF(event_name='conversion',1,0)) AS conversions
FROM `proj.events_table`
GROUP BY date, path
)
SELECT
g.date, g.path, g.impressions, g.clicks,
s.sessions, s.conversions, s.revenue,
SAFE_DIVIDE(s.conversions, s.sessions) AS conv_rate,
SAFE_DIVIDE(g.clicks, g.impressions) AS search_ctr,
SAFE_DIVIDE(s.sessions, g.clicks) AS session_per_click
FROM gsc g
LEFT JOIN sessions s
ON g.date = s.date AND g.path = s.path
ORDER BY g.impressions DESC
5. Caveats & quality controls- GSC aggregates clicks (sampled/rounded in some exports); joins are fuzzy—report confidence intervals and sample rates.- Search Console uses click counts not sessions; some clicks may be blocked (ad blockers), duplicates, or lead to different final URLs (redirects). Use server logs to validate.- Timezone mismatches: align GSC date (UTC) with event timestamps/timezones.- Privacy & sampling: GA/analytics may sample; prefer raw event pipelines (Snowplow, GA4 BigQuery) for accurate joins.- Multi-touch & attribution: decide model (last non-direct click, last organic, data-driven). For organic performance, present both last-click and assisted metrics.Outcome: produce dashboards showing search visibility → landing-page sessions → conversions with confidence annotations, enable drill-down from query → page → user cohort, and surface technical issues (crawl errors) to prioritize content fixes.