Cuando empecé con Schema.org en mis primeros proyectos, cometí todos los errores que se pueden cometer. Puse 12 tipos de schema en la home “por si acaso”, metí datos inventados para “completar” la información, escondí el JSON-LD en un display:none para que el usuario no lo viera (Google lo penaliza), y até las entidades con strings sueltos en vez de con @id. Tardé meses en entender por qué mis schemas no aparecían en Google y por qué las IAs no me citaban.
En este post te voy a enseñar los 6 schemas que tengo implementados AHORA MISMO en landinowebs.com, el JSON-LD real que puedes copiar, los errores que cometí en el camino, y el validador que uso antes de cada deploy. Es un post práctico, no teórico. Si quieres la guía completa de qué es Schema.org y por qué importa, la Wikipedia y la doc oficial de Schema.org te lo explican mejor que yo. Lo que yo te doy aquí es lo que funciona en 2026 con datos propios.
El setup actual de landinowebs.com
Mi web tiene 6 tipos de schema principales, todos interconectados con @id para que Google los entienda como una red de entidades y no como JSON sueltos. Los pongo en el <head> de cada página con un componente Astro que genera el JSON-LD dinámicamente desde un fichero data/site.ts centralizado. Esto me permite cambiar un dato (mi teléfono, mi dirección, un precio) y que se actualice en toda la web de golpe.
Te los enseño uno por uno, con el JSON-LD real tal cual lo tengo en producción. Puedes copiar y adaptar.
1. Organization (la entidad raíz)
Este es el schema más importante. Define quién soy, dónde estoy, cómo contactarme. Es la “ancla” a la que se conectan los demás schemas vía @id.
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://www.landinowebs.com/#organization",
"name": "Landinowebs",
"legalName": "Daniel Eduardo Sanz Arilla",
"alternateName": "Landinowebs - Daniel Sanz",
"url": "https://www.landinowebs.com",
"logo": {
"@type": "ImageObject",
"url": "https://www.landinowebs.com/icon-512.png",
"width": "512",
"height": "512"
},
"founder": { "@id": "https://www.landinowebs.com/#person" },
"address": {
"@type": "PostalAddress",
"streetAddress": "Avenida Cataluña",
"addressLocality": "Valencia",
"addressRegion": "Comunidad Valenciana",
"postalCode": "46020",
"addressCountry": "ES"
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+34-649-230-522",
"contactType": "customer service",
"availableLanguage": ["Spanish", "English"]
},
"sameAs": [
"https://github.com/landinowebs",
"https://www.linkedin.com/in/landinowebs"
]
}
Lo que aprendí con este schema: usar legalName con mi nombre real (no “Landinowebs SL” porque no constituí SL, soy autónomo). Esto importa porque Google cruza el legalName con el de la factura que emito, y si no coincide, no conecta el Knowledge Graph.
2. Person (yo, como fundador)
Conecta mi nombre con la organización vía worksFor. Esto permite que cuando alguien busca “Daniel Sanz” en Google, mi empresa salga en el Knowledge Panel.
{
"@context": "https://schema.org",
"@type": "Person",
"@id": "https://www.landinowebs.com/#person",
"name": "Daniel Sanz",
"givenName": "Daniel Eduardo",
"familyName": "Sanz Arilla",
"jobTitle": "Ingeniero Informático y desarrollador web freelance",
"url": "https://www.landinowebs.com",
"alumniOf": {
"@type": "CollegeOrUniversity",
"name": "Universitat Politècnica de València",
"sameAs": "https://www.upv.es"
},
"knowsAbout": [
"Astro", "TypeScript", "SEO técnico", "GEO",
"React Native", "Schema.org", "Supabase", "WordPress"
],
"knowsLanguage": ["es-ES", "en-US"],
"worksFor": { "@id": "https://www.landinowebs.com/#organization" }
}
Error que cometí: en la primera versión puse knowsAbout con 30 tecnologías, incluyendo “Microsoft Excel” porque uso Excel a veces. Google interpreta eso como “infla tu perfil”, y me penalizó el Knowledge Graph. Lo dejé en 8 que de verdad uso a diario. La regla es: si no puedes mantener una conversación de 30 minutos sobre esa tecnología, no la pongas.
3. Service (lo que vendo, uno por servicio)
Cada servicio que ofrezco tiene su propio Service schema, conectado a la organización vía provider.
{
"@context": "https://schema.org",
"@type": "Service",
"@id": "https://www.landinowebs.com/#service-web-medida",
"name": "Desarrollo de páginas web a medida",
"description": "Webs corporativas y landing pages a medida desde 350 € con SEO técnico y GEO incluidos",
"serviceType": ["Desarrollo web", "SEO técnico", "GEO"],
"provider": { "@id": "https://www.landinowebs.com/#organization" },
"areaServed": [
{ "@type": "Country", "name": "España" },
{ "@type": "Country", "name": "México" },
{ "@type": "Country", "name": "Argentina" },
{ "@type": "Country", "name": "Chile" },
{ "@type": "Country", "name": "Colombia" }
],
"offers": {
"@type": "Offer",
"priceCurrency": "EUR",
"price": "350",
"priceValidUntil": "2026-12-31",
"url": "https://www.landinowebs.com/services/"
}
}
Lo que aprendí: poner priceValidUntil con fecha real (no “2099-12-31” como hacía antes). Google lo usa para mostrar el precio en SERP, y si la fecha es absurda, lo ignora. Yo lo actualizo cada 6 meses.
4. WebSite (para toda la home)
El WebSite schema con SearchAction es el que activa el sitemap interno de búsqueda en Google (ese buscador que aparece en algunos resultados de Google directamente).
{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": "https://www.landinowebs.com/#website",
"url": "https://www.landinowebs.com",
"name": "Landinowebs",
"inLanguage": ["es-ES", "en-US"],
"publisher": { "@id": "https://www.landinowebs.com/#organization" }
}
Nota: NO puse SearchAction porque mi web no tiene buscador interno (es estática y no lo necesita). Si pones un SearchAction que apunta a un buscador que no existe, Google lo detecta y te baja el ranking. La regla es: Schema describe lo que existe, no lo que te gustaría que existiera.
5. FAQPage (solo donde hay FAQ visible)
El FAQ estructurado es lo que más me cita ChatGPT y Perplexity. Cuando alguien pregunta a una IA “¿cuánto cobra un desarrollador web freelance en España?”, la respuesta suele salir directamente de mi FAQPage.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"@id": "https://www.landinowebs.com/#faq",
"mainEntity": [
{
"@type": "Question",
"name": "¿Cuánto cuesta una web en España en 2026?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Una landing page hecha a medida cuesta desde 350 €, una web corporativa desde 450 € y una web a medida completa desde 600 €. Todos los precios incluyen SEO técnico y GEO. Los plazos van de 3-7 días para landings a 2-4 semanas para webs a medida."
}
},
{
"@type": "Question",
"name": "¿Qué incluye el precio de una web?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Diseño a medida desde cero (sin plantilla), dominio configurado, SEO técnico completo (Schema.org, llms.txt, sitemap, hreflang, Open Graph), GEO para que las IAs te recomienden, Core Web Vitals 95+, responsive perfecto, 15 días de cambios pequeños y código entregable."
}
},
{
"@type": "Question",
"name": "¿Trabajas con clientes fuera de España?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sí, trabajo en remoto con clientes de España, México, Argentina, Chile, Colombia y otros países. Acepto pagos en EUR, USD, MXN, ARS, CLP y COP. La comunicación es en español o inglés."
}
}
]
}
Truco: el text de cada respuesta es lo que la IA copia literal. Por eso lo escribo como si fuera la respuesta directa a la pregunta, no como un párrafo corporativo. Cuando la IA cita, cita el text tal cual.
6. BreadcrumbList (en cada página que no sea la home)
Este schema es el que hace que Google muestre la ruta de navegación en el resultado de búsqueda (Inicio > Blog > Schema.org). Mejora el CTR entre un 5-15% según el sector.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Inicio",
"item": "https://www.landinowebs.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://www.landinowebs.com/blog/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Schema.org en la práctica",
"item": "https://www.landinowebs.com/blog/schema-org-para-webs-de-negocio/"
}
]
}
Los 6 errores que cometí (para que tú no caigas)
A lo largo de 2 años tocando Schema.org, estos son los errores que me costaron rankings y citabilidad. Te los cuento para que no pierdas tú el mismo tiempo.
Error 1: Schema oculto en display:none. Mi primer cliente me pidió “esconder el JSON-LD para que el usuario no lo viera”. Le dije que sí (error). Google lo detectó en 3 semanas y nos bajó el ranking. Solución: el JSON-LD va en <script type="application/ld+json"> que el navegador no renderiza, así que no hay que esconderlo. Esa es la forma correcta.
Error 2: Schema con datos inventados. Puse aggregateRating: 4.8 en un proyecto antes de tener reviews. Google me penalizó y tardé 4 meses en recuperarme. Solución: si no tienes datos reales, no pongas el campo. Mejor un schema incompleto que un schema falso.
Error 3: Schema en página noindex. Tenía un schema LocalBusiness en la página de “Política de privacidad” (que estaba noindex). Totalmente inútil. Google ni lo mira en páginas que no quiere indexar. Solución: schema solo en páginas indexables.
Error 4: Entidades sin @id propio. Mi primer schema tenía 3 entidades conectadas con strings: "provider": "Landinowebs" en vez de "provider": { "@id": "https://.../#organization" }. Google no podía seguir la conexión. Solución: cada entidad tiene su @id único, y las relaciones se hacen con { "@id": "..." }.
Error 5: Schema que dice una cosa y la web otra. Un cliente tenía el schema diciendo “Servicio en Madrid” pero la web no mencionaba Madrid en ningún sitio. Google lo detectó como manipulación y le bajó el ranking. Solución: el schema describe lo que el usuario ve en la web, no lo que me gustaría que la web fuera.
Error 6: No validar antes de desplegar. Metí un schema con un error de sintaxis (una coma de más) y tardé 6 semanas en darme cuenta. Solución: ahora valido con Google Rich Results Test y Schema Markup Validator antes de cada deploy. Tarda 30 segundos y ahorra meses.
Cómo valido mis schemas antes de cada deploy
Después de los errores, ahora tengo un proceso fijo:
- Antes de hacer commit: abro el JSON-LD localmente y lo paso por el Schema Markup Validator para detectar errores de sintaxis. Es instantáneo.
- Después del deploy: voy al Google Rich Results Test, pego la URL en producción, y compruebo que Google detecta todos los schemas como “eligible for rich results”.
- Una vez al mes: entro en Google Search Console > Mejoras y reviso si hay nuevos warnings. Si los hay, los arreglo en el siguiente sprint.
Este proceso me ha ahorrado como 4-5 penalizaciones en los últimos 2 años. Vale la pena.
Cómo lo implemento técnicamente (en Astro)
Como sé que algunos me vais a preguntar, esto es lo que hago en Astro para no duplicar el JSON-LD en cada página:
// src/components/SEO.astro
---
import siteData from '../data/site';
const { title, description, pathname, schemaType = 'WebPage' } = Astro.props;
const baseSchema = {
"@context": "https://schema.org",
"@type": schemaType,
// ... resto del schema base
};
const fullSchema = [baseSchema, ...Astro.props.extraSchemas];
---
<script type="application/ld+json" set:html={JSON.stringify(fullSchema)} />
Y en cada página importo SEO.astro y le paso los schemas específicos:
---
import SEO from '../components/SEO.astro';
const faqSchema = { /* FAQPage schema */ };
---
<SEO
title="Schema.org en la práctica"
description="Lo que tengo en mi web"
schemaType="Article"
extraSchemas={[faqSchema, breadcrumbSchema]}
/>
Si te interesa cómo lo hago en WordPress o Webflow, escríbeme y te paso el equivalente.
Cómo empezar en tu web (orden de prioridad)
Si acabas de empezar con Schema.org, este es el orden que recomiendo para no perderte:
- Primero: implementa
Organization+Person(si eres freelance) en TODAS las páginas. Es la base. Te lleva 30 minutos. - Segundo: implementa
BreadcrumbListen cada página que no sea home. 1 hora. - Tercero: implementa
WebSiteen la home con tuOrganizationconectada. 15 minutos. - Cuarto: si tienes FAQ visible en alguna página, añade
FAQPageahí. 30 minutos. - Quinto: implementa
Service(uno por servicio) en tu página de servicios. 1 hora. - Sexto: si tienes reseñas reales,
ReviewoAggregateRating. Solo si las tienes de verdad. - Séptimo:
LocalBusinesssolo si tienes sede física. NO lo pongas si eres 100% online.
Total: una tarde de trabajo para tener un setup decente. Y valida cada paso con Schema Markup Validator antes de seguir al siguiente.
Si quieres que te ayude a implementarlo en tu web, escríbeme a landinowebs@gmail.com y lo hacemos juntos. Si la web la hacemos nosotros, esto viene incluido de base, no tienes que pagarlo aparte.