Video SEO for Websites: Schema, Placement and Page Speed
Table of Contents
A video can play perfectly on your website and still be invisible to Google. The player loads, visitors watch it, and Search Console reports no indexed video on the page at all. That gap between “the video works” and “Google knows the video is there” is what video SEO for websites deals with, and closing it comes down to markup, placement and load performance rather than anything about the video itself.
Three points worth holding onto before the detail. Google requires exactly three properties before it will consider a video on your page for video results, and automated plugins routinely get one of them wrong. Where the video sits on a page affects both indexing eligibility and whether anyone watches it. And a single standard embed can add more than a megabyte to a page, which usually costs more in rankings than the video gains.
Scope: On-Site Video and YouTube Are Two Different Jobs
Video SEO splits cleanly into two problems with almost no shared mechanics, and treating them as one is why most business video work underperforms. Ranking a video on YouTube is a platform problem, governed by watch time, click-through rate and viewer satisfaction. Getting a video surfaced in Google from a page on your own domain is a technical problem, governed by structured data, crawlability and page performance.
This guide covers the second half only. For keyword research on the platform, titles, thumbnails, retention and channel authority, YouTube SEO handles that side in full. Nothing below depends on how your channel is performing.
| Question | Where it belongs |
|---|---|
| Which keywords should the video target on the platform? | YouTube SEO |
| Why does Search Console say my video is not indexed? | This guide |
| How do I write a description that earns clicks? | YouTube SEO |
| Which schema properties does Google actually require? | This guide |
| Should the video sit above or below the fold? | This guide |
| How do I improve average view duration? | YouTube SEO |
A useful way to hold the split: YouTube SEO is about the video, while video SEO for websites is about the page the video lives on.
VideoObject Schema: The Three Properties Google Requires
Start here, because without valid markup the rest is academic. Google’s documentation lists three required properties for VideoObject, and a page missing any of them may yield no extractable video information at all.
The three required properties are name (the video title, which must be unique across every video on your site), thumbnailUrl (a URL pointing to the video’s own thumbnail file, reachable by Googlebot), and uploadDate (the date the video was first published, in ISO 8601 format, with timezone information supplied rather than left to default).
Everything else is recommended rather than required, but two recommended properties matter more than their status suggests. Google states a clear preference for contentUrl over embedUrl, because contentUrl points at the actual video file bytes and is the most effective route for Google to fetch your content. Supply embedUrl only where contentUrl is not available. The other is description, which, like name, must be unique per video across the site.
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "How WooCommerce VAT Settings Work for UK Sellers",
"description": "A walkthrough of VAT rate configuration in WooCommerce for businesses selling into the UK and Ireland.",
"thumbnailUrl": "https://example.com/thumbs/woocommerce-vat-16x9.jpg",
"uploadDate": "2026-03-14T09:00:00+00:00",
"duration": "PT6M42S",
"contentUrl": "https://example.com/video/woocommerce-vat.mp4",
"embedUrl": "https://example.com/embed/woocommerce-vat"
}
Where Plugin-Generated Markup Fails
Automated schema output tends to break in three predictable places. uploadDate gets populated with the page publication date instead of the video’s own first publication date, which drifts further from the truth every time the post is refreshed. thumbnailUrl gets pointed at a resized or CDN-cached derivative that Googlebot cannot reach cleanly. And name gets inherited from the page title, which produces duplicate values the moment two pages carry different videos under similar headings.
Run every template through the Rich Results Test before assuming the plugin has it right, then use URL Inspection on a live page to confirm what Google actually sees. If the fix needs to happen at template level rather than per page, that is a job for whoever handles your website development, since correcting it once in the template beats correcting it 40 times by hand.
One Video, One Page
Google’s guidance on Clip and SeekToAction markup states plainly that VideoObject structured data must be added to a page where users can watch the video. Pointing searchers at a page where the video is not present is treated as a poor experience.
The practical consequence for a business site: do not mark up the same video on several pages. Pick the page where that video is the main event, mark it up there, and embed it elsewhere without the markup if you want it in more than one place.
Where the Video Sits on the Page
Placement decisions get made on aesthetics and then quietly cost you both rankings and conversions. Two separate considerations pull in slightly different directions, and it helps to keep them apart.
The indexing consideration is relevance. Google’s video sitemap requirements say not to list videos unrelated to the content of the host page, giving the example of a video that is a small addendum to the page or unconnected to the main text. A video dropped into a page because the layout needed something visual is exactly that case. If the video is not substantially about what the page is about, it does not belong there, and marking it up will not help.
The conversion consideration is position. A video placed above the fold on a service page competes with the value proposition and the primary call to action for attention. A video placed after the problem has been stated, where a visitor has read enough to want a demonstration, tends to earn a genuine play rather than an autoplay impression. Positioning it directly after the section it illustrates works better than positioning it in the hero.
“Businesses put the video in the hero because that is where it looks impressive,” says Ciaran Connolly, founder of ProfileTree. “Put it after the paragraph that explains the problem it solves and the play rate goes up, because by then the visitor actually wants to see it.”
There is a structural point too. Surround the embed with text that covers the same ground the video covers. Google reads the page, not the footage, and a video sitting in a block of whitespace gives the crawler nothing to connect it to. Teams producing content through video marketing services get this handled at the brief stage, because the page copy and the script are written from the same outline.
Transcripts and Captions Are Indexable Content
A full transcript published on the page is the single largest gain available on most video pages, and it is the step teams skip most often.
The reasoning is mechanical. A six-minute video contains roughly 900 spoken words. Published as page text, those 900 words are crawlable, extractable and available for AI systems to quote. Left inside the video file, they are not. A page carrying a 300-word introduction and an embed has 300 words of ranking surface. The same page with the transcript published below the video has 1,200.
Captions and transcripts do different jobs and you want both. Captions are the timed text track attached to the video, serving viewers watching without sound and meeting accessibility expectations under UK guidance. Transcripts are the flat text on the page, serving crawlers and readers who would rather skim than watch.
Auto-generated captions are a starting point, not a finish. Accuracy drops sharply on technical terminology, company names, product names and Northern Irish and Irish accents, and a transcript full of mistranscribed industry terms is worse than no transcript because it puts the wrong keywords on the page. Correct the machine output rather than publishing it raw.
Two formatting points make the difference between a transcript that works and one that hurts. Break it into headed sections matching the video’s own chapters, rather than posting a single undifferentiated wall of text. And clean out the verbal filler, because published speech reads badly and repeated false starts add nothing to what Google can extract.
Video Sitemaps: The Rule Most Guides Get Wrong
The common advice is that video sitemaps are only needed for self-hosted video, and that YouTube embeds are covered automatically. Google’s own documentation does not say that.
The video sitemap specification includes worked examples for both YouTube and Vimeo embeds, where the <video:player_loc> tag carries the platform embed URL. For platforms that allow embedding through iframes, Google states that player_loc is the value used in place of content_loc. A video sitemap is a valid and documented way to tell Google about embedded third-party video on your pages, not a self-hosting workaround.
Google recommends video sitemaps and also supports mRSS feeds as an alternative. Either can live in a separate file or be added as tags inside an existing sitemap.
| Required tag | What it holds |
|---|---|
<video:video> | Parent element for one video on the page |
<video:thumbnail_loc> | URL of the thumbnail image file |
<video:title> | Video title, matching the title shown on the page |
<video:description> | Description up to 2,048 characters, matching the page |
<video:content_loc> or <video:player_loc> | The media file, or the player URL. One of the two is required, and Google prefers the first |
Optional tags worth adding are <video:duration> in seconds, valid from 1 to 28,800, and <video:publication_date>. Skip <video:expiration_date> unless the video genuinely expires, because Google stops showing the video after that date. Several tags were retired in 2022, including <video:category>, <video:gallery_loc>, <video:price> and the autoplay and allow_embed attributes on <video:player_loc>, so an older sitemap generator may still be emitting markup Google no longer reads.
Every URL referenced has to be reachable by Googlebot: not disallowed in robots.txt, not behind a login, not blocked by a firewall, and served over HTTP or FTP rather than a streaming protocol.
Hosting Choices and What Each One Costs You
Where the file lives changes what you can control and what you pay for in load time. The trade-offs are real in both directions, and the answer depends on whether the video’s job is reach or on-site conversion.
| Hosting route | Indexing control | Analytics | Page weight | Suits |
|---|---|---|---|---|
| YouTube embed | Metadata partly set on the platform; page markup can override | Views credited to the channel, not your site | Heaviest without a fix | Reach plus a site presence |
| Vimeo embed | Clean embed, straightforward markup | Basic engagement data | Moderate | Brand-led pages where the player should not carry platform branding |
| Dedicated player (Wistia and similar) | Full control of markup and player | Engagement data into your own analytics | Moderate, CDN-served | Lead-generation pages where viewing data drives follow-up |
| Self-hosted file | Full control, video sitemap advisable | Whatever you build | Heaviest without a CDN | Rarely the right answer without CDN delivery |
The pattern that works for most SMEs doing video SEO for websites: keep the video on YouTube for platform reach, embed it on your site with correct VideoObject markup so the page is eligible in its own right, and reach for a dedicated player only where the viewing data genuinely changes what your sales process does next. Self-hosting a large file directly from your own server without CDN delivery reliably damages Largest Contentful Paint and is difficult to justify.
The Page Speed Cost of Heavy Embeds, and the Fix
This is where on-site video most often does net harm. Google’s own web.dev guidance notes that many popular third-party embeds ship over 100 KB of JavaScript, and sometimes as much as 2 MB, which delays your first-party content and occupies the main thread while it executes. Standard video embeds sit at the heavy end of that range, and the weight does not get shared between embeds. Three videos on a page load three sets of resources.
The instinctive fix is loading="lazy" on the iframe, and for many embed types browser-level lazy loading genuinely helps below-fold content. For video players specifically it under-delivers, because the embed’s own script tends to pull its resources in regardless. Testing a page with a lazily loaded video player often shows barely any improvement over the eager version.
The reliable fix is the facade pattern. Instead of loading the player on page load, the page renders a static element that looks like the player: the thumbnail, a play button, the correct dimensions. Nothing from the third party loads. When the visitor hovers, the page preconnects; when they click, the facade replaces itself with the real player. Visitors who never press play never download the payload, which is most of them on most pages.
Open-source components exist for the common platforms, lite-youtube-embed and lite-vimeo-embed among them, so this rarely needs building from scratch. Lighthouse also runs a dedicated audit for it, flagging third-party embeds that could be deferred behind a facade, which makes it straightforward to check whether any page on your site is currently failing.
One detail that catches people out: reserve the space. Give the facade explicit width and height attributes plus CSS sizing, or you trade a Largest Contentful Paint problem for a Cumulative Layout Shift problem when the real player swaps in.
Checking Whether Any of It Worked
Search Console’s video indexing report is the instrument for this, and it is one of the least-opened reports in the tool. It lists pages where Google found video, distinguishes those it indexed from those it could not, and states the reason for each failure.
The failure reasons map directly onto the work above. “No video found” usually means the embed was not crawlable or the markup was absent. Missing thumbnail and missing duration point straight at incomplete properties. Video not accessible points at a robots.txt rule or a login wall. Read the report before producing anything new, because fixing markup on video you already have is faster and cheaper than adding more video that fails the same way.
Allow time after deployment. Google notes it can take several days to find and crawl a page, and video indexing follows crawling rather than publication.
Where to Start
Open the video indexing report and see what Google currently thinks about the video already on your site. That single check tends to reorder priorities, because most sites discover that video they assumed was working is not indexed at all.
From there the sequence is straightforward: fix the three required properties at template level rather than page by page, publish transcripts on the pages where video carries real weight, put a facade in front of any embed that is not the immediate reason someone landed on the page, and confirm your sitemap generator is not still emitting tags Google retired years ago. Google’s video structured data documentation is the reference to keep open while you work, since the required properties and guidelines do change.
None of it requires new footage. Video SEO for websites is mostly a matter of making the video you already have legible to a crawler that cannot watch it.
FAQs
The questions below come up most often once a team starts checking their own video pages.
Do I need VideoObject schema if the video is hosted on YouTube?
Yes, if you want the page on your own domain to be eligible for video results. Google can sometimes infer details from an embed, but the markup is what lets you control the title, description, thumbnail and upload date that Google reads, rather than leaving it to inference. Add the three required properties on the page where the video is the main content, and supply embedUrl where you cannot supply contentUrl.
Will embedding video slow my site enough to hurt rankings?
An unmitigated standard embed can, particularly on mobile and particularly where several sit on one page, because the resources are not shared between embeds. A facade removes most of that cost by deferring the third-party payload until someone actually presses play. For video SEO for websites the practical position is that embedded video is worth having and worth deferring, rather than avoided.
Is a transcript necessary if I already have captions?
They serve different purposes and the transcript is the one that adds ranking surface. Captions are the timed track inside the player, serving viewers and accessibility requirements. A transcript published as page text is crawlable content in a way that a caption file attached to a third-party player is not. For any substantial guide, tutorial or interview, publish both.
Should I put the same video on several pages?
Embed it wherever it genuinely helps, but mark it up on one page only. Google’s guidance is that VideoObject markup belongs on a page where the visitor can watch the video, and duplicating markup across pages gives conflicting signals about which page the video belongs to. Choose the page where the video is the main content for the markup.
Do YouTube embeds need to appear in a video sitemap?
They can, and Google’s documentation includes a worked example showing exactly how, with the YouTube embed URL supplied in <video:player_loc>. The widespread claim that sitemaps only apply to self-hosted video is not what the specification says. Whether it is worth the effort depends on how much video you have; for a handful of pages, correct VideoObject markup does most of the work.
How long before an indexed video shows up in Google results?
Indexing follows crawling, and Google notes that it can take several days after publishing for a page to be found and crawled. Appearing in results is a separate question from being indexed, and depends on the page competing for the query in the normal way. Check the video indexing report for indexing status rather than watching the SERP.