
Free Local Business Schema Template for Contractors
A fill-in-the-blanks block of code that tells Google and AI search tools who you are, what you do and where you work. Built for the trades. Copy it or download it, no email required.
What Structured Data Is, in Plain English
Your website is written for people. Structured data, also called schema, is a short second copy of your key facts written for machines. Business name, phone, address, hours, the services you sell and the cities you work in.
It lives in your site's code. Customers never see it. It uses a shared vocabulary from schema.org, so a line that says your business is a RoofingContractor means the same thing to every system that reads it.
Think of it as the label on the box. It does not change what is inside. It just removes any guessing about what the box is.
What the code is really saying
This business is a roofing contractor.
This is its exact name, phone number and address.
It works in these cities, during these hours.
These are the services it sells, and here is the page for each one.
These are its official profiles on Google, Yelp, Facebook and Nextdoor.
Why Google and AI Search Tools Read It
Google says in its own documentation that it uses structured data to understand what a page is about. AI tools like ChatGPT, Gemini, Google AI Mode and Perplexity do not publish how they build answers about local businesses, but facts stated clearly and the same way everywhere are easier for anyone to check.
No Room to Misread
A web page can be read a dozen ways. A line that says telephone, followed by your number, can be read one way. That is the whole value.
Backs Up Your Listings
When your site states the same name, address, phone and hours as your Google Business Profile, Yelp and the rest, your facts line up everywhere they get checked.
Points to Your Real Pages
Each service in the template links to its own page on your site, so the code and your content tell the same story about what you do.
None of the AI companies publish exactly how they pick which businesses to name, and anyone who tells you they know the formula is guessing. What we can say is simpler. Complete, consistent facts everywhere leave less room for confusion about who you are than facts that disagree from one site to the next.
What schema will not do
It will not get you recommended on its own. It does not replace a real Google Business Profile, reviews that describe the actual work you did, or pages that answer your customers' questions. It makes the rest of that work easier to read. For the full picture, see AI Search Visibility for Local Service Businesses.
The Contractor Schema Template
Everything in ALL CAPS gets replaced with your real details. The first line is instructions, and it gets deleted before you publish.
{ "@context": "https://schema.org","_instructions": "DELETE THIS _instructions LINE BEFORE YOU PUBLISH. Free contractor schema template from TwentyOne Solutions, full guide at https://twentyonesolutions.com/ai-visibility/schema-template. STEP 1: Replace every ALL CAPS value with your real details. When you finish, search the file for YOUR, XXX and HH:MM and make sure none are left. STEP 2: Change @type on the business node to your trade. Plumbers use Plumber. HVAC companies use HVACBusiness. Roofers use RoofingContractor. Painters use HousePainter. Electricians use Electrician. General contractors and remodelers use GeneralContractor. Landscapers, and any trade without its own type, keep HomeAndConstructionBusiness. STEP 3: name, address and telephone must match your Google Business Profile exactly. If your profile hides your street address, delete the streetAddress line and keep city, state and ZIP. STEP 4: latitude and longitude are plain numbers with no quotes and at least 5 decimal places, for example 33.46660. STEP 5: areaServed gets one City entry per city you really take jobs in. Add or delete entries to fit. STEP 6: Hours use 24 hour time, for example 07:00 and 17:00. Delete the Saturday block if you are closed Saturdays. STEP 7: sameAs lists profiles you own. Delete any line you do not have and add any real profile you do. STEP 8: hasOfferCatalog gets one Offer per service you really sell, each pointing at that service's own page on your site. STEP 9: aggregateRating is optional and is the easiest part to get wrong. Delete the whole block unless the page this code sits on shows those same reviews from real customers and the numbers match exactly. Never copy in your Google star rating and never make numbers up. STEP 10: Paste the finished code inside a script tag with type application/ld+json on your homepage. STEP 11: Test it in Google's Rich Results Test (https://search.google.com/test/rich-results) and the Schema.org validator (https://validator.schema.org) before and after it goes live.", "@graph": [ { "@type": "HomeAndConstructionBusiness", "@id": "https://YOURDOMAIN.COM/#business", "name": "YOUR BUSINESS NAME", "description": "ONE OR TWO PLAIN SENTENCES ON WHAT YOU DO AND THE AREA YOU SERVE", "url": "https://YOURDOMAIN.COM/", "telephone": "+1-XXX-XXX-XXXX", "email": "YOU@YOURDOMAIN.COM", "logo": "https://YOURDOMAIN.COM/YOUR-LOGO-FILE.png", "image": [ "https://YOURDOMAIN.COM/YOUR-REAL-JOB-PHOTO.jpg" ], "address": { "@type": "PostalAddress", "streetAddress": "YOUR STREET ADDRESS", "addressLocality": "YOUR CITY", "addressRegion": "YOUR STATE ABBREVIATION", "postalCode": "YOUR ZIP CODE", "addressCountry": "US" }, "geo": { "@type": "GeoCoordinates", "latitude": "YOUR LATITUDE", "longitude": "YOUR LONGITUDE" }, "areaServed": [ { "@type": "City", "name": "YOUR MAIN CITY, STATE" }, { "@type": "City", "name": "SECOND CITY YOU SERVE, STATE" }, { "@type": "City", "name": "THIRD CITY YOU SERVE, STATE" } ], "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "HH:MM", "closes": "HH:MM" }, { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Saturday"], "opens": "HH:MM", "closes": "HH:MM" } ], "priceRange": "YOUR PRICE RANGE", "sameAs": [ "https://www.google.com/maps?cid=YOUR-GOOGLE-BUSINESS-PROFILE-CID", "https://www.yelp.com/biz/YOUR-YELP-PAGE", "https://www.facebook.com/YOUR-FACEBOOK-PAGE", "https://nextdoor.com/pages/YOUR-NEXTDOOR-PAGE/" ], "hasOfferCatalog": { "@type": "OfferCatalog", "name": "YOUR TRADE SERVICES", "itemListElement": [ { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "YOUR FIRST SERVICE", "description": "ONE SENTENCE ON WHAT THIS SERVICE INCLUDES", "url": "https://YOURDOMAIN.COM/YOUR-FIRST-SERVICE-PAGE/", "provider": { "@id": "https://YOURDOMAIN.COM/#business" } } }, { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "YOUR SECOND SERVICE", "description": "ONE SENTENCE ON WHAT THIS SERVICE INCLUDES", "url": "https://YOURDOMAIN.COM/YOUR-SECOND-SERVICE-PAGE/", "provider": { "@id": "https://YOURDOMAIN.COM/#business" } } }, { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "YOUR THIRD SERVICE", "description": "ONE SENTENCE ON WHAT THIS SERVICE INCLUDES", "url": "https://YOURDOMAIN.COM/YOUR-THIRD-SERVICE-PAGE/", "provider": { "@id": "https://YOURDOMAIN.COM/#business" } } } ] }, "aggregateRating": { "@type": "AggregateRating", "ratingValue": "YOUR AVERAGE RATING FROM REVIEWS SHOWN ON THIS PAGE", "reviewCount": "YOUR NUMBER OF REVIEWS SHOWN ON THIS PAGE", "bestRating": "5", "worstRating": "1" } }, { "@type": "WebSite", "@id": "https://YOURDOMAIN.COM/#website", "url": "https://YOURDOMAIN.COM/", "name": "YOUR BUSINESS NAME", "inLanguage": "en-US", "publisher": { "@id": "https://YOURDOMAIN.COM/#business" } } ]}The code scrolls sideways on small screens. The Download button gets you the same file.
Where to put it
Once it is filled in, wrap it in a script tag like the example and paste it on your homepage. Most website builders and themes have a setting for custom code in the header. That is the spot.
Put it on one page, not every page. If your theme or an SEO plugin already outputs business schema, check what it says first so you do not end up with two versions that disagree.
<script type="application/ld+json">
PASTE YOUR FINISHED TEMPLATE HERE,
WITH THE _instructions LINE DELETED
</script>Pick the Right Business Type for Your Trade
The template ships with HomeAndConstructionBusiness, which is true for every trade. If schema.org has a more specific type for yours, swap it in on the @type line.
| Your trade | Use this @type |
|---|---|
| Plumbers | Plumber |
| HVAC companies | HVACBusiness |
| Roofers | RoofingContractor |
| Painters | HousePainter |
| Electricians | Electrician |
| General contractors and remodelers | GeneralContractor |
| Landscapers, and any trade without its own type | HomeAndConstructionBusiness |
How to Fill It In, Field by Field
Keep your Google Business Profile open in another tab while you work. Most of these answers should be copied straight from it.
_instructionsRead it, then delete the whole line. It only exists because JSON files cannot hold comments.
@typeYour trade. Use the most specific type that is true for you. The table above has the right one.
@id and urlYour real domain with https. The @id is your domain with #business on the end. It is a label that lets the other pieces point back to your business, not a page anyone visits.
nameExactly as it appears on your Google Business Profile. Do not add keywords or a city unless they are truly part of your business name.
descriptionOne or two plain sentences on what you do and where. Write it the way you would say it to a customer.
telephoneThe same number your Google Business Profile shows, starting with +1. If you use a call tracking number on your profile, use that same one here.
emailAn inbox someone actually checks. Delete the line if you do not want an email address public.
logo and imageFull links to your logo and to a real photo of your work, your crew or your truck. Skip stock photos.
addressCharacter for character the same as your Google Business Profile, suite number included. If your profile hides your street address, delete streetAddress and keep city, state and ZIP.
geoLatitude and longitude as plain numbers with no quotes. Right click your location in Google Maps and the coordinates are the first line of the menu. Keep at least 5 decimal places.
areaServedOne City entry per city you really take jobs in. It should match the service areas on your Google Business Profile and the city pages on your site. Do not paste in every town in the state.
openingHoursSpecificationUse 24 hour time, like 07:00 and 17:00, and match your Google hours. Delete the Saturday block if you are closed. If you really answer around the clock, use 00:00 to 23:59.
priceRangeA rough signal like $$ or a real range you quote. Optional. Delete it rather than guess.
sameAsLinks to profiles you own and keep up: Google Business Profile, Yelp, Facebook, Nextdoor, Angi. Delete lines you do not have. For Google, the link with your CID number is the cleanest. If you cannot find it, use the share link from your profile.
hasOfferCatalogOne Offer per service you really sell, each linking to the page on your site about that service. Copy a block to add more. If a service has no page yet, that is worth fixing first.
aggregateRatingOptional, and the easiest block to get wrong. Read the mistakes section below before you keep it. When in doubt, delete it.
WebSiteYour domain and business name again. Leave the structure as it is.
Common Mistakes That Do More Harm Than Good
Bad schema is worse than no schema. These are the ones to avoid.
Fake or borrowed review markup
Making up a rating, copying your Google star rating into the code, or marking up reviews that are not actually shown on the page. Google's review guidelines do not allow it, Google does not show review stars for ratings a business marks up about itself anyway, and spammy structured data can earn a manual action against your site. There is no upside. Delete the block unless it describes real first party reviews visible on that page.
An address or phone that does not match your Google Business Profile
An old address, a missing suite number, a different phone number on the site than on the profile. The whole point of this code is to remove doubt about who you are. Mismatched details add doubt back in. Pull up your profile and copy from it.
The wrong business type
Using plain LocalBusiness or Organization when your trade has its own type, or picking a type that is not what you do. A roofer marked up as a general contractor is telling every system that reads it something slightly wrong.
Placeholder text left in
It happens more than it should. Before you publish, search the code for YOUR, XXX and HH:MM.
Marking up things that are not true or not on your site
Cities you do not really serve, services with no page, hours that differ from your profile. Structured data should describe what a customer can already see and verify. It is not a place to wish list.
Set it and forget it
You move, change your hours, add a service or drop a city. Update your Google Business Profile and this code on the same day so they never drift apart.
Test It Before and After It Goes Live
Two free tools will tell you if the code is broken. Run both. It takes a couple of minutes and catches the typos that make the whole block useless.
Warnings about optional fields you truly do not have are fine to ignore. Errors are not. Fix every error before the code goes on your site.
Google's Rich Results Test
Paste your finished code into the code tab. It shows whether Google can read it and flags errors Google cares about.
Schema.org Validator
Paste the same code. It checks every type and field against the full schema.org vocabulary, including the ones Google does not use.
Test the live page
After you publish, run your homepage address through both tools again. That confirms the code actually made it onto the page and nothing got mangled on the way.
Schema Is One Piece. Here Is the Rest.
Getting named by AI takes a complete Google Business Profile, consistent listings, reviews that describe your real jobs, a website that answers customer questions directly, and mentions on the other sites these tools read.
AI Search Visibility for Local Service Businesses
How the whole system fits together and what we do about it every month.
Read moreHow Local Businesses Show Up in ChatGPT
A plain guide to getting your business into AI search answers.
Read moreAI Visibility Results
Tracked AI answers for real clients, with dates and answer counts.
Read moreGuides by trade
Already have schema and want to go further? Read about llms.txt files and AI search.
Frequently Asked Questions
Rather Have Us Set It Up?
Tell us about your business. We will send your free visibility report and tell you straight what structured data and listings work it would take to get you named.