Guides
Advanced schema markup in Webflow
Schema markup examples for Webflow: local business, person, BlogPosting, FAQ and breadcrumbs, so search engines and AI assistants understand your content.

4 min readKey takeawaysThe main points and every section to jump to.Show or hide the summary
- 01
Local business markup puts address, opening hours and contact details into a form machines understand.
- 02
Person markup describes owners, authors and experts, with their role and profiles.
- 03
BlogPosting markup on the CMS template fills title, author and dates from your collection fields.
- 04
FAQ markup helps machines read your answers, even though Google now rarely shows FAQ rich results.
- 05
Test every markup in Google’s Rich Results Test before you publish.
Structured data is a small block of code that describes your page in a vocabulary search engines and AI assistants understand. On Webflow websites, I write it as JSON-LD and put it into the custom code of a page, the CMS template or the project settings. Replace the values in curly braces with your own.
Local business
For restaurants, workshops, practices and other local companies, a local business markup puts address, opening hours and contact details into the page. Use the most specific type that fits, for example Restaurant, Dentist or AutoRepair, instead of the generic LocalBusiness.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "{{Restaurant name}}",
"description": "{{One-sentence description}}",
"image": ["{{Image URL 1x1}}", "{{Image URL 4x3}}", "{{Image URL 16x9}}"],
"url": "{{Website URL}}",
"telephone": "{{Phone number}}",
"servesCuisine": "{{Cuisine, e.g. Italian}}",
"priceRange": "{{e.g. €€}}",
"address": {
"@type": "PostalAddress",
"streetAddress": "{{Street and number}}",
"postalCode": "{{Postal code}}",
"addressLocality": "{{City}}",
"addressCountry": "{{Country code, e.g. DE}}"
},
"geo": { "@type": "GeoCoordinates", "latitude": {{Latitude}}, "longitude": {{Longitude}} },
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "11:00", "closes": "22:00" },
{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Saturday", "Sunday"], "opens": "12:00", "closes": "23:00" }
],
"menu": "{{Menu URL}}",
"acceptsReservations": true,
"sameAs": ["{{Google Business Profile URL}}", "{{Instagram URL}}"]
}
</script>
The sameAs link to your Google Business Profile helps search engines and AI systems connect the website and the reviews to the same business. Only mark up reviews that appear on the page itself.
Person
Person markup describes owners, authors and experts: their role, the company they work for and their profiles. It belongs on the about page and, in short form, on the homepage of a freelancer or consultant.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "{{Full name}}",
"jobTitle": "{{Job title, e.g. Web developer}}",
"url": "{{About page URL}}",
"image": "{{Portrait URL}}",
"description": "{{Short bio}}",
"worksFor": { "@type": "Organization", "name": "{{Company}}", "url": "{{Company URL}}" },
"address": { "@type": "PostalAddress", "addressLocality": "{{City}}", "addressCountry": "{{Country code}}" },
"knowsAbout": ["{{Topic 1}}", "{{Topic 2}}", "{{Topic 3}}"],
"sameAs": ["{{LinkedIn URL}}", "{{YouTube URL}}"]
}
</script>
BlogPosting on the CMS template
On a blog, the markup goes into the custom code of the collection template. Webflow lets you insert collection fields there, so every post fills in its own title, image and dates. Use the field picker in the code editor to insert the fields instead of typing their names.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "{{Name field}}",
"description": "{{Summary field}}",
"image": "{{Main image field}}",
"datePublished": "{{Published date field, ISO format}}",
"dateModified": "{{Updated date field, ISO format}}",
"author": { "@type": "Person", "name": "{{Author name}}", "url": "{{Author page URL}}" },
"mainEntityOfPage": "https://www.example.com/blog/{{Slug field}}"
}
</script>
In the date field settings, choose a format that outputs the ISO date, for example 2026-10-30. Rich text bodies don’t belong in the markup. Search engines read the content from the page.
FAQ
FAQ markup lists questions and answers that are visible on the page. Since August 2023, Google only shows FAQ rich results for a small number of well-known government and health websites. The markup still helps machines, including AI assistants, read your answers, so I keep it on pages with real FAQs.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "{{Question 1}}",
"acceptedAnswer": { "@type": "Answer", "text": "{{Answer 1}}" }
},
{
"@type": "Question",
"name": "{{Question 2}}",
"acceptedAnswer": { "@type": "Answer", "text": "{{Answer 2}}" }
}
]
}
</script>
On blog posts with a varying number of questions, I keep the FAQs in a multi-reference field and build the markup from it, or I add itemscope and itemprop attributes to the FAQ accordion in the Designer: itemtype="https://schema.org/FAQPage" on the section, itemprop="mainEntity" with itemtype="https://schema.org/Question" on each item, itemprop="name" on the question and itemprop="acceptedAnswer" with itemtype="https://schema.org/Answer" plus itemprop="text" on the answer.
Breadcrumbs
Breadcrumbs show where a page sits in your site structure, and Google often uses them in place of the URL in search results.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.example.com/" },
{ "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://www.example.com/blog" },
{ "@type": "ListItem", "position": 3, "name": "{{Name field}}" }
]
}
</script>
Test before you publish
Paste the URL of your staging site or the code into Google’s Rich Results Test or the Schema Markup Validator. Fix every error and every missing required field before you publish.
More on the basics in my Webflow SEO checklist. If you want structured data that also prepares your website for ChatGPT and Perplexity, see AI visibility.
Questions
For static pages, in the page settings under custom code, inside the head. For CMS collection pages, in the custom code of the collection template, where you can insert collection fields. Site-wide markup such as your organization goes into the head code of the project settings.
JSON-LD. Google recommends it, it keeps the markup separate from your layout, and you can change it without touching elements in the Designer.
Since August 2023, Google only shows them for a small number of well-known government and health websites. FAQ markup still helps machines, including AI assistants, read your questions and answers, so I keep it on pages with real FAQs.
Paste the URL or code into Google’s Rich Results Test or the Schema Markup Validator on schema.org. Both show errors and missing required fields.
