Gaming / eSports Stack
Team or tournament pages with SportsOrganization, events, highlight video, FAQs, and breadcrumb context.
When to use this stack
- Team pages highlighting upcoming matches and roster
- Tournament/event pages with video highlights and FAQs
- League pages that need navigation context and social proof
What is included
Defines the team/organization with name, sport, and profiles.
Represents an upcoming match/tournament with offers/streams.
Captures highlight video with thumbnail and embed URL.
Answers stream access, schedule, and roster questions.
Provides navigation context for the team/tournament page.
Properties across the bundle
Nested properties keep their parent path, such as offers.priceCurrency. Only publish values that match visible page content.
Required properties
- description
- embedUrl
- eventAttendanceMode
- itemListElement[].name
- location.name
- mainEntity[].@type=Question
- mainEntity[].acceptedAnswer.text
- name
- sport
- startDate
- thumbnailUrl[]
- uploadDate
- url
Recommended properties
- contentUrl
- description
- duration
- image
- itemListElement[].item
- logo
- mainEntity[].acceptedAnswer.text
- mainEntity[].author.name
- mainEntity[].name
- member[].name
- offers.price
- offers.priceCurrency
- offers.url
- publisher.name
- sameAs[]
Combined JSON-LD
Paste this as one script tag, then replace every example value with data from the live page.
[
{
"@context": "https://schema.org",
"@type": "SportsOrganization",
"@id": "https://www.example.com/esports/phoenix#org",
"name": "Phoenix Esports",
"url": "https://www.example.com/esports/phoenix",
"sport": "Esports",
"logo": "https://www.example.com/images/phoenix-logo.png",
"member": [
{ "@type": "Person", "name": "Nova" },
{ "@type": "Person", "name": "Blitz" }
],
"sameAs": [
"https://twitter.com/phoenixesports",
"https://www.youtube.com/@phoenixesports"
]
},
{
"@context": "https://schema.org",
"@type": "Event",
"@id": "https://www.example.com/esports/phoenix#event",
"name": "Phoenix vs Titans — Spring Split",
"description": "Week 5 matchup in the Spring Split.",
"startDate": "2026-03-05T19:00:00-05:00",
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
"location": { "@type": "VirtualLocation", "name": "Online" },
"offers": {
"@type": "Offer",
"price": "0.00",
"priceCurrency": "USD",
"url": "https://www.example.com/esports/phoenix/watch"
}
},
{
"@context": "https://schema.org",
"@type": "VideoObject",
"@id": "https://www.example.com/esports/phoenix#highlight",
"name": "Highlights: Phoenix vs Legends",
"description": "Top plays from last week's match.",
"thumbnailUrl": [
"https://www.example.com/images/phoenix-highlight.webp"
],
"uploadDate": "2026-02-20",
"duration": "PT5M",
"embedUrl": "https://www.example.com/embed/phoenix-highlight",
"contentUrl": "https://cdn.example.com/video/phoenix-highlight.mp4",
"publisher": { "@type": "Organization", "name": "Phoenix Esports" }
},
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Where can I watch the next match?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Watch live on our site or Twitch at https://www.example.com/esports/phoenix/watch."
}
},
{
"@type": "Question",
"name": "Who is starting this week?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Starters: Nova, Blitz, Echo, Ryn, Sol. Substitutes listed on the roster section."
}
}
]
},
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.example.com" },
{ "@type": "ListItem", "position": 2, "name": "Esports", "item": "https://www.example.com/esports" },
{ "@type": "ListItem", "position": 3, "name": "Phoenix Esports", "item": "https://www.example.com/esports/phoenix" }
]
}
]Implement and verify
- 01
Start with the live page
Confirm titles, prices, availability, policies, and visible FAQ content before generating markup.
- 02
Add one JSON-LD script
Use the combined example as a template in the document head or before the closing body tag.
- 03
Complete regional details
Fill shipping destinations and timing for every region the page actually serves.
- 04
Link the return policy
Use a stable MerchantReturnPolicy URL and keep its terms synchronized with the page.
- 05
Match visible answers
Add only FAQs that users can read on the same page, with identical answers.
- 06
Validate after changes
Run Rich Results Test after implementation and whenever price, availability, or policy data changes.
Common errors and fixes
- Missing currency or availability
Use ISO currency codes and complete schema.org availability URLs in Offer data.
- Incomplete shipping details
Include shippingDestination.addressCountry and deliveryTime.transitTime with units.
- Return policy is not connected
Reference MerchantReturnPolicy from the Offer and provide a stable public policy URL.
- FAQ answers differ from the page
Keep structured FAQ answers identical to visible answers.
Stack FAQs
Should I use SportsOrganization or Organization?
Use SportsOrganization for teams/leagues. For publishers or hosts, Organization is fine; keep consistency with the page content.
Can I list multiple events?
Yes. Include multiple Event objects if you show multiple matches on the page. Ensure each is visible to users.