The short answerMark up each camp session as an Event with dates, a location and an Offer for the price. Use Course with CourseInstance for recurring classes, and LocalBusiness or a subtype like SportsActivityLocation for your location. Use JSON-LD and keep it matching the visible page. Google says structured data isn't required for AI search, but it helps with rich results.
Schema markup is code that labels the facts on your page so machines don't have to guess them: this is a camp, it runs July 7 to 11, it costs $350, it's for ages 7 to 10. Search engines read it, and so can any other tool that understands the schema.org vocabulary.
This guide covers which types fit camps and classes, gives you JSON-LD you can adapt, and explains what Google has changed recently, because several things that used to work no longer earn anything in Google Search.
What is schema markup and does a camp or class website need it?
Schema markup is structured data, written in the schema.org vocabulary, that describes what a page is about. It isn't required, but it's worth adding to pages that list sessions, dates and prices.
Google's own definition is that structured data is "a standardized format for providing information about a page and classifying the page content." Schema.org itself was founded by Google, Microsoft, Yahoo and Yandex, so the same vocabulary works across search engines.
Google supports three formats: JSON-LD, Microdata and RDFa. It recommends JSON-LD for most sites because it sits in a single <script> tag and isn't mixed into your visible HTML. Every example below uses JSON-LD.
Which schema.org types should camps and kids' classes use?
Use Event for camp sessions, Course with CourseInstance for recurring classes, LocalBusiness or a subtype for your location, and Offer for prices. FAQPage is still valid schema.org, but Google no longer shows it as a rich result.
| What you're describing | schema.org type | Google Search feature today |
|---|---|---|
| A camp week or a one-time workshop | Event |
Event experience in Search and Maps |
| A class that runs on a schedule | Course + CourseInstance |
Course rich result retired in 2025 |
| Your studio, gym or facility | LocalBusiness or a subtype like SportsActivityLocation |
Local business details in Search and Maps |
| The price and availability | Offer (nested inside the above) |
Shown as part of event details |
| Questions and answers on the page | FAQPage |
FAQ rich result removed in 2026 |
How do I mark up a summer camp session with Event schema?
Give each camp session its own page and its own Event markup with a name, start date, end date, location and an Offer. Google's event guidelines say each event needs a unique URL and that the event experience supports pages focused on a single event, not schedule pages listing many.
For a camp week, use dates without times for the start and end of the session, or full times with your UTC offset. Google's docs say to give both start and end dates for multi-day events, and to use a separate Event for each session when each one is sold separately.
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Robotics Day Camp: Build a Rover (Ages 8-11)",
"startDate": "2027-07-12T09:00:00-05:00",
"endDate": "2027-07-16T15:00:00-05:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"typicalAgeRange": "8-11",
"description": "A five-day robotics camp where campers design, wire and program a small rover.",
"image": ["https://www.example.com/images/rover-camp.jpg"],
"location": {
"@type": "Place",
"name": "Example STEM Studio",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
}
},
"offers": {
"@type": "Offer",
"url": "https://www.example.com/camps/rover-week",
"price": 350,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"validFrom": "2027-01-15"
},
"organizer": {
"@type": "Organization",
"name": "Example STEM Studio",
"url": "https://www.example.com"
}
}
The business name, address and prices above are placeholders. Replace every value with your own, and make sure each one also appears on the page.
A few rules from Google's event guidelines matter for camps:
- Physical location required. Google's event experience doesn't support virtual events with no real-world component.
- Open to the public. Events that require a membership or an invitation before you can buy aren't eligible.
- Not your opening hours. Don't mark your regular business hours as an event.
- Keep status current. If a week is canceled or moved, change
eventStatustoEventCancelledorEventRescheduledinstead of deleting the markup.
How do I mark up a weekly class with Course and CourseInstance?
Describe the class once as a Course, then add one CourseInstance for each section, with its schedule, instructor and price. Schema.org defines CourseInstance as an offering of a course at a different time, place or mode, and it's a type of Event, so it takes the same date and location properties.
Use courseSchedule with a Schedule to express "every Tuesday at 4 p.m." The Schedule type supports byDay, startTime, endTime, repeatFrequency, startDate and endDate.
{
"@context": "https://schema.org",
"@type": "Course",
"name": "Beginner Ballet",
"description": "An eight-week introduction to ballet basics, posture and simple combinations.",
"typicalAgeRange": "5-7",
"provider": {
"@type": "Organization",
"name": "Example Dance Studio",
"url": "https://www.example.com"
},
"hasCourseInstance": [
{
"@type": "CourseInstance",
"courseMode": "onsite",
"instructor": { "@type": "Person", "name": "Jordan Lee" },
"location": {
"@type": "Place",
"name": "Example Dance Studio",
"address": {
"@type": "PostalAddress",
"streetAddress": "456 Oak Ave",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
}
},
"courseSchedule": {
"@type": "Schedule",
"byDay": "https://schema.org/Tuesday",
"startTime": "16:00",
"endTime": "16:45",
"repeatFrequency": "P1W",
"startDate": "2027-01-12",
"endDate": "2027-03-02",
"scheduleTimezone": "America/Chicago"
},
"offers": {
"@type": "Offer",
"price": 160,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
]
}
Be clear on what this does and doesn't get you. Google retired the Course Info rich result in 2025 as part of simplifying its results page, and removed it from Search Console reporting and the Rich Results Test that September. Google said the change wouldn't affect rankings, and that use of these types outside Google Search isn't affected. So Course markup is still a clean, standard way to describe your classes. It just won't produce a special Google display.
How do I add LocalBusiness or SportsActivityLocation schema for my location?
Put LocalBusiness markup on your home or contact page with, at minimum, your business name and address, and use the most specific subtype that fits. Google's local business docs list name and address as required, and recommend openingHoursSpecification, geo, telephone and url.
Schema.org has a SportsActivityLocation type with subtypes including SportsClub, ExerciseGym, PublicSwimmingPool and TennisComplex. If you run a swim school, gym program or sports club at your own site, one of these fits better than plain LocalBusiness. Google says if more than one type applies, list them as an array.
{
"@context": "https://schema.org",
"@type": "SportsClub",
"name": "Example Youth Soccer Club",
"url": "https://www.example.com",
"telephone": "+1-555-555-0100",
"address": {
"@type": "PostalAddress",
"streetAddress": "789 Field Rd",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.78172,
"longitude": -89.65015
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["https://schema.org/Monday", "https://schema.org/Wednesday"],
"opens": "15:30:00",
"closes": "19:00:00"
}
]
}
Google asks for at least five decimal places on latitude and longitude. Your schema should match your Google Business Profile exactly: same name, same address, same phone. See our Google Business Profile guide for the profile side.
Should I still use FAQPage schema?
You can, but it no longer does anything visible in Google Search. Google stopped showing the FAQ rich result on May 7, 2026, and removed its documentation in June 2026.
If your page already has a real questions-and-answers section, FAQPage markup is still valid schema.org and costs little to keep. Don't add questions to a page just to carry the markup. Google's general rule is that structured data must describe content that's visible on the page.
Does schema markup help with AI search and ChatGPT?
Not directly in Google. Google's guide to its generative AI features says structured data "isn't required for generative AI search" and there's no special schema.org markup to add, though it recommends keeping it as part of normal SEO because it helps with rich results.
What does matter, according to Google, is the same foundation as regular search. Your pages must be indexed and eligible to show with a snippet. Your content should be crawlable, and your structured data should match the text on the page. Google also says AI responses can include local business details, and that an accurate Google Business Profile helps with that.
For other AI assistants, there's no published rule saying they read schema markup. The practical case is simpler: markup forces you to state the facts families ask about (dates, ages, price, address) in one consistent, machine-readable place, and to keep them in sync with the page. Assistants that read your page get the same facts either way. If you want your business to show up in ChatGPT specifically, our ChatGPT guide covers that separately.
How do I add schema markup and test it?
Paste the JSON-LD into a <script type="application/ld+json"> tag on the page it describes, then check it in Google's Rich Results Test and watch Search Console after it's live. Google also reads JSON-LD that's injected by JavaScript or by plugins in your website builder.
- Pick one page type to start. Camp session pages or class pages, whichever drives most of your sign-ups.
- Fill in only true, visible facts. Google says fewer complete and accurate properties beat many sloppy ones.
- Test before publishing. Run the page through the Rich Results Test and fix critical errors.
- Check in Search Console. Use the URL Inspection tool to confirm Google can see the page and isn't blocked by robots.txt, a
noindextag or a login. - Keep it current. Update prices, availability and
eventStatusthe same day the page changes. A sold-out week should saySoldOut.
If you use a website builder, check for a structured data setting or plugin first. Google's event docs also note that if you post events on a third-party platform already integrated with Google, you may not need to mark them up yourself.
How else can families find my camps and classes?
Put your sessions where families already search. Families search camps, classes and enrichment programs on Kaleto, and providers list their programs there. AI assistants connected to Kaleto can search those listings too. List your program on Kaleto.
Common questions
What schema type should I use for a summer camp?
Use Event for each camp session, with its own page, a start and end date, a physical location and an Offer for the price. Google's event guidelines say each event needs a unique URL.
What schema type should I use for weekly kids' classes?
Use Course to describe the class and CourseInstance for each section, with a Schedule for the day and time. Google retired its Course rich result in 2025, but the markup is still valid schema.org.
Does Google still show FAQ rich results?
No. Google stopped showing the FAQ rich result on May 7, 2026, and removed its documentation that June. FAQPage markup is still valid schema.org but no longer produces a special display in Google Search.
Is schema markup required to appear in Google's AI Overviews or AI Mode?
No. Google says structured data isn't required for generative AI search and there's no special markup to add. Pages need to be indexed and eligible for a snippet, and Google recommends keeping structured data for rich results.
Which format should I use for schema markup?
Use JSON-LD. Google supports JSON-LD, Microdata and RDFa, and recommends JSON-LD for most sites because it sits in one script tag and is easier to maintain.
Sources
- Google Search Central — Introduction to structured data markup in Google Search (2026)
- Google Search Central — Event structured data (2026)
- Google Search Central — Local business structured data (2026)
- Google Search Central — Optimizing your website for generative AI features on Google Search (2026)
- Google Search Central Blog — Simplifying the search results page (2025)
- Google Search Central — Latest documentation updates (2026)
- Schema.org — CourseInstance (2026)
- Schema.org — About Schema.org (2026)
First published

