Method 1: paste the code (free)
Generate the markup
Build your schema in LocalSchema (Store or a more specific type) and copy the script tag.
Open the theme code
In Shopify admin: Online Store → Themes → … → Edit code, then open layout/theme.liquid.
Paste before </head>
Paste the script just before the closing </head> tag and save. Or add a Custom Liquid section on only the store page via the theme editor.
Test
Check the storefront page with the LocalSchema checker.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://lonestarplumbing.example/#localbusiness",
"name": "Lone Star Plumbing Co.",
"legalName": "Lone Star Plumbing Company LLC",
"description": "Licensed Austin plumbers for leaks, water heaters, drain cleaning and repiping. Upfront flat-rate pricing and 24/7 emergency service.",
"slogan": "Fixed right, the first time.",
"url": "https://lonestarplumbing.example",
"logo": "https://lonestarplumbing.example/logo.png",
"image": [
"https://lonestarplumbing.example/img/van-16x9.jpg",
"https://lonestarplumbing.example/img/team-1x1.jpg"
],
"foundingDate": "2004-06-15",
"telephone": "+1 512-555-0144",
"email": "service@lonestarplumbing.example",
"priceRange": "$$",
"currenciesAccepted": "USD",
"paymentAccepted": "Cash, Credit Card, Check, Financing",
"knowsLanguage": [
"English",
"Spanish"
],
"address": {
"@type": "PostalAddress",
"streetAddress": "4810 Burnet Rd, Suite 200",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78756",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.320371,
"longitude": -97.739614
},
"areaServed": [
{
"@type": "Place",
"name": "Austin"
},
{
"@type": "Place",
"name": "Round Rock"
},
{
"@type": "Place",
"name": "Cedar Park"
},
{
"@type": "Place",
"name": "Pflugerville"
},
{
"@type": "Place",
"name": "Georgetown"
},
{
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 30.320371,
"longitude": -97.739614
},
"geoRadius": 40000
}
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"opens": "07:00",
"closes": "19:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "16:00"
}
],
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Plumbing services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Drain cleaning",
"description": "Kitchen, bath and main line clearing with camera inspection."
},
"priceSpecification": {
"@type": "PriceSpecification",
"minPrice": "149.00",
"priceCurrency": "USD"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Water heater installation",
"description": "Tank and tankless installs, haul-away included."
},
"priceSpecification": {
"@type": "PriceSpecification",
"minPrice": "1400.00",
"priceCurrency": "USD",
"maxPrice": "4200.00"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Leak detection",
"description": "Non-invasive slab and wall leak location."
},
"price": "295.00",
"priceCurrency": "USD"
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Emergency plumbing",
"description": "24/7 burst pipe and overflow response."
},
"priceSpecification": {
"@type": "PriceSpecification",
"minPrice": "189.00",
"priceCurrency": "USD"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Whole-home repiping",
"description": "PEX repipe with drywall patching."
},
"priceSpecification": {
"@type": "PriceSpecification",
"minPrice": "6500.00",
"priceCurrency": "USD"
}
}
]
},
"sameAs": [
"https://maps.app.goo.gl/lonestarplumbing-example",
"https://www.yelp.com/biz/lone-star-plumbing-co-austin",
"https://www.facebook.com/lonestarplumbingatx",
"https://www.bbb.org/us/tx/austin/profile/plumber/lone-star-plumbing-co",
"https://nextdoor.com/pages/lone-star-plumbing-co-austin-tx"
]
}
</script>Sample for a plumber — generate your own in the builder or on your business type's page.
Method 2: hosted embed (Pro)
Paste one script once. Hours, holiday closures and services you change in LocalSchema reach the site automatically — no more editing Shopify for every update.
Copy the embed script
In LocalSchema, open the location's Embed tab and copy the script tag.
Paste once in theme.liquid
Same place, before </head>. Holiday hours and new branches are then managed in LocalSchema, not in theme code.
<script src="https://local-schema-beacon.lovable.app/s/loc_yourkey.js" async></script>Your real key is on the location's Embed tab after you publish it.
Common Shopify pitfalls
- Duplicate the theme before editing code so you can roll back.
- Theme updates can replace theme.liquid edits — re-check the markup after switching or updating themes.
- Keep LocalBusiness for the shop location; product markup belongs on product pages.