My Tool Studio
Schema Markup·4 min read

Course Schema for Education Sites: A Practical Guide

Education sites compete on a brutally crowded results page, where a course listing with provider name and format details beats a bare blue link every time. Course schema for education sites is how those details get there: structured data that tells Google what the class is, who runs it, and whether students attend online or in a room. This guide walks through the Course and CourseInstance split, a worked example, the pricing question, and the mistakes that keep training pages out of course rich results.

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

Course schema for education sites: what it 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 entity with a named provider, a delivery mode, and a credit value, which is what course list results and education carousels are built from.

The gap shows up hardest for smaller providers. Universities get recognized through sheer entity weight; an independent academy teaching data visualization or a clinic offering a schema therapy course has to declare its structure explicitly or stay invisible in course-shaped search features.

Course vs CourseInstance: two layers doing different jobs

The distinction that confuses everyone once.

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

The course vs courseinstance split exists because Google needs both answers: what is this class, and how is it actually delivered. Markup that puts courseMode directly on the Course, skipping the instance layer, is the single most common structural error in education markup, and it's why the Course Schema Generator builds the nesting for you based on the mode you pick.

Pricing fields in Course markup, and what belongs where

The honest answer about offers.

Google's course info results can display cost, which comes from an offers property holding price and priceCurrency, and free courses qualify for some treatments by declaring a price of 0. So pricing fields in course markup are real and sometimes worth adding.

This generator focuses on the identity layer: provider, mode, location, code, and credits emitted as a QuantitativeValue. It doesn't build an offers block, so if your strategy depends on price display, add the offer node to the generated JSON by hand before publishing. That's a two-line edit on top of an otherwise complete structure, and it keeps the tool honest about what it produces.

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"}}.

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

Course schema mistakes that block education rich results

Where markup quietly fails.

The most damaging mistake is marking up pages that aren't courses. Google's definition requires instruction toward a learning outcome, so a one-hour webinar replay or a blog tutorial marked as a Course invites a manual action rather than a rich result. The second is provider drift: the provider name in the markup should match the organization name you use everywhere else, or you fragment your own entity.

Beyond those, watch for descriptions copied from marketing headers that say nothing about content, offline instances with no usable address, and course lists where one page carries markup for twenty classes. Each class needs its own page and its own block, with an ItemList tying the catalog together if you want list structure.

Tips for cleaner Course markup

Small choices, better listings.

Write the description for a student skimming results, not for a prospectus: what you'll learn, how long it takes, what you can do afterward, inside two sentences. Use the courseCode field whenever your institution has real catalog codes, because students genuinely search for strings like WEB101.

And validate with the Rich Results Test after every template change, not just once at launch. Education pages get redesigned often, and a lost provider URL or a broken nesting survives unnoticed for months without a periodic check.

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 offers properly. Your school or academy as an entity belongs to the Organization Schema Generator, and the provider name here should match it exactly.

For a catalog page listing every program you run, build the individual course pages with this tool and structure the index with the ItemList Schema Generator instead of stacking Course blocks on one URL.

Try it now

Open Course Schema Generator

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

Open Course Schema Generator