- Course is the umbrella entity;
CourseInstanceis one offering of it (a specific session, cohort, or self-paced enrollment). Both are now required for the rich result. - Required on Course:
name,description,provider,hasCourseInstance. Required on CourseInstance:courseModeand eithercourseScheduleorcourseWorkload. - courseMode enum:
Online,Onsite,Blended. Free-text fails validation. - educationalLevel enum:
Beginner,Intermediate,Advanced, or a structured DefinedTerm. Powers the Google course filter. - Course list pages get a separate ItemList with Course refs - that's what unlocks the multi-course carousel above organic results for category queries.
Chapter 1. Before you start
Google's Course rich result and the broader Course Search experience went through significant changes in 2023-2024. The biggest one: CourseInstance became effectively required - a Course record without at least one CourseInstance no longer qualifies for the rich result, even if everything else is filled in. The 2024 update was Google's way of forcing structured-data publishers to disclose practical info (mode, schedule, workload, price) that learners actually need to enroll.
- Confirm the page is the canonical course detail page, not a marketing landing page. Course schema implies a discrete course you can enroll in.
- Pull the provider Organization data - name, URL, sameAs. Course rich results show the provider badge prominently.
- Decide the mode (Online / Onsite / Blended) and educational level (Beginner / Intermediate / Advanced). These are enum values; free text fails.
- Identify enrollment windows or cohorts. Each cohort or rolling enrollment is a separate CourseInstance.
- Capture courseWorkload in ISO 8601 (e.g.
PT40Hfor 40 hours total) - the rich result surfaces this.
Chapter 2. What does Course schema actually do for SEO + AI search?
- Course rich result in the SERP. Provider logo, course name, mode, and the "View course" CTA appear in a dedicated rich result card.
- Course carousel for category queries. For queries like "best machine learning courses", Google shows a horizontally scrollable carousel of Course-schema'd pages above organic results.
- Google Course Search filters. Users can filter by level, mode, and provider; each filter pulls from the corresponding schema field.
- AI engine "course recommendation" answers. Perplexity, ChatGPT, and Gemini cite Course-schema'd pages when answering "how do I learn X" queries with course recommendations.
Chapter 3. The Course + CourseInstance pairing
Course is the conceptual entity - the curriculum, the syllabus, the title. CourseInstance is one specific offering of that course - a single cohort, a self-paced enrollment window, or an instructor-led session.
{
"@context": "https://schema.org",
"@type": "Course",
"@id": "https://www.example.com/courses/intro-to-seo#course",
"name": "Introduction to SEO",
"description": "An 8-week introduction to organic search strategy, technical SEO, and content for SEO.",
"provider": {
"@type": "Organization",
"name": "Capconvert Academy",
"sameAs": "https://www.capconvert.com"
},
"image": "https://www.example.com/courses/intro-to-seo/hero.jpg",
"educationalLevel": "Beginner",
"about": ["SEO", "Content marketing", "Technical SEO"],
"teaches": "How to plan and execute an SEO strategy from scratch",
"totalHistoricalEnrollment": 1240,
"hasCourseInstance": [
{
"@type": "CourseInstance",
"courseMode": "Online",
"courseWorkload": "PT40H",
"instructor": { "@type": "Person", "name": "Jane Doe" },
"startDate": "2026-06-01",
"endDate": "2026-07-27",
"offers": {
"@type": "Offer",
"price": "499",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "CourseInstance",
"courseMode": "Blended",
"courseWorkload": "PT60H",
"location": {
"@type": "Place",
"name": "Capconvert HQ",
"address": { "@type": "PostalAddress", "addressLocality": "Chicago", "addressRegion": "IL" }
},
"startDate": "2026-09-15",
"endDate": "2026-11-10",
"offers": {
"@type": "Offer",
"price": "799",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
]
}
The Course record carries everything that's true regardless of when you take the course. The CourseInstance carries the schedule, the price, and the mode for one specific offering. Self-paced courses still use CourseInstance - just set courseSchedule with repeatFrequency or omit start/end dates and rely on courseMode: "Online" + courseWorkload.
Chapter 4. courseMode and educationalLevel enums
courseMode
| Mode | When to use |
|---|---|
Online | 100% remote, no in-person component |
Onsite | 100% in-person, no online component |
Blended | Mix of in-person and online (hybrid) |
educationalLevel
Either a plain string (Beginner, Intermediate, Advanced) or a DefinedTerm referencing a controlled vocabulary. The plain-string form is sufficient for most rich-result purposes; the DefinedTerm form is needed for academic / accredited programs where the level maps to a formal credential.
"educationalLevel": "Intermediate"
// or
"educationalLevel": {
"@type": "DefinedTerm",
"name": "Undergraduate",
"inDefinedTermSet": "https://example.com/terminology/levels"
}
Chapter 5. Course list pages and the carousel
For a "/courses" or "/curriculum" landing page that lists multiple courses, ship an ItemList with one ListItem per course, referencing each Course's @id.
{
"@context": "https://schema.org",
"@type": "ItemList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"item": { "@id": "https://www.example.com/courses/intro-to-seo#course" }
},
{
"@type": "ListItem",
"position": 2,
"item": { "@id": "https://www.example.com/courses/advanced-content-strategy#course" }
}
]
}
This pattern is what unlocks the multi-course carousel rich result. Each linked Course must have its own valid Course schema on its detail page. The list page's ItemList is the index; the rich result resolves each Course via the @id.
Chapter 6. Where do you place Course schema on the site?
One Course record per course detail page. One ItemList per course list / category page. Don't ship Course on a category page; that's what ItemList is for.
Reference the provider Organization via provider with @id. For multi-instructor courses, list instructors as an array of Person on each CourseInstance (not on Course - instructors typically vary by cohort).
Chapter 7. The breakages we see most often
Ranked by frequency across 24 education and training site audits:
- Course with no
hasCourseInstance. Since 2024, no rich result. 16 of 24. - Free-text
courseMode("Online & Self-Paced") instead of the enum. 12 of 24. - No
educationalLevel, missing the level filter. 9 of 24. - No
offerson CourseInstance, even for paid courses. 7 of 24. - Course schema on a course catalog page instead of ItemList of Course refs. 5 of 24.
- No
courseWorkload, removing the "how long does it take" surface in the rich result. 4 of 24.
We track these on running sites through our Sentry structured-data rule set.
FAQ
Does Course schema work for free courses?
Yes. Set price: "0" on the Offer. Free courses can still earn the rich result; the "Free" badge replaces the price in the SERP.
How do I model a self-paced course with rolling enrollment?
Use a single CourseInstance with courseMode: "Online", courseWorkload: "PT20H", and omit startDate/endDate. Optionally include courseSchedule with repeatFrequency if there's a recurring start cadence.
Should I include syllabus / curriculum details in the schema?
Use about for high-level topics and teaches for outcomes. The full syllabus belongs on the page body; don't bloat the schema with hundreds of lines of curriculum.
Can I include reviews on Course?
Yes. Course is on Google's review-eligible itemReviewed list. Ship AggregateRating and sample Reviews on the Course (not on each CourseInstance) - ratings represent the curriculum, not the specific cohort.
What's the difference between Course and EducationalOccupationalCredential?
Course is the educational experience itself. EducationalOccupationalCredential is the certificate or degree awarded for completing it. Link them via educationalCredentialAwarded on the Course.
Should I use Course for a single article-length tutorial?
No. Use Article. Course implies a structured curriculum with multiple sessions or modules. A single tutorial article is just an Article with HowTo content.
References
- Schema.org. "Course." schema.org/Course
- Schema.org. "CourseInstance." schema.org/CourseInstance
- Google Search Central. "Course info (Course) structured data." developers.google.com/search/docs/appearance/structured-data/course-info
- Google Search Central. "Course list (Carousel) structured data." developers.google.com/search/docs/appearance/structured-data/carousel
- Schema.org. "EducationalOccupationalCredential." schema.org/EducationalOccupationalCredential
- Schema.org. "Schema Markup Validator." validator.schema.org