Meet Cortex AI Powered, Expertise Refined Decision EngineYour AI Optimization Engine
Schema

How to Create Course Schema for Education Sites in 2026

Seven chapters covering required Course properties, the Course + CourseInstance pairing (mandatory since 2024), courseMode and educationalLevel enums, offers, course list pages, and the breakages we see most often.

Jacque Bichara
Jacque Bichara
Founder & Lead Strategist, Capconvert
May 20, 2026Updated May 20, 202611 min read Reviewed by {{REVIEWER_NAME}}, {{REVIEWER_CREDENTIAL}} on May 20, 2026
Who this is for Online learning platforms, universities, bootcamps, and corporate training publishers who want eligibility for Google's course rich result, course carousel, and the EducationalOccupationalCredential surface.
TL;DR
  • Course is the umbrella entity; CourseInstance is 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: courseMode and either courseSchedule or courseWorkload.
  • 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. PT40H for 40 hours total) - the rich result surfaces this.

Chapter 2. What does Course schema actually do for SEO + AI search?

  1. Course rich result in the SERP. Provider logo, course name, mode, and the "View course" CTA appear in a dedicated rich result card.
  2. 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.
  3. Google Course Search filters. Users can filter by level, mode, and provider; each filter pulls from the corresponding schema field.
  4. 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

ModeWhen to use
Online100% remote, no in-person component
Onsite100% in-person, no online component
BlendedMix 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 offers on 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

  1. Schema.org. "Course." schema.org/Course
  2. Schema.org. "CourseInstance." schema.org/CourseInstance
  3. Google Search Central. "Course info (Course) structured data." developers.google.com/search/docs/appearance/structured-data/course-info
  4. Google Search Central. "Course list (Carousel) structured data." developers.google.com/search/docs/appearance/structured-data/carousel
  5. Schema.org. "EducationalOccupationalCredential." schema.org/EducationalOccupationalCredential
  6. Schema.org. "Schema Markup Validator." validator.schema.org