My Tool Studio
Schema Markup·4 min read

Course Schema for Education Sites: A Practical Guide

Education sites compete on crowded results pages, and structured data is how a course page tells Google what the class is, who runs it and how students attend. Google retired its Course info rich result in 2025, but the Course list feature, which shows several courses from one provider, still reads Course markup. This guide walks through the Course and CourseInstance split, what the course list needs, price and workload fields, a worked example, and the mistakes that keep training pages from being understood.

{"@type": "Course","name": "…","url": "…"}RICH RESULTCourse

What Course markup still earns you

The scenario that sends people here.

Picture a training company launching a new certification program. The page is written, the enrollment form works, and organic traffic is the growth plan. Without markup, Google sees a page about a course. With markup, Google sees a Course with a named provider, a delivery mode, a workload and a price category.

Be clear about what that buys. The Course info rich result is gone. What remains is the Course list, a carousel-style set of courses from one provider, built from Course markup on each course page plus an ItemList on a page that names them. For a provider with at least three courses, that is still worth doing, and the markup describes the offer clearly to any other system that reads structured data.

Course vs CourseInstance: two layers doing different jobs

The distinction that confuses everyone once.

Course is the catalog entry: name, description, provider, course code and credits. CourseInstance is one concrete run of that course, carried in the hasCourseInstance property, and it's where courseMode, location and workload live. The same Course can have an online instance in spring and an in-person instance in fall, each with its own details.

The split exists because a class and its delivery are different facts. Markup that puts courseMode directly on the Course, skipping the instance layer, is a common structural error in education markup, and it's why the Course Schema Generator builds the nesting for you based on the Course mode you pick: Online, Offline or Blended (both).

Price, workload and language fields

What the form writes for you.

The Price type dropdown offers Free, Paid (one-time price), Subscription and Partially free. Free writes an Offer with category Free and price 0; Paid and Subscription add the price and currency you enter; Partially free suits a course with a free tier and paid extras. Leave it on No price info and no Offer is written.

Total workload is entered in hours and converted to an ISO 8601 duration on the CourseInstance, so 12 becomes PT12H and 12.5 becomes PT12H30M. The language field takes a code such as en or hi and is written as inLanguage. Credits, when you have them, are written as a QuantitativeValue under numberOfCredits.

A worked Course example with an online instance

From form fields to finished JSON-LD.

Enter Data Visualization Basics as the name, Chartcraft Academy as the provider, and leave the mode on Online. The heart of the output reads: {"@type": "Course", "name": "Data Visualization Basics", "provider": {"@type": "Organization", "name": "Chartcraft Academy"}, "hasCourseInstance": {"@type": "CourseInstance", "courseMode": "Online"}}. Add a workload of 12 hours and a Paid price of 49 USD, and the instance gains courseWorkload PT12H while an Offer with category Paid joins the Course.

Switch the mode to Offline and the instance grows a location: a Place with the campus name and a PostalAddress built from your street, city and country fields. Blended does the same while recording that remote attendance also exists. One choice changes the whole lower half of the structure, which is the kind of conditional logic that goes wrong fast when written by hand.

Course schema mistakes to avoid

Where markup quietly fails.

The most damaging mistake is marking up pages that aren't courses. Google's definition is a series of lessons toward a learning outcome, so a one-hour webinar replay or a blog tutorial marked as a Course misdescribes the page. The second is provider drift: the provider name in the markup should match the organization name you use everywhere else.

Beyond those, watch for descriptions copied from marketing headers that say nothing about the content, offline instances with no usable address, and catalog pages where one URL carries markup for twenty classes. Each class needs its own page and its own block, with an ItemList on the catalog page tying them together.

Tips for cleaner Course markup

Small choices, better listings.

Google's course list shows only about the first 60 characters of the description, and the form's counter tracks that limit. Put what you'll learn first and keep the rest for the page. Use the Course code field whenever your institution has real catalog codes, because students do search for strings like WEB101.

Keep the price and workload in the markup the same as on the page, and check the block with Test in Google Rich Results Test or the Schema.org validator after every template change, not just at launch. Education pages get redesigned often, and a lost provider URL or a broken nesting can go unnoticed for months.

Course Schema Generator next to its siblings

Pick the type that matches the page.

A dated one-off workshop with tickets behaves more like an event than a course, and the Event Schema Generator handles attendance mode and ticket tiers properly. Your school or academy as an entity belongs to the Organization Schema Generator, and the provider name here should match it exactly.

For the catalog page that lists every program, build the individual course pages with this tool and then use the ItemList Schema Generator, choosing Course as the item type and Summary page when each course has its own page. That pairing is what the course list feature is built from.

Try it now

Open Course Schema Generator

The tool is one click away. No sign up, no upload, no payment.

Open Course Schema Generator