Course Schema Markup: How to Get Google Course Rich Results

Last Updated: February 25, 2026 · 10 min read

The Course rich result appears in Google Search as a special listing card showing the course name, provider, and description — giving education platforms and course creators a visually distinct presence in search. Implementing Course schema correctly requires understanding when to use Course alone versus pairing it with CourseInstance.

1. Minimum Viable Course Schema

This is the bare minimum to be eligible for the Course rich result:

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Introduction to Machine Learning",
  "description": "Learn the core concepts of machine learning
    including supervised learning, neural networks, and
    model evaluation. Hands-on Python examples throughout.",
  "provider": {
    "@type": "Organization",
    "name": "DataLearn Academy",
    "sameAs": "https://datalearnacademy.com"
  }
}

2. Full Course + CourseInstance Template

Use CourseInstance when the course has a specific schedule, delivery mode, instructor, or price:

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Introduction to Machine Learning",
  "description": "Learn core ML concepts with hands-on
    Python examples. Covers supervised learning, neural
    networks, and model evaluation.",
  "image": "https://example.com/ml-course.jpg",
  "url": "https://example.com/courses/intro-ml",
  "provider": {
    "@type": "Organization",
    "name": "DataLearn Academy",
    "sameAs": "https://datalearnacademy.com"
  },
  "offers": {
    "@type": "Offer",
    "price": "199",
    "priceCurrency": "USD",
    "category": "Paid",
    "url": "https://example.com/courses/intro-ml/enroll"
  },
  "hasCourseInstance": [
    {
      "@type": "CourseInstance",
      "courseMode": "online",
      "instructor": {
        "@type": "Person",
        "name": "Dr. Sara Patel",
        "description": "ML researcher with 10 years
          of industry experience"
      },
      "startDate": "2026-03-01",
      "endDate": "2026-05-01",
      "courseWorkload": "PT5H",
      "location": "Online"
    },
    {
      "@type": "CourseInstance",
      "courseMode": "blended",
      "instructor": {
        "@type": "Person",
        "name": "Dr. Sara Patel"
      },
      "startDate": "2026-09-01",
      "courseWorkload": "PT10H",
      "location": {
        "@type": "Place",
        "name": "San Francisco Campus",
        "address": {
          "@type": "PostalAddress",
          "addressLocality": "San Francisco",
          "addressRegion": "CA"
        }
      }
    }
  ]
}

3. courseMode Values Explained

ValueMeaningExample
"online"Fully online, asynchronous or synchronousUdemy, Coursera, self-paced courses
"onsite"Physical in-person attendance requiredUniversity classroom, bootcamp
"blended"Mix of online and in-personHybrid university courses
"MOOC"Massive Open Online Course (open enrollment)edX, FutureLearn courses
"synchronous"Live sessions, specific schedule requiredLive webinar-based courses

4. Eligibility Requirements

✅ Required

  • name — the course title
  • description — at least 50 chars
  • provider — the organisation offering the course

⭐ Recommended (richer results)

  • image — course thumbnail
  • offers with price and currency
  • hasCourseInstance with courseMode
  • instructor — Person entity
  • aggregateRating — star ratings

⚠️ Common mistake: Course schema on non-course pages

Google will not show Course rich results for product pages, membership pages, or general educational content pages. The page must be specifically about a structured educational course with a defined curriculum, not just informational blog content about a topic.

5. Course Schema for Specific Platforms

Different course platforms have different schema implementation contexts. Here is what to do on each:

WordPress (LearnDash, Tutor LMS)

These LMS plugins auto-generate basic Course schema but often miss hasCourseInstance and instructor. Use RankMath Pro or a custom WP Schema plugin to extend the output with CourseInstance, price, courseMode, and aggregateRating.

Teachable / Thinkific

These hosted platforms do not let you edit the HTML source directly. Add custom JSON-LD via their 'Custom Code' or header injection fields (available in paid plans). The JSON-LD renders in the <head> of landing pages even without HTML access.

Kajabi

Kajabi allows custom code in site-wide settings and individual page settings. Add Course schema to the product page header code. Kajabi generates its own limited meta tags but does not produce rich JSON-LD.

Custom-built (Next.js, Django, Rails)

Generate Course schema programmatically from your database. Each course record should map to a JSON-LD output function. Validate the output for a representative set of courses before deploying sitewide.

Udemy (for course creators)

Udemy manages its own schema implementation. Individual instructors cannot customise it. Focus on your standalone course website or personal site instead — that's where schema investment returns value.

6. Frequently Asked Questions

Can I add Course schema to a course category or listing page?

No. Course schema belongs only on individual course pages, not on pages that list multiple courses. For category or listing pages, use ItemList schema with each ListItem pointing to the URL of an individual course page.

What if my course is free?

Still include an offers block with price: “0” and priceCurrency: “USD” (or your currency). Explicitly marking a course as free is more informative than omitting offers. Google shows “Free” in the course rich result, which strongly influences CTR for free courses.

Should I use multiple CourseInstance objects for a self-paced course?

Self-paced courses without a fixed schedule only need one CourseInstance with courseMode: “online” or “MOOC”. Omit startDate and endDate. Include courseWorkload with an ISO 8601 duration (e.g. PT20H for 20 hours) to communicate the expected study time.

How do I add multiple instructors to Course schema?

The instructor property accepts an array of Person objects: instructor: [{ @type: “Person”, name: “Dr. A” }, { @type: “Person”, name: “Dr. B” }]. For better E-E-A-T signals, add jobTitle, description, and sameAs (LinkedIn, institutional profile) for each instructor.

Can I add AggregateRating to a course before it launches?

No. AggregateRating must be based on genuine existing reviews. Adding fabricated ratings before launch violates Google’s structured data policies. Only add aggregateRating once you have a minimum of 5–10 real reviews with a rating average that accurately represents student feedback.

What is the difference between Course and CourseInstance?

Course describes the abstract curriculum: name, description, provider, and offer price. CourseInstance describes a specific delivery of that course: a scheduled cohort with a startDate, endDate, courseMode (online/onsite), and instructor. Use Course alone for evergreen self-paced courses; add CourseInstance when you have scheduled runs.

Does Course schema appear on mobile and desktop searches?

Course rich results appear on both mobile and desktop. Unlike HowTo (desktop-only was removed), Course cards are consistently shown across devices in Google Search for queries with clear educational intent (“how to learn Python”, “machine learning course”).

How do I validate that my Course schema is correct?

Paste your Course JSON-LD into SchemaValidator.org to check for missing required properties and structural errors. Then test the live URL in Google’s Rich Results Test to confirm the schema is detected and see a preview of the course card. Check GSC Enhancements 2 weeks after deploying.

Validate Your Course Schema

Check your Course JSON-LD for required properties and rich result eligibility.

Validate Course Schema →