Course Instance Schema Generator — Publish Scheduled Runs
Generate clean CourseInstance JSON‑LD for a specific session. Clarify dates, instructors, and attendance mode, nested under its parent Course.
Try the CourseInstance GeneratorWhy many course run pages underperform
- 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
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
- 01
Choose CourseInstance in the generator below.
- 02
Provide startDate (and endDate) with clear formats; set courseMode and attendance expectations.
- 03
Add a location: Place (with a name) for in‑person or VirtualLocation with a registration/join URL.
- 04
Reference or embed the parent Course with name (and URL) and add instructors.
- 05
Copy JSON or Script, paste on the session page, and validate in the Schema Markup Validator.
Ready to build the markup?
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.- Parent course — CourseInstance has no property that points to its course. Publish the Course (
name,url,description) and nest each session under itshasCourseInstance. instructor— Person or Organization withnameand optionalurl,sameAs.offers— price, currency, availability, and registration URL when the session is paid.maximumAttendeeCapacity/remainingAttendeeCapacity— optional fields to communicate seat limits.performer/organizer— optional, usually the same asinstructoror the 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, and instructors, nested under the Course with
hasCourseInstance. - 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 in the Schema Markup Validator; 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 (schema.org has no completed status, so label them as past on the page). - 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: publish the Course with its
nameandurl, and nest each session under itshasCourseInstance. - 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.name
{
"@context": "https://schema.org",
"@type": "Course",
"name": "Intro to Python",
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"startDate": "2026-01-10"
}
}FAQs
Do I need a Course too?ShowHide
Yes. CourseInstance has no property that points back to its course, so publish the Course and list each session under its hasCourseInstance property.
Online classes?ShowHide
Set location as VirtualLocation and provide a registration URL on the page.