How to combine YouTube Analytics and GA4 data
By the Analistable team · Updated · 6 min read
Export video-level views and watch time from YouTube Studio, and from GA4 export sessions, key events and landing page for traffic whose session source contains youtube. The reliable join key is a UTM tag on each video's description link (utm_content = video ID); without it you can only join by date or landing page. One row per video then shows views, site sessions and conversions.
Part of our guide: How to answer questions across multiple spreadsheets
The problem: two systems, no shared ID
YouTube Studio reports views, watch time and subscribers per video. GA4 reports what happened when people arrived on your site. By default GA4 sees YouTube visits as source youtube.com (or m.youtube.com) with medium referral, without saying which video the click came from. To answer “which videos send buyers?”, you need to put the video identity into the link.
Tag links in video descriptions
Add UTM parameters to every link in descriptions, pinned comments and end screens that point to your site:
https://example.com/pricing?utm_source=youtube&utm_medium=video&utm_campaign=tutorials&utm_content=dQw4w9WgXcQUse the video ID (the part after watch?v= in its URL) as utm_content. It never changes, unlike titles, and it's a column in YouTube Studio exports, so it becomes the join key. GA4 reports utm_content as the Session manual ad content dimension.
Links in descriptions pass through a YouTube redirect, and some in-app browsers don't pass referrer data. UTMs survive this; referrer-based source detection may not, so expect some YouTube visits to show as direct.
What to export
| Source | Report | Columns |
|---|---|---|
| YouTube Studio | Analytics → Advanced mode → Content, exported | Content (video ID), Video title, Views, Watch time (hours), Subscribers |
| GA4 | Exploration filtered to Session source contains youtube | Session manual ad content, Landing page, Sessions, Engaged sessions, Key events, Total revenue |
Use the same date range in both. YouTube Studio data typically lags by a day or two, so leave a gap before the end date. If you already join several GA4 properties, the same approach applies — see combining GA4 properties into one report.
Join on video ID
SELECT y."Video title", y."Views", y."Watch time (hours)",
COALESCE(g.sessions, 0) AS site_sessions,
COALESCE(g.key_events, 0) AS key_events,
g.sessions * 1000.0 / NULLIF(y."Views", 0) AS sessions_per_1k_views
FROM youtube y
LEFT JOIN (
SELECT "Session manual ad content" AS video_id,
SUM("Sessions") AS sessions, SUM("Key events") AS key_events
FROM ga4_youtube
GROUP BY 1
) g ON g.video_id = y."Content"
ORDER BY key_events DESC;Sessions per 1,000 views normalises for reach: a niche video with few views can still be the best traffic driver per viewer.
Worked example: four videos, Q3
| video | views | watch hours | site sessions | key events | sessions per 1k views |
|---|---|---|---|---|---|
| Setup tutorial | 40000 | 3200 | 600 | 30 | 15 |
| Product comparison | 12000 | 900 | 480 | 36 | 40 |
| Behind the scenes | 25000 | 1500 | 50 | 1 | 2 |
| Customer story | 8000 | 640 | 160 | 12 | 20 |
| Total | 85000 | 6240 | 1290 | 79 |
The setup tutorial has the most views, but the product comparison sends 40 sessions per 1,000 views and the most key events (36). Behind-the-scenes content builds the channel but sends almost no one to the site. GA4 also recorded 210 YouTube-referred sessions with no utm_content — untagged links or older videos — so the 1,290 tagged sessions are a floor, not the total.
Without UTM tags
For past videos you can't retro-tag, two weaker joins are possible:
- By landing page: if each video links to a distinct page, join GA4 landing pages to a table mapping page → video.
- By date: compare daily YouTube-referred sessions with each video's publish date. This shows launch spikes but can't separate overlapping videos.
Analistable can pull the GA4 report through its Google Analytics connection and read your YouTube Studio CSV alongside it, then answer “which videos drove key events last quarter?” in the browser. It reads the data and doesn't change your channel or property. More cross-source patterns are in the guide to answering questions across spreadsheets.
Which metrics belong in the joined report
YouTube Studio offers dozens of metrics. For a video-to-site report, a handful is enough, and adding more makes the table harder to read:
| Metric | From | Why |
|---|---|---|
| Views | YouTube Studio | Reach of the video |
| Watch time (hours) | YouTube Studio | Depth of attention |
| Sessions | GA4 | Visits the video sent to the site |
| Engaged sessions | GA4 | Visits that weren't immediate bounces |
| Key events | GA4 | Sign-ups, purchases or leads from those visits |
| Sessions per 1k views | Calculated | Compares videos of different reach |
Engagement rate (engaged sessions ÷ sessions) is worth a look per video. A video that promises something the landing page doesn't deliver shows high sessions and low engagement — a message mismatch rather than a traffic problem.
Keep the publish date as a column too. A video published in the last week of the quarter has had a fraction of the time to earn views and clicks, so compare it with others at the same age or leave it out of the ranking until it has caught up.
Shorts and paid video
Shorts have limited link options compared with long-form videos, so expect far fewer site sessions from them and judge them on channel growth instead. Paid video campaigns run through Google Ads have their own reporting and auto-tagging (gclid), so keep them out of this organic comparison and analyse them with your other ad data, as in merging GA4 with ad cost data.
Make tagging a habit
Add the tagged link to your video upload checklist, built from a template with the video ID filled in once the video is uploaded. Update descriptions of your top ten older videos as well; they often still send most of the traffic.
Once every new video is tagged, the join becomes a monthly routine: export, load, join, and read the sessions-per-1k-views column. Over a few quarters it shows which formats — tutorials, comparisons, case studies — send visitors who convert, which is the question the two tools can't answer on their own.
Checking the join worked
Before reading the results, compare the total of tagged sessions in the joined table with GA4's total for session source containing youtube. The tagged share tells you how much of YouTube traffic the report explains. If it's below half, most traffic is coming from untagged links — older videos, comments, community posts or channel links — and the per-video ranking only covers part of the picture. Also check that every video ID in GA4 matches one in the YouTube export; an unmatched ID usually means a typo in a description link.
Frequently asked questions
- Can I include channel-page and About-page links?
- Yes. Tag them with a fixed utm_content such as channel_about so they appear as their own row instead of being lumped in with untagged traffic.
- Does YouTube strip UTM parameters?
- Description links go through a YouTube redirect, but the destination URL, including its query string, is passed through. Test one link from a logged-out browser and check GA4's real-time report to confirm.
- Should I join on publish month instead of view month?
- Use the date range of views and sessions, not publish date. Older videos keep sending traffic, and a publish-month join hides that long tail.
- Does GA4 have a YouTube integration that does this?
- Not as a per-video join. Linking Google Ads to YouTube helps with paid video campaigns, but organic video-to-site analysis still relies on tagged links.
- Can I use video title instead of video ID?
- You can, but titles change and can contain characters that get encoded differently in URLs. The video ID is stable and appears in both exports.
- Why are YouTube sessions in GA4 higher than clicks in YouTube Studio?
- YouTube's card and end-screen click metrics don't cover description links, and one viewer may visit several times. They measure different things, so don't expect them to match.