Course Instance Schema Generator — Publish Scheduled Runs
Generate clean CourseInstance JSON‑LD for a specific session. Clarify dates, instructors, attendance mode, and link to the parent Course.
Why many course run pages underperform
Pain points we solve
- Dates lack timezones or clarity between start/end.
- Attendance mode (online/in‑person) and location details are ambiguous.
- The session is not linked to a canonical Course object.
- Instructor details are missing or not structured.
How SwiftSchema helps
Solution
The CourseInstance generator focuses on the essentials for a scheduled run: startDate (and endDate when known), attendance mode via courseMode, and a proper location (Place or VirtualLocation).
It embeds or references the parent Course with a name (and URL) and supports adding one or more instructors with names and optional URLs.
How it works
How it works
- Choose CourseInstance in the generator below.
- Provide startDate (and endDate) with clear formats; set courseMode and attendance expectations.
- Add a location: Place (with a name) for in‑person or VirtualLocation with a registration/join URL.
- Reference or embed the parent Course with name (and URL) and add instructors.
- Copy JSON or Script, paste on the session page, and validate in the Rich Results Test.
Paste once per session. Validate. Ship.
What is CourseInstance structured data?
CourseInstance captures the details of a specific run or cohort of a Course—start/end dates, attendance mode, location, instructors, and the parent Course reference. It’s ideal for scheduled bootcamps, university terms, webinars, and live training sessions. While the Course object explains what learners will cover, CourseInstance tells search engines “this cohort starts on X date, lasts Y weeks, and happens in Z format.” Linking each instance back to the parent Course helps Google consolidate catalog entries and improves visibility in education-focused surfaces.
Required and high-impact properties
- startDate— ISO 8601 with timezone (2026-01-10T18:00:00-05:00).
- endDate— optional but recommended, especially for multi-week cohorts.
- courseMode—online,onSite,blended,asynchronous, etc. Combine terms (e.g., “online synchronous”) if helpful.
- location—Place(withname+ PostalAddress) for in-person orVirtualLocation(withurl) for remote sessions.
- course— reference to the parent Course withname,url, and optionallydescription.
- instructor— Person or Organization withnameand optionalurl,sameAs.
- offers— price, currency, availability, and registration URL when the session is paid.
- maximumEnrollment/remainingAttendeeCapacity— optional fields to communicate seat limits.
- performer/provider— optional, usually the same asinstructoror parent Organization.
Content prep checklist
- Publish clear session details: start/end dates (with time zones), meeting cadence, and delivery format.
- Introduce instructors or facilitators with bios and links to their profiles.
- Identify prerequisites, required materials, and outcomes (certificates, credits).
- Provide venue info for on-site sessions: address, building, room, accessibility notes.
- Include tuition/pricing, payment plan options, and refund/cancellation policies if publicly available.
- Add prominent registration CTAs, deadlines, and waitlist links. Note if seats are limited.
Implementation workflow
- Update the landing page with the content above, ensuring the parent Course exists (either on the same page or separate).
- Generate CourseInstance JSON‑LD with start/end dates, courseMode, location, instructors, and a reference to the Course.
- Reference the parent Course either inline or via @id. Make sure the Course object includesname,description,provider, andurl.
- Include Offers for paid cohorts. Use multiple Offers for tiered pricing (early bird vs standard) and set availabilityStarts/Ends.
- Embed the schema once per session. If the page lists multiple sessions, include multiple CourseInstance objects with unique identifiers.
- Validate using Rich Results Test; fix warnings about missing Course data or invalid timestamps.
- Monitor Search Console for structured data coverage and track conversions via analytics.
Handling recurring and dynamic schedules
- For self-paced courses, stick with Course schema. Use CourseInstance only when there’s a specific start date.
- For rolling admissions, update startDateandendDateto reflect the next available cohort, and archive past cohorts asEventCompleted.
- If sessions repeat (monthly webinars), consider Event/EventSeries for simpler models; use CourseInstance when the content is clearly tied to a Course curriculum.
- When you load schedules dynamically (React components, calendar widgets), ensure the JSON‑LD reflects the same data on first paint to avoid mismatches.
Attendance modes and locations
- Set courseModeto describe the delivery format (“online asynchronous,” “onSite in-person,” “hybrid”).
- Use location:VirtualLocationfor remote,Place+ PostalAddress for on-site. For hybrid, you can include both or note the flexibility incourseMode.
- Provide a urlwithinVirtualLocationpointing to the registration or webinar platform login page.
- For travel-heavy trainings, mention multi-city itineraries in the content and consider modeling separate CourseInstances per city if they have unique schedules.
Offers and enrollment
- Use Offerwithprice,priceCurrency,url,availability,validFrom,validThrough.
- Include eligibleQuantityorremainingAttendeeCapacityto highlight limited seats.
- Mark free cohorts with price: 0but still includeavailability.
- Update Offers when price changes or the cohort closes; keeping stale prices can trigger policy issues.
- Mention scholarships or employer-sponsored pricing in the visible copy, and keep schema focused on publicly advertised prices to avoid compliance issues.
- For invite-only cohorts, set availabilitytoLimitedAvailabilityand describe the application process.
Troubleshooting checklist
- Missing parent Course: always link to the canonical Course (course.name,course.url).
- Ambiguous attendance: specify courseMode(“online”, “onSite”, “blended”) and provide properlocation.
- No timezone: include offsets in ISO timestamps (2026-03-02T14:00:00+01:00).
- Stale data: update the schema for every new cohort; don’t keep last season’s dates live.
- Duplicate identifiers: if listing multiple sessions on one page, give each CourseInstance a unique @id.
Maintenance and QA tips
- Maintain a scheduling spreadsheet with fields for URL, start/end dates, instructors, and status (planned/live/completed). Use it to drive both content and schema updates.
- After launching a new cohort, request indexing in Search Console to help search engines pick up the new dates quickly.
- If a cohort is canceled or postponed, update eventStatus(EventCancelled,EventPostponed) and adjust copy so registrants aren’t confused.
- Set automated reminders to audit CourseInstance pages quarterly, ensuring instructors, venues, and pricing remain accurate.
- Build integration tests that compare on-page dates to JSON‑LD values to catch drift between CMS content and schema.
Common Errors & Fixes
- Missing parent Course: link to the canonical Course with nameandurl.
- Ambiguous attendance: specify courseModeand provide concretelocationobjects.
- No timezone: use ISO 8601 timestamps with offsets.
- Instructors omitted: add instructorentries with names/links to build trust.
- Offers lacking detail: include price, currency, and URL for paid sessions.
Required properties
startDate
Recommended properties
endDatecourseModeinstructor.namelocation.namecourse.name
{
"@context": "https://schema.org",
"@type": "CourseInstance",
"courseMode": "online",
"startDate": "2026-01-10",
"course": {
"@type": "Course",
"name": "Intro to Python"
}
}