Schema Implementation Templates

by Jana Spivey | Jun 9, 2026

In This Guide:

Ready-to-customize JSON-LD templates for MusicVenue, Event, and LocalBusiness schema. With platform-by-platform implementation instructions and a validation checklist.

For Venue Operators

You don't need to understand the code. You need to fill in the highlighted fields with your venue's information and hand the completed template to your developer or paste it into your website platform's code injection tool.

Every field is labeled and explained in plain English on the following pages.

For Developers

These are production-ready JSON-LD templates following schema.org standards. MusicVenue (LocalBusiness subtype), MusicEvent (Event subtype), and BreadcrumbList.

Validate with Google's Rich Results Test and schema.org's validator. Common errors and fixes are at the end of this document.


Before the Templates

Why Schema Markup Matters

When AI tools like ChatGPT, Google's AI Overviews, and Perplexity try to understand your venue, they read your website looking for clues about what kind of place it is, what events are happening, and who it's for. Without schema markup, they're guessing. With it, you're telling them directly.

Schema markup is structured code (specifically JSON-LD format) that sits in the head of your HTML pages. Visitors never see it. AI crawlers read it and use it to build an accurate picture of your venue without having to infer anything.

Without schema markup:
AI guesses: a page about a venue. Mentions music and events. Address might be 123 Main St. AI hedges. It may describe you vaguely or leave you out of results.

With schema markup:
AI knows: a MusicVenue, 350-cap, 123 Main St, Nashville, TN, open Fri-Sun. AI cites with confidence. It can recommend you for specific queries.

3 Things to Know

Before you Implement:

  1. Crawlability Comes First. Schema only helps if AI crawlers can reach your page. Before implementing schema, run the View Source test on your homepage (right-click > View Page Source, then search for your venue name). If your venue name doesn't appear in the source code, fix the crawlability problem first. See the AI Crawlability Checklist for how to address this.
  1. Each Template Goes in the Section of the Relevant Page. Your developer will know where this is. If you're using WordPress with Yoast or RankMath, those plugins handle placement automatically. If you're using Squarespace's Code Injection tool, it goes in the Header Code Injection box under Settings > Advanced > Code Injection.
  1. Validate After Implementing. Google's Rich Results Test will tell you immediately whether your schema is valid, what it detected, and what errors need fixing. Run it on every page you add schema to. Don't skip this step.

Template 1 | MusicVenue / LocalBusiness

Add to: Your homepage AND your About page
* Update whenever your core venue info changes

This template tells AI what kind of entity your venue is, where it is, how to contact it, when it's open, and how to describe it. This is the foundation. Everything else builds on it.

Replace every value in [BRACKETS] with your venue's actual information.

---------- COPY FROM HERE ----------

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": ["MusicVenue", "LocalBusiness"],

  // REQUIRED: Your official venue name -- exactly as on your signage
  "name": "[YOUR VENUE NAME]",

  // REQUIRED: Your primary website URL
  "url": "https://[yourvenuewebsite.com]",

  // REQUIRED: Full address -- must match your GBP and Yelp exactly
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "[123 Main St]",
    "addressLocality": "[City]",
    "addressRegion": "[ST]",
    "postalCode": "[00000]",
    "addressCountry": "US"
  },

  // REQUIRED: Your main phone number -- same format everywhere
  "telephone": "+1-[555-555-5555]",

  // REQUIRED: 2-3 sentences. Specific facts only -- capacity, genre,
  // location context, age policy. No marketing language.
  "description": "[A 350-capacity all-ages room in East Nashville
  with a focus on emerging indie and Americana artists.]",

  // RECOMMENDED: Your opening hours
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Friday", "Saturday"],
      "opens": "19:00",
      "closes": "02:00"
    }
  ],

  // RECOMMENDED: One good photo of your venue
  "image": "https://[yourvenuewebsite.com/images/venue-photo.jpg]",

  // RECOMMENDED: Ticket price range, e.g. "$10-$35"
  "priceRange": "[$10-$35]",

  // RECOMMENDED: Your social profiles and booking page
  "sameAs": [
    "https://www.facebook.com/[yourvenue]",
    "https://www.instagram.com/[yourvenue]",
    "https://www.bandsintown.com/v/[yourvenue]"
  ]
}
</script>

---------- END OF TEMPLATE 1 ----------

Field-By-Field Guide

"name" (REQUIRED)
Your official venue name, exactly as it appears on your signage. Include "The" if it's part of the name. This must match your GBP, Yelp, and every other platform exactly.

"url" (REQUIRED)
Your venue's primary website URL, including https://. Use the homepage URL here.

"address" (REQUIRED)
Your full address. streetAddress is the street line only. addressLocality is your city. addressRegion is your two-letter state abbreviation. This must match your canonical NAP.

"telephone" (REQUIRED)
Your main contact phone number. Use the format +1-XXX-XXX-XXXX. Must match your GBP and all other listings.

"description" (REQUIRED)
Two to three sentences with specific, citable facts. Capacity, location context, age policy, genre focus, what makes your room distinct. Do not use generic marketing language. "premier destination" tells AI nothing.

"openingHoursSpecification" (OPTIONAL)
Your actual operating hours. List each day or group of days. Use 24-hour time format. Omit days you're closed rather than listing them as closed.

"image" (OPTIONAL)
A direct URL to a high-quality photo of your venue interior or exterior. HTTPS required. This helps AI and Google understand your venue visually.

"priceRange" (OPTIONAL)
A general ticket price range using a dollar sign string, e.g. "$10-$35" or "$$". Helps AI filter venue recommendations for budget-aware queries.

"sameAs" (OPTIONAL)
A list of URLs for your official profiles on other platforms. Include Facebook, Instagram, Bandsintown, Yelp, and any other platform where you maintain an active presence. This helps AI connect your profiles as a unified entity.


Template 2 | MusicEvent / Event

Add to: Each individual show page, OR your main events listing page (one block per show)
* Add with each new booking

This is the template that makes your shows machine-readable. Without it, AI may know your venue exists but can't name a single upcoming event. Add one copy of this block for each show, updated with that show's specific details.

The Offer block at the bottom is critical. Without it, AI knows the event exists but can't tell anyone how to buy a ticket.

Where This Goes for Widget-Based Event Calendars:
If your events are displayed via a Ticketmaster or Eventbrite widget, those events aren't crawlable from your site. The fix is to add this schema block manually to each show's page, or to a dedicated plain-text events page.

The schema tells AI about the event even when the widget can't be read. See the AI Crawlability Checklist for the full widget workaround.

---------- COPY FROM HERE (one copy per show) ----------

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "MusicEvent",

  // REQUIRED: Full name of the event -- usually Artist Name + show type
  "name": "[The Midnight -- Live at Your Venue]",

  // REQUIRED: Start date and time in ISO 8601 format: YYYY-MM-DDTHH:MM
  // This is doors time OR show time -- be consistent across all events
  "startDate": "[2026-07-12T20:00]",

  // RECOMMENDED: End time -- estimated is fine
  "endDate": "[2026-07-12T23:00]",

  // REQUIRED: Your venue, referenced back to Template 1
  "location": {
    "@type": "MusicVenue",
    "name": "[YOUR VENUE NAME]",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "[123 Main St]",
      "addressLocality": "[City]",
      "addressRegion": "[ST]",
      "postalCode": "[00000]"
    }
  },

  // REQUIRED: The performer(s)
  "performer": {
    "@type": "MusicGroup",
    "name": "[The Midnight]"
  },

  // REQUIRED: 1-2 sentences describing the artist and the show
  "description": "[Synth-pop duo The Midnight brings their cinematic
  sound to an intimate club setting. All ages, general admission.]",

  // RECOMMENDED: A show image or artist photo
  "image": "https://[yourvenuewebsite.com/images/the-midnight-show.jpg]",

  // REQUIRED: The ticket offer -- do not skip this block
  "offers": {
    "@type": "Offer",
    "url": "https://[your-ticket-link.com/the-midnight-july12]",
    // Use "InStock" until sold out, then switch to "SoldOut"
    "availability": "https://schema.org/InStock",
    "price": "[25]",
    "priceCurrency": "USD",
    // When tickets go on sale -- use ISO 8601 format
    "validFrom": "[2026-06-01T10:00]"
  },

  // RECOMMENDED: update if show is cancelled or rescheduled
  "eventStatus": "https://schema.org/EventScheduled",

  // RECOMMENDED: online or in-person
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode"
}
</script>

---------- END OF TEMPLATE 2 ----------

Critical Fields (Don’t Skip These)

"startDate" (REQUIRED)
Must be in ISO 8601 format: YYYY-MM-DDTHH:MM. Not "July 12 at 8pm." Not "7/12/2026." The format is 2026-07-12T20:00. Without valid formatting this entire block is invalid and won't be read.

"offers" block (REQUIRED)
This is the most commonly missing field in venue schema. Without the Offer block, AI knows your event exists but can't direct anyone to buy a ticket. Include the ticket URL, price, currency, and availability status for every event.

"location" (REQUIRED)
The location block references your venue back to Template 1. Use the exact same venue name and address as in Template 1. This is how AI connects your events to your venue entity.

"performer" (REQUIRED)
Use MusicGroup for bands, MusicGroup or Person for solo artists. The name must match how the artist is known. Use their official name, not a shortened version.

"description" (REQUIRED)
One to two sentences about the artist's sound and what makes this show worth attending. Specific language here is what gets cited in discovery queries like "good synth-pop shows this month."

"eventStatus" (OPTIONAL but important)
Update to EventCancelled or EventRescheduled if plans change. Leaving a cancelled show as EventScheduled sends incorrect information to AI and fans.

Multiple Performers on One Bill

Make "performer" an array:

"performer": [
  {"@type": "MusicGroup", "name": "Headliner"},
  {"@type": "MusicGroup", "name": "Opener"}
]

List the headliner first.


Template 3 | BreadcrumbList

Add to: Every page on your site
* Tells AI how your site is organized

BreadcrumbList schema tells AI crawlers how your pages relate to each other and how your site is structured. It's less critical than Templates 1 and 2 but contributes to AI treating your site as a coherent entity rather than a collection of disconnected pages.

It's also what enables Google to show breadcrumb navigation in search results.

---------- COPY FROM HERE ----------

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://[yourvenuewebsite.com]"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Events",
      "item": "https://[yourvenuewebsite.com/events]"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "[The Midnight -- July 12]",
      "item": "https://[yourvenuewebsite.com/events/the-midnight-july12]"
    }
  ]
}
</script>

---------- END OF TEMPLATE 3 ----------

Adjust the number of items to match your site's actual structure. A simple venue site might have Home > Events > [Show Name]. A more complex site might have Home > Music > Genre > [Show Name]. Use your real URL structure, not an ideal one.


Implementation

Platform-by-Platform Instructions

How you add these templates depends on your website platform. Find your platform below. If your platform isn't listed, share these instructions with your developer.

The process is the same across any platform that allows head tag editing.

WordPress

Recommended method: schema plugin
Install Yoast SEO, RankMath, or Schema Pro. These plugins add LocalBusiness and MusicVenue schema automatically and handle placement. Configure the plugin to set your site type as "Local Business" and your business type as "MusicVenue." For Event schema, install The Events Calendar plugin. It supports Event schema natively but may require configuration to include all required fields.

Manual method: header code injection
In your WordPress admin, go to Appearance > Theme Editor (or use a plugin like Insert Headers and Footers). Add Template 1 to the site-wide header. Add Template 2 to individual show pages using a per-page code block or a custom field. Add Template 3 to each page type.

What to tell your developer:
"Can you add MusicVenue schema from the JAM Agency template to our homepage, and Event schema to each show page? The Event schema needs name, startDate, location, performer, description, and an Offer block with the ticket URL. Please validate with Google Rich Results Test after implementing."

Squarespace

Method: Code Injection
Go to Settings > Advanced > Code Injection. Paste Template 1 into the Header Code Injection box. This adds it site-wide. For individual pages, go to the page settings, open the Advanced tab, and paste Template 2 into the Page Header Code Injection field for each show page.

Note on AI crawler access:
Squarespace does not block AI crawlers by default. However, a setting to block them exists in Settings > Crawlers. If that setting has been enabled, AI crawlers including GPTBot and PerplexityBot will not be able to read your site. Check the setting and confirm AI crawlers are allowed before troubleshooting why schema isn't working. Schema added via Code Injection will help Google regardless, but you want all crawlers to have access.

What to tell your Squarespace admin:
"I need to add schema markup to our site. Can you go to Settings > Advanced > Code Injection and add the code I'm sending you to the Header Code Injection box? I also need per-page schema added to each show page in the Advanced tab. Also, please check Settings > Crawlers and confirm AI crawlers are not blocked."

Wix

Method: Wix Structured Data Markup tool
Wix has a built-in Structured Data Markup tool in the SEO section of your site dashboard. Use it to add schema to individual pages. For site-wide schema (Template 1), use the Custom Meta Tags section in Site Settings > SEO > Advanced SEO.

Alternative: Wix Velo (developer required)
For full control over schema placement, Wix Velo allows custom code injection. This requires a developer but enables dynamic Event schema that updates automatically with your event listings.

What to tell your Wix developer:
"I need MusicVenue schema on the homepage and Event schema on each show page. I have the JSON-LD templates. Can you implement them via Velo and validate with Google's Rich Results Test?"


Validation

Confirm Your Schema Is Working

Run these steps after implementing each template. Don't assume it's working. Verify it. Schema with a single formatting error is completely invalid and returns nothing, with no visible sign anything is wrong.

  1. Google Rich Results Test: Go to search.google.com/test/rich-results. Enter your venue's homepage URL. Under "Detected Items," you should see LocalBusiness or MusicVenue. Enter a show page URL. You should see MusicEvent. Any red errors mean the schema block is invalid and won't be read. Fix them before moving on.
  1. Schema.org Validator: Go to validator.schema.org. Paste your full JSON-LD code (not the page URL) directly. This validator catches errors that Google's tool sometimes misses, particularly around field types and required nested objects.
  1. Google Search Console URL Inspection: If you have Search Console connected, use the URL Inspection tool on your homepage and a show page. Under "Enhancements," you should see structured data detected. If nothing appears, the schema isn't being read by Google's crawler.
  1. The AI Spot Check: After 5-7 days, ask Perplexity: "What events does [venue name] have coming up?" If your shows now appear with correct details, your Event schema is working. Ask ChatGPT or Claude to describe your venue. If the description is more specific and accurate than before, your MusicVenue schema is doing its job.

Common Errors

What Goes Wrong and How to Fix It

These are the errors that appear most often in venue schema implementations. All of them are caught by the Rich Results Test.

ERROR: Invalid date format

Wrong:startDate: "July 12 at 8pm"
Right:startDate: "2026-07-12T20:00"
Why:startDate must be in ISO 8601 format. Google will reject any other format entirely. YYYY-MM-DDTHH:MM is the pattern. 8pm is 20:00.

ERROR: Missing Offer block

Wrong:Event schema with no "offers" field
Right:Add the full offers block with url, availability, price, priceCurrency
Why:The offers block is required for Google's Event rich result. Without it, the event may still be indexed but won't qualify for ticket display in search results.

ERROR: Name/address mismatch between templates

Wrong:Template 1 name: "The Majestic" / Template 2 location name: "Majestic Theater"
Right:Use the exact same name string in both templates
Why:The venue name in your Event schema location block must match your MusicVenue template exactly. Even minor differences prevent Google from connecting the two entities.

ERROR: Mismatched canonical info

Wrong:Schema address: "123 Main Street" / GBP address: "123 Main St"
Right:Use identical formatting across schema and all platform listings
Why:Your schema address must match your Google Business Profile, Yelp, and every other listing exactly. The NAP Audit Template covers this in full.

ERROR: eventStatus not updated for cancellations

Wrong:"eventStatus": "EventScheduled" -- even after the show is cancelled
Right:"eventStatus": "https://schema.org/EventCancelled"
Why:Google and AI tools read eventStatus to determine whether to surface your event. A cancelled show left as EventScheduled will continue to mislead fans and AI.

ERROR: Availability not updated for sold-out shows

Wrong:"availability": "https://schema.org/InStock" -- even when sold out
Right:"availability": "https://schema.org/SoldOut"
Why:Update availability to SoldOut when a show is gone. AI and Google Events will reflect the status in their results.

Deeper Reading

This guide is part of the "Finding Your Venue in the AI Era" series.

Related reading:

Other guides: AI Crawlability Checklist | NAP Audit Template | AI Strategies Built for Independent Venues

Questions or ready to talk through implementation? Start a conversation with us.

JAM Agency helps independent venue operators show up in search, AI results, and in the minds of the people looking for exactly what you offer. Questions? Email us at hello@thejamagency.com. 

In This Guide: