
Element Code: RI-017
What this check actually flags
This check fires when pages that clearly sell or deliver courses, a training catalog, a bootcamp landing page, an academy section, carry no Course structured data. The page tells humans "this is a course you can take" while telling machines nothing at all. For education queries, where the results are stuffed with Coursera, Udemy, edX and every university on earth, giving Google zero structured signal about your courses is leaving one of the few free differentiators on the table.
The 2025 plot twist you need to know about
Course markup has a messy recent history, and half the advice online is now stale. In November 2023 Google launched a detailed "course info" rich result on the Search Central blog, built on Course plus CourseInstance with pricing, workload and delivery mode. Then in 2025 Google deprecated that course info rich result and pulled it from Search Console reporting and the Rich Results Test, per the Search Central documentation changelog. It lasted about a year and a half. Welcome to building on someone else's platform.
What survived is the older course list format: a carousel sourced from an ItemList of Course entries. That is where the visible reward sits today. Course and CourseInstance remain perfectly valid schema.org vocabulary, and keeping accurate markup on detail pages costs nothing and stays readable by anything that parses structured data, but do not promise your boss a Google rich result from a single course page in 2026, because that unit no longer exists.
What the course list format requires
The mechanics are simple and the details are where implementations fail. You wrap your courses in an ItemList, give every ListItem a position and a URL, and describe each course with the Course type. Google's documentation calls for at least three courses, which can live on one all-in-one page or point out to separate detail pages. Course names must be clean: no prices, no "50% off", no promotional copy welded onto the title. I have watched a carousel fail review for exactly that.
| Property | Level | Status | Notes |
|---|---|---|---|
itemListElement | ItemList | Required | The array of ListItem entries, at least three of them |
position | ListItem | Required | 1, 2, 3 and so on, matching on-page order |
url | ListItem | Required | Canonical URL of the course page |
name | Course | Required | The course title, free of promo text and pricing |
description | Course | Required | A short plain-language summary of what the course teaches |
provider | Course | Recommended | Organization offering the course; cheap credibility, always include it |
Why it matters for an education site
Education SERPs are aggregator territory. The carousel is one of the few placements where a smaller academy can sit in the same visual unit as the giants, because it is assembled from markup, not from domain authority alone. Beyond the carousel, clean Course entities help anything that consumes structured data understand your catalog, which increasingly includes AI systems summarizing "best courses for X" style queries.
There is also a compliance angle. Google's guidelines are blunt: the markup is for actual instructional courses. A blog post titled "Crash course in sourdough" is not a Course, and marking up non-courses to chase the carousel is the sort of thing that earns a spammy structured markup manual action, which then takes every rich result on the domain down with it. Not worth it.
How to detect the gap
- Rich Results Test: run your catalog page through it and check whether course items are detected at all, and whether required fields error out.
- Search Console: if course markup exists sitewide you will see it under Enhancements; a report that exists but shows invalid items means a template bug, while no report at all usually means no markup.
- Screaming Frog: crawl with JSON-LD extraction and Google validation enabled, then filter the Structured Data tab to your course URL pattern. Ten seconds to see which templates output Course and which output nothing.
- View source: search for application/ld+json on one catalog page and one detail page. LMS plugins claim course schema support and then emit a bare WebPage more often than you would think.
How to fix it, step by step
- Pick the page that lists at least three courses. That is your carousel candidate; a page with two courses does not qualify.
- Build the ItemList with a ListItem per course, positions matching the visible order, URLs pointing at the canonical detail pages.
- Populate name and description for each Course from your CMS fields, and add the provider Organization.
- Keep or add Course and CourseInstance markup on detail pages if the data is accurate: delivery mode, workload, pricing. No Google rich result, but no harm and some machine-readability upside.
- Validate in the Rich Results Test, deploy, request indexing, and watch Search Console.
{
"@context": "https://schema.org",
"@type": "ItemList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "item": {
"@type": "Course",
"url": "https://example.com/courses/technical-seo",
"name": "Technical SEO Fundamentals",
"description": "Crawling, rendering and indexing explained with hands-on labs.",
"provider": {"@type": "Organization", "name": "Example Academy"}}},
{"@type": "ListItem", "position": 2, "item": {
"@type": "Course",
"url": "https://example.com/courses/log-analysis",
"name": "Log File Analysis for SEO",
"description": "Read server logs to see what crawlers actually do on your site.",
"provider": {"@type": "Organization", "name": "Example Academy"}}},
{"@type": "ListItem", "position": 3, "item": {
"@type": "Course",
"url": "https://example.com/courses/structured-data",
"name": "Structured Data in Practice",
"description": "Ship valid schema markup that earns rich results.",
"provider": {"@type": "Organization", "name": "Example Academy"}}}
]
}What good looks like
Catalog pages emit a valid ItemList that mirrors the visible course grid exactly, detail pages carry accurate Course entities, Search Console shows zero invalid items, and the markup updates automatically when courses are added or retired. The carousel itself remains at Google's discretion, like every rich result, but valid markup on real courses is the entire entry fee.
- Reserve Course markup for genuine instructional courses
- Mark up at least three courses in one ItemList for the carousel
- Keep course names clean: no prices, no promo text
- Generate the markup from CMS data so it stays in sync
- Include the provider Organization on every course
- Don't mark up blog posts, webinars or how-to guides as courses
- Don't stuff "limited offer" or pricing into course names
- Don't let markup drift from what the page actually shows
- Don't build a strategy around the retired course info rich result
- Don't fabricate ratings inside course markup to force stars
FAQ
Is my tutorial series or webinar a course?
Did Google kill course schema in 2025?
I only have two courses. Can I still get the carousel?
Can courses get star ratings in search?
Should I rip out my CourseInstance markup now?
Not sure which rich results your site should be chasing?
Half of schema advice online references features that no longer exist. My advanced SEO audit maps your templates against what Google actually rewards right now, and hands you the implementation order.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







