·

Somewhere in your theme editor is a setting that makes your product video load faster. It’s also the setting that made Google stop seeing it. The video plays instantly for a shopper. But it simply doesn’t exist for a crawler until someone clicks play, and a crawler never does. This is a Shopify product video SEO problem, and the fix has nothing to do with re-uploading anything.

By Florencia
August 26, 2026
8 min read

Two guides on this blog already cover schema. Our Shopify structured data guide walks through the Product, FAQPage, Organization, WebSite and BreadcrumbList schemas your theme is probably missing. Our product schema guide is a deep-dive on the one that gets star ratings showing in search. Neither one mentions video, on purpose. Instead, VideoObject is a different schema, solving a different problem, and it deserves its own walkthrough. If you’ve never touched schema at all, start with the structured data guide first. Maybe your product and review markup is already sorted. If the video on the same page never shows up anywhere, this is the one.

Plug In SEO adds your core schema set automatically — Product, FAQPage, Organization, BreadcrumbList. VideoObject for embedded product video isn’t part of that set yet. That’s exactly why this post exists: a short block of JSON-LD you add once per video.

Try Plug In SEO →

Why your product video is invisible to Google right now

The bottom line: the fastest-loading way to embed a product video is also the way that keeps a crawler from ever seeing it. It’s the pattern Google itself recommends for speed.

Two ways Shopify handles product video

Shopify gives you two ways to attach video to a product. A hosted video — one you upload directly — renders as a native <video> element with multiple source files. A browser and a crawler can both read that directly. However, an external video, like a YouTube or Vimeo link, is a different media type. Shopify’s own theme filters render it inside an <iframe>, and that’s where the trouble starts.

A bare YouTube iframe is heavy. It can pull in close to 500KB of third-party JavaScript before a shopper has done anything. The standard fix is a “facade”: show a thumbnail image with a play button, then inject the real iframe only once someone clicks it. It’s Google’s own web.dev team’s recommendation for exactly this problem. Core Web Vitals improve and the page feels instant. Most theme developers who’ve fixed a slow video block have landed on this pattern.

Why the facade hides it from Google

Here’s the part that doesn’t get said next to that advice. Google’s crawler doesn’t click anything. Its own documentation is direct about it: “Google Search does not interact with your page.” Any lazy-loading approach that depends on a click or a scroll won’t reveal its content to Google. A facade that only injects its iframe on click is, by definition, click-dependent. The thumbnail image is all a crawler ever sees. As a result, the video itself never appears in the page Googlebot renders.

So the same optimization that makes your product page faster for a shopper makes your product video functionally absent for search. That’s not a bug in the facade pattern. It’s a gap the pattern never closes — speed and discoverability are two different jobs.

What Shopify’s automatic schema already covers — and doesn’t

The bottom line: the JSON-LD your theme emits automatically for a product has no video property in it at all, whether the video is hosted or embedded.

Modern Shopify themes emit Product structured data automatically through a built-in Liquid filter. Its documented output covers name, description, image, brand, category, offers, and a handful of other fields that describe the product itself. There is no video property anywhere in that output. It doesn’t matter whether the video on the page is a native upload or an embedded facade. The automatic markup never describes it.

That’s not a Shopify oversight so much as a boundary. Product schema tells search engines about the product. VideoObject schema is a separate schema type. It tells search engines about the video: its title, its length, when it was published, and where the content lives. Nothing generates that for you by default. If a product page has video and you want it discoverable, You have to add VideoObject on purpose.

The VideoObject schema Google actually asks for

The bottom line: Google requires exactly three properties for VideoObject eligibility. Everything else is there to make the result better, not to make it exist.

Per Google’s current VideoObject documentation, three properties are required:

  • name — the video’s title. Use unique text for every video on the site, not a repeated generic label.
  • thumbnailUrl — A URL pointing to the video’s own thumbnail image file.
  • uploadDate — When the video was first published, in ISO 8601 format.

Beyond that, Google “strongly” recommends one of two properties to actually locate the video content. contentUrl should point to the video file’s actual bytes, and Google describes it as “the most effective way” to fetch your video. embedUrl is the fallback: a URL pointing to a player for that specific video. That’s the one you’ll use for a YouTube or Vimeo embed, since you don’t control the raw file. Two more properties round it out: description and duration.

This is the part that actually solves the facade problem. VideoObject doesn’t need Google to click your play button. The schema states outright, in text a crawler reads directly, that there’s a video, what it’s called, and where to find it. That’s true whether or not the visible iframe ever loads on that particular crawl.

A hosted (Shopify-uploaded) product video

For a video you uploaded directly, point contentUrl at the actual video file:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How the Aria Ceramic Planter Holds Water",
  "description": "A 45-second look at the self-watering reservoir on the Aria ceramic planter.",
  "thumbnailUrl": "https://cdn.shopify.com/.../planter-video-thumb.jpg",
  "uploadDate": "2026-06-02",
  "duration": "PT45S",
  "contentUrl": "https://cdn.shopify.com/.../planter-demo.mp4"
}
</script>

An embedded YouTube or Vimeo product video

For an external video, you don’t have the raw file — use embedUrl instead, pointing at the player:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How the Aria Ceramic Planter Holds Water",
  "description": "A 45-second look at the self-watering reservoir on the Aria ceramic planter.",
  "thumbnailUrl": "https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg",
  "uploadDate": "2026-06-02",
  "duration": "PT45S",
  "embedUrl": "https://www.youtube.com/embed/VIDEO_ID"
}
</script>

Either block goes in a <script> tag on the product page template, the same place a theme developer would add any custom JSON-LD. Keep the facade for speed. Add the schema next to it for visibility. The two aren’t in conflict. They were just never built to cover for each other.

Why this is worth doing beyond a video rich result

The bottom line: video is already the single most-cited source type in AI-generated answers. That makes this less of a niche technical fix than it looks.

Video already dominates AI citations

A video rich result in classic Google search is a real but modest win: a thumbnail and a play icon next to your listing. The bigger reason to close this gap now is what’s happening in AI-generated answers. Ahrefs analyzed citations across Google AI Overviews. YouTube came out as the single most-cited domain of any kind, at 21.1% of all citations, ahead of Reddit at 18.5% and Facebook at 10.7%.

YouTube is the most-cited domain in Google AI Overviews at 21.1% of all citations, ahead of Reddit (18.5%) and Facebook (10.7%).
Ahrefs, “The 50 Most-Cited Websites in Google AI Overviews,” updated July 2026

What that means for your schema, honestly

Read that carefully. It’s a citation-share number, not a promise that VideoObject schema gets you cited at that rate. What it establishes is simpler: AI answer engines already lean hard on video as a source type. A product page whose video has a name, a description, a runtime and a location in machine-readable text gives an AI system a clean answer to pull from. A product page whose video only exists behind a click isn’t in the running either way.

VideoObject structured data requires just three properties — name, thumbnailUrl, and uploadDate — to be eligible at all. contentUrl or embedUrl is what actually lets Google locate the video.
Google Search Central, “Video (VideoObject) structured data,” updated February 2026
Before
  • Product video hidden behind a click-to-load facade for speed.
  • No VideoObject markup anywhere on the page.
  • Automatic Shopify Product schema present, but silent on video.
  • Video invisible to Google Images, video results, and AI answers alike.
After
  • Facade pattern kept — page speed unaffected.
  • VideoObject JSON-LD added once per product video.
  • name, thumbnailUrl, uploadDate present; contentUrl or embedUrl points crawlers to the video.
  • Video eligible for video rich results and readable by AI answer engines regardless of the click.

Where to actually put this on a Shopify store

The bottom line: this is a template edit, not a per-order chore. Add it once to your product page template and it applies to every product with video.

If your theme developer is comfortable editing Liquid, the cleanest approach is a small snippet in the product template. It checks whether the current product has video media, then outputs the VideoObject block. The values — thumbnail, title, upload date — get pulled straight from that video. That way it’s automatic per product, not something you paste in one at a time. If you’re not touching theme code yourself, this is a short, well-scoped task to hand to a developer: one snippet, one template file, done once.

Either way, validate it before you move on. Google’s Rich Results Test will tell you immediately whether the VideoObject markup on a given URL is valid and eligible. It flags a missing required property before Google’s own crawl does.

Frequently asked questions

Does Shopify automatically add video schema to product pages?

No. Shopify’s built-in structured data filter automatically outputs Product JSON-LD on modern themes, covering fields like name, description, image, brand and offers. There’s no video property in it. That’s true whether the video is a native Shopify-hosted upload or an embedded YouTube or Vimeo player. You add VideoObject schema separately.

Why doesn’t my product video show up in Google Search results?

Usually because it’s embedded behind a click-to-load facade: a thumbnail with a play button where the real video iframe only loads after a click. That’s a genuinely good speed optimization, and it’s what Google’s own web.dev team recommends for third-party embeds. However, the catch is that Google’s crawler doesn’t click anything. Google Search Central states it plainly: “Google Search does not interact with your page.” So it never sees the video that loads after the click. VideoObject schema describes the video in text the crawler reads directly, without needing the click to happen.

What’s the difference between contentUrl and embedUrl in VideoObject schema?

contentUrl points to the actual video file bytes and is Google’s preferred property. Use it for a Shopify-hosted video where you have a direct file URL. embedUrl points to a player rather than a raw file. Use that one for an embedded YouTube or Vimeo video, since you don’t control the underlying file. Google accepts either; you only need one, whichever matches how the video is actually hosted.

Do I need a video sitemap for Shopify product videos?

Not for this. Instead, a video sitemap is a separate, older mechanism for surfacing video URLs to Google, and it’s not something most Shopify stores need to maintain by hand. VideoObject JSON-LD on the product page itself is the current, directly supported way to describe a video to Google. Get that right first.

Will adding VideoObject schema slow down my Shopify store?

No. A JSON-LD block is a small amount of text in a script tag. It doesn’t load any additional media, run any additional JavaScript library, or touch how the video itself renders. You can keep the click-to-load facade exactly as it is for speed and add the schema alongside it. In fact, the two solve different problems and don’t compete for the same page-load budget.

Can AI engines like ChatGPT or Perplexity cite my product videos?

They can only cite what they can read. Ahrefs found YouTube is the single most-cited domain in Google AI Overviews, at 21.1% of all citations. That’s a sign AI answer engines already lean on video as a source type. A product video with clean VideoObject markup gives an AI system a title, a description and a location to work from. One that only exists behind an unclicked play button gives it nothing, regardless of how good the video actually is.

How is this different from the structured data and product schema guides?

Those two guides cover the schemas your theme is likely missing for the product and page itself: ratings, FAQs, breadcrumbs, brand information. This one is specific to a single schema type, VideoObject, and a single failure mode: a video embedded behind a click-to-load pattern that a crawler never triggers. Read the structured data guide first if you haven’t touched schema at all. Come back here once your product pages have video that isn’t showing up anywhere.

Let Plug In SEO handle the rest of your schema

Plug In SEO adds Product, FAQPage, Organization and BreadcrumbList schema to your store automatically, and flags what’s still missing on every page. VideoObject for embedded video is a manual add today — the snippet above takes care of it. Everything else, Plug In SEO can do for you.

Try Plug In SEO →