hasOfferCatalog
hasOfferCatalog · Optional
Appears in
What is it?
hasOfferCatalog links an organization, person, or service to a structured catalog of its available offerings. An OfferCatalog is a list-like object that organizes products or services into named groupings, giving search engines and AI systems a machine-readable inventory of what an entity provides rather than requiring them to infer it from page text.
The field bridges the gap between an organization's identity markup and its actual commercial offerings, allowing both to live in the same structured data graph.
Why this matters for AEO
When someone asks an AI assistant "What services does [company] offer?", the answer engine either scrapes prose from the site or reads structured data. hasOfferCatalog provides a direct, authoritative answer: a named list of services or product categories that the organization itself has declared. This is especially valuable for service businesses where offerings are harder to enumerate from product pages alone. For local businesses and agencies, an offer catalog also helps AI systems match the organization to relevant queries about specific service types, increasing the chances of appearing in answer engine responses for "who provides X service in Y area" queries.
What the specs say
Schema.org:hasOfferCatalog expects an OfferCatalog object. It indicates an OfferCatalog listing for this Organization, Person, or Service. [Source: https://schema.org/hasOfferCatalog]
Google: Not mentioned. This field is not listed in Google's structured data documentation for Organization. [https://developers.google.com/search/docs/appearance/structured-data/organization]
How to find your value
Your offer catalog should reflect the actual service or product categories you sell, grouped the way you describe them to clients. Start with your service menu, pricing page, or brochure. Create one OfferCatalog entry for the top-level catalog, then use nested OfferCatalog items or Offer items inside itemListElement to represent individual services or product lines.
Keep the catalog current. If you add or retire services, update the structured data accordingly.
Format and code
hasOfferCatalog accepts an OfferCatalog object. The OfferCatalog type extends ItemList and uses itemListElement to list its contents. Contents can be OfferCatalog objects (subcategories) or Offer objects (individual items).
Service business with nested categories:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "CleanCo Professional Services",
"url": "https://www.cleancopro.com",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Cleaning Services",
"itemListElement": [
{
"@type": "OfferCatalog",
"name": "Residential Cleaning",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Standard House Cleaning"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Deep Clean"
}
}
]
},
{
"@type": "OfferCatalog",
"name": "Commercial Cleaning",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Office Cleaning"
}
}
]
}
]
}
}
Simpler flat catalog for a consultancy:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Apex Digital Strategy",
"url": "https://www.apexdigital.com",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Digital Marketing Services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "SEO Consulting"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Paid Search Management"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Content Strategy"
}
}
]
}
}
Webflow implementation
Static pages
For organizations with a fixed service menu, embed the JSON-LD in the <head> of your services page or homepage via Page Settings > Custom Code. Update the code when your services change.
CMS template pages
For agencies or marketplaces that manage services as CMS items, you can generate the hasOfferCatalog structure dynamically. Create a CMS Collection for services, then use Webflow's embed element on the page to output a JSON-LD block that iterates over the collection items. This requires custom JavaScript to build the JSON structure from CMS-rendered data on the client side, or a static build step if using a headless approach.
In Schema HQ
The organization schema editor supports hasOfferCatalog as a structured field. Define your catalog name and add individual service entries. Schema HQ publishes the resulting JSON-LD to your Webflow site's custom code section, keeping your offer catalog in sync with your schema markup.
Real examples
The schema.org documentation uses a cleaning services example to illustrate hasOfferCatalog:
{
"@type": "Service",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Cleaning services",
"itemListElement": [
{
"@type": "OfferCatalog",
"name": "House Cleaning"
}
]
}
}
Source: https://schema.org/Service
Related fields
FAQ
Does hasOfferCatalog replace Product or Service markup on individual pages?
No. hasOfferCatalog on an Organization provides a high-level inventory at the entity level. Individual service and product pages should still carry their own Service or Product markup with full detail. The two work together: the organization declares its catalog, and each item in the catalog can point to a dedicated page with complete markup.
How deep should the catalog nesting go?
Two levels (a top-level catalog with subcategories) is sufficient for most organizations. Deeper nesting adds complexity without proportional benefit in how search engines and AI systems parse the structure. Keep it readable and accurate rather than exhaustive.
Can an organization have multiple hasOfferCatalog entries?
Yes. Pass an array of OfferCatalog objects if you serve distinct markets or business units with separate catalogs. Each catalog should have a distinct name value that describes what it covers.