zark-seo 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +186 -0
- package/package.json +35 -0
- package/templates/README.md +537 -0
- package/templates/citations-builder-br-SKILL.md +594 -0
- package/templates/competitor-gap-analyzer-SKILL.md +505 -0
- package/templates/core-web-vitals-fixer-SKILL.md +582 -0
- package/templates/gbp-optimizer-SKILL.md +560 -0
- package/templates/geo-llm-optimizer-SKILL.md +631 -0
- package/templates/meta-tags-optimizer-SKILL.md +563 -0
- package/templates/review-acquisition-engine-SKILL.md +663 -0
- package/templates/schema-jsonld-builder-SKILL.md +663 -0
- package/templates/seo-content-writer-br-SKILL.md +639 -0
- package/templates/seo-local-auditor-SKILL.md +420 -0
- package/templates/seo-orchestrator-SKILL.md +574 -0
- package/templates/service-area-page-builder-SKILL.md +517 -0
- package/templates/topical-authority-architect-SKILL.md +587 -0
|
@@ -0,0 +1,663 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: schema-jsonld-builder
|
|
3
|
+
description: Gera Schema.org em formato JSON-LD pronto para colar no `<head>` de qualquer site, com o tipo mais específico disponível para o nicho do negócio brasileiro. Use SEMPRE que o usuário pedir para "criar schema", "gerar JSON-LD", "adicionar dados estruturados", "marcar página com schema", "rich snippets", "rich results", "marcação para Google", "schema markup", "structured data", ou quando estiver criando/editando um site e for necessário implementar schema. Acionar também durante criação de novas páginas (serviço, produto, FAQ, blog post) para gerar o schema apropriado para aquela página específica. Domina LocalBusiness e seus 60+ subtipos, Service, Product, Organization, Person, FAQPage, Article, BreadcrumbList, HowTo, Review, AggregateRating, Event, Recipe, Course, e como compor múltiplos schemas em uma mesma página com @id correto.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Schema JSON-LD Builder — Padrão ZARK
|
|
7
|
+
|
|
8
|
+
Skill especialista em gerar Schema.org em formato JSON-LD para o mercado brasileiro. Produz schema correto, completo, validável e pronto para colar.
|
|
9
|
+
|
|
10
|
+
## Princípios fundamentais
|
|
11
|
+
|
|
12
|
+
**Schema NÃO é fator de ranking direto.** Isso é importante deixar claro no início de qualquer entrega. O que schema faz:
|
|
13
|
+
|
|
14
|
+
1. **Elegibilidade para rich results** — estrelas de avaliação, FAQ expandido, breadcrumbs no SERP, horário de funcionamento, preço, disponibilidade
|
|
15
|
+
2. **Alimentação do Knowledge Graph** — Google constrói entidades a partir de schema bem estruturado
|
|
16
|
+
3. **Contexto para LLMs** — ChatGPT, Claude, Perplexity usam schema para entender entidades e citar a empresa em respostas
|
|
17
|
+
4. **Disambiguação** — diferencia "ZARK empresa de tecnologia em Contagem" de outras possíveis "ZARK"
|
|
18
|
+
|
|
19
|
+
**Princípios não-negociáveis:**
|
|
20
|
+
|
|
21
|
+
1. **Tipo mais específico, sempre.** `LocalBusiness` é fallback, não escolha primária. Existe `Plumber`, `Dentist`, `BeautySalon`, `AutoRepair` — use.
|
|
22
|
+
2. **Aninhamento profundo.** Entidades dentro de entidades. `address` é objeto `PostalAddress`, não string. `geo` é `GeoCoordinates`. `openingHoursSpecification` é array de objetos.
|
|
23
|
+
3. **`@id` conecta entidades.** Sempre defina `@id` (URL-fragment como `https://site.com/#business`) para que o Google entenda quando entidades são a mesma.
|
|
24
|
+
4. **`sameAs` para autoridade.** Aponte para perfis externos verificáveis (Instagram, Facebook, LinkedIn, Wikipedia, Wikidata).
|
|
25
|
+
5. **Sem invenção.** Não preencha campo cujo dado real você não tem. Se não sabe `aggregateRating`, omita — não chute "4.8 com 50 reviews".
|
|
26
|
+
6. **Português onde aplicável.** `name`, `description` em PT-BR. Mas valores normalizados (`@type`, `dayOfWeek`, formato de hora ISO) ficam em padrão schema.org.
|
|
27
|
+
|
|
28
|
+
## Fluxo de execução
|
|
29
|
+
|
|
30
|
+
### Etapa 1 — Coleta de dados
|
|
31
|
+
|
|
32
|
+
Antes de gerar qualquer schema, levante:
|
|
33
|
+
|
|
34
|
+
**Sempre necessário:**
|
|
35
|
+
- Tipo de negócio / nicho específico
|
|
36
|
+
- Nome legal (razão social) e nome fantasia
|
|
37
|
+
- URL principal do site
|
|
38
|
+
- Endereço completo (rua, número, bairro, cidade, UF, CEP)
|
|
39
|
+
- Telefone (com DDD)
|
|
40
|
+
- E-mail comercial
|
|
41
|
+
- Horário de funcionamento (todos os dias)
|
|
42
|
+
- Logo (URL acessível)
|
|
43
|
+
- Imagem principal/fachada (URL acessível)
|
|
44
|
+
- Cidades atendidas (`areaServed`)
|
|
45
|
+
- Faixa de preço aproximada (`$` a `$$$$`)
|
|
46
|
+
- CNPJ (vai em `taxID`)
|
|
47
|
+
- Data de fundação (vai em `foundingDate`)
|
|
48
|
+
|
|
49
|
+
**Quando aplicável:**
|
|
50
|
+
- Redes sociais ativas (Instagram, Facebook, LinkedIn, YouTube, TikTok)
|
|
51
|
+
- Marcas que distribui/representa
|
|
52
|
+
- Lista de serviços/produtos principais
|
|
53
|
+
- Aceita CPF/CNPJ?
|
|
54
|
+
- Formas de pagamento aceitas
|
|
55
|
+
- Estacionamento, acessibilidade, Wi-Fi
|
|
56
|
+
- Especialidades médicas, OAB, CRM, CRO (profissões regulamentadas)
|
|
57
|
+
|
|
58
|
+
Se o usuário não tem essas informações à mão, **peça antes de gerar**. Schema com 70% dos campos vazios é inútil.
|
|
59
|
+
|
|
60
|
+
### Etapa 2 — Identificação do tipo
|
|
61
|
+
|
|
62
|
+
Use a tabela canônica de mapeamento por nicho (ver seção **Catálogo de Tipos**). Sempre prefira o tipo mais específico. Se múltiplos tipos se encaixam, use array: `"@type": ["Store", "LocalBusiness"]`.
|
|
63
|
+
|
|
64
|
+
### Etapa 3 — Identificação dos schemas por página
|
|
65
|
+
|
|
66
|
+
Cada tipo de página tem seu schema apropriado. Pode ter múltiplos:
|
|
67
|
+
|
|
68
|
+
| Tipo de página | Schemas recomendados |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Home institucional | `LocalBusiness` (ou subtipo) + `Organization` + `WebSite` |
|
|
71
|
+
| Sobre | `Organization` + `Person` (fundadores/equipe) |
|
|
72
|
+
| Página de serviço | `Service` + `LocalBusiness` (ou subtipo) + `BreadcrumbList` |
|
|
73
|
+
| Página de produto | `Product` + `Offer` + `AggregateRating` (se houver) + `BreadcrumbList` |
|
|
74
|
+
| Página de cidade atendida | `Service` com `areaServed` específico + `BreadcrumbList` |
|
|
75
|
+
| FAQ | `FAQPage` |
|
|
76
|
+
| Blog post | `Article` (ou `BlogPosting`) + `Person` (autor) + `BreadcrumbList` |
|
|
77
|
+
| Contato | `LocalBusiness` (ou subtipo) com dados expandidos |
|
|
78
|
+
| Receita (food blog) | `Recipe` |
|
|
79
|
+
| Tutorial passo-a-passo | `HowTo` |
|
|
80
|
+
| Página de evento | `Event` |
|
|
81
|
+
| Curso/aula | `Course` |
|
|
82
|
+
| Página de avaliações | `Review` + `AggregateRating` |
|
|
83
|
+
| Vídeo | `VideoObject` |
|
|
84
|
+
|
|
85
|
+
### Etapa 4 — Geração
|
|
86
|
+
|
|
87
|
+
Produza o JSON-LD seguindo os princípios. Sempre:
|
|
88
|
+
|
|
89
|
+
- Indentação consistente (2 espaços)
|
|
90
|
+
- Aninhar `address`, `geo`, `openingHoursSpecification`, `contactPoint` como objetos
|
|
91
|
+
- Usar `@id` para conectar entidades cross-page
|
|
92
|
+
- Validar mentalmente: cada campo tem valor real? `@type` está correto? URLs absolutas?
|
|
93
|
+
|
|
94
|
+
### Etapa 5 — Entrega + instruções de implementação
|
|
95
|
+
|
|
96
|
+
Junto com o JSON-LD, sempre entregue:
|
|
97
|
+
|
|
98
|
+
1. **Onde colar:** dentro da tag `<head>`, antes de `</head>`
|
|
99
|
+
2. **Como colar no WordPress + Elementor:** Plugin como WPCode, Insert Headers and Footers, ou via tema (`functions.php` com hook `wp_head`)
|
|
100
|
+
3. **Como colar no WordPress + tema customizado:** editar `header.php` ou hook
|
|
101
|
+
4. **Validação:** rodar em [Google Rich Results Test](https://search.google.com/test/rich-results) e [Schema.org Validator](https://validator.schema.org/)
|
|
102
|
+
5. **Aviso sobre tempo de indexação:** Google leva de dias a semanas para reprocessar schema novo
|
|
103
|
+
|
|
104
|
+
## Catálogo de Tipos por Nicho (mapa canônico BR)
|
|
105
|
+
|
|
106
|
+
Use o tipo mais específico. Quando não existir tipo dedicado, use `LocalBusiness` + `additionalType` apontando para Wikipedia/Wikidata + descrição rica.
|
|
107
|
+
|
|
108
|
+
### Saúde
|
|
109
|
+
- Clínica médica geral → `MedicalClinic` (subtipo de `MedicalBusiness`)
|
|
110
|
+
- Hospital → `Hospital`
|
|
111
|
+
- Dentista → `Dentist`
|
|
112
|
+
- Fisioterapeuta → `Physiotherapy`
|
|
113
|
+
- Médico individual (consultório) → `Physician`
|
|
114
|
+
- Psicólogo → `Psychiatrist` (mais próximo) ou `MedicalBusiness` + `additionalType`
|
|
115
|
+
- Pediatra/cardiologista/etc. → `Physician` + `medicalSpecialty` (`Pediatric`, `Cardiovascular`, etc.)
|
|
116
|
+
- Veterinário → `VeterinaryCare`
|
|
117
|
+
- Farmácia → `Pharmacy`
|
|
118
|
+
- Ótica → `Optician`
|
|
119
|
+
|
|
120
|
+
### Beleza & Estética
|
|
121
|
+
- Salão geral → `BeautySalon`
|
|
122
|
+
- Cabeleireiro → `HairSalon`
|
|
123
|
+
- Manicure/Nail studio → `NailSalon`
|
|
124
|
+
- Spa/dia → `DaySpa`
|
|
125
|
+
- Barbearia → `HairSalon` + `additionalType: "https://en.wikipedia.org/wiki/Barber"` (não há tipo nativo)
|
|
126
|
+
- Studio de cílios/sobrancelha → `BeautySalon` + descrição específica
|
|
127
|
+
- Tatuador → `LocalBusiness` + `additionalType` apontando para Wikipedia "Tattoo studio"
|
|
128
|
+
|
|
129
|
+
### Automotivo
|
|
130
|
+
- Oficina mecânica → `AutoRepair`
|
|
131
|
+
- Concessionária → `AutoDealer`
|
|
132
|
+
- Funilaria → `AutoBodyShop`
|
|
133
|
+
- Posto de combustível → `GasStation`
|
|
134
|
+
- Lava-jato/estética automotiva → `AutoWash`
|
|
135
|
+
- Borracharia/loja de pneus → `TireShop`
|
|
136
|
+
- Auto peças → `AutoPartsStore`
|
|
137
|
+
- Locadora de veículos → `AutoRental`
|
|
138
|
+
- Despachante → `LocalBusiness` + descrição
|
|
139
|
+
- Proteção veicular/seguro → `InsuranceAgency` (proteção é tecnicamente associação mútua, mas Google trata similar)
|
|
140
|
+
|
|
141
|
+
### Casa, Construção & Reparos
|
|
142
|
+
- Encanador/desentupidora → `Plumber`
|
|
143
|
+
- Eletricista → `Electrician`
|
|
144
|
+
- Telhadista → `RoofingContractor`
|
|
145
|
+
- Climatização (ar-condicionado) → `HVACBusiness`
|
|
146
|
+
- Chaveiro → `Locksmith`
|
|
147
|
+
- Pintor → `HousePainter`
|
|
148
|
+
- Marmorista → `LocalBusiness` + descrição (sem tipo nativo)
|
|
149
|
+
- Jardinagem/paisagismo → `LocalBusiness` + descrição
|
|
150
|
+
- Mudanças → `MovingCompany`
|
|
151
|
+
- Dedetizadora → `LocalBusiness` + `additionalType: "https://en.wikipedia.org/wiki/Pest_control"`
|
|
152
|
+
- Vidraçaria → `LocalBusiness` + descrição
|
|
153
|
+
- Limpeza profissional/terceirizada → `LocalBusiness` + descrição
|
|
154
|
+
- Locadora de equipamentos → `Store` + `OfferCatalog` com Services de aluguel
|
|
155
|
+
|
|
156
|
+
### Comércio & Lojas
|
|
157
|
+
- Loja genérica → `Store`
|
|
158
|
+
- Roupas → `ClothingStore`
|
|
159
|
+
- Calçados → `ShoeStore`
|
|
160
|
+
- Joias → `JewelryStore`
|
|
161
|
+
- Livraria → `BookStore`
|
|
162
|
+
- Móveis → `FurnitureStore`
|
|
163
|
+
- Eletrônicos → `ElectronicsStore`
|
|
164
|
+
- Brinquedos → `ToyStore`
|
|
165
|
+
- Floricultura → `Florist`
|
|
166
|
+
- Loja de departamento → `DepartmentStore`
|
|
167
|
+
- Mercearia/empório → `GroceryStore`
|
|
168
|
+
- Padaria → `BakeryShop` (ou `Bakery`)
|
|
169
|
+
- Açougue → `Butcher` (não-padrão; use `Store` + descrição)
|
|
170
|
+
- Hortifruti → `GroceryStore` + descrição
|
|
171
|
+
- Materiais de construção → `HardwareStore`
|
|
172
|
+
- Pet shop → `PetStore`
|
|
173
|
+
|
|
174
|
+
### Alimentação
|
|
175
|
+
- Restaurante → `Restaurant`
|
|
176
|
+
- Bar/pub → `BarOrPub`
|
|
177
|
+
- Café → `CafeOrCoffeeShop`
|
|
178
|
+
- Fast food → `FastFoodRestaurant`
|
|
179
|
+
- Pizzaria → `Restaurant` + `servesCuisine: "Italian"` ou `"Pizza"`
|
|
180
|
+
- Hamburgueria → `FastFoodRestaurant` + `servesCuisine: "American"`
|
|
181
|
+
- Sorveteria → `IceCreamShop`
|
|
182
|
+
- Confeitaria → `BakeryShop` + descrição
|
|
183
|
+
- Food truck → `FoodEstablishment` + descrição
|
|
184
|
+
|
|
185
|
+
### Hospedagem & Turismo
|
|
186
|
+
- Hotel → `Hotel`
|
|
187
|
+
- Pousada/B&B → `BedAndBreakfast`
|
|
188
|
+
- Resort → `Resort`
|
|
189
|
+
- Hostel → `Hostel`
|
|
190
|
+
- Camping → `Campground`
|
|
191
|
+
- Agência de viagens → `TravelAgency`
|
|
192
|
+
|
|
193
|
+
### Educação
|
|
194
|
+
- Escola → `School`
|
|
195
|
+
- Faculdade → `CollegeOrUniversity`
|
|
196
|
+
- Curso → `EducationalOrganization` + `Course` para cada curso
|
|
197
|
+
- Pré-escola → `Preschool`
|
|
198
|
+
- Idiomas → `LanguageSchool` (não-padrão; use `EducationalOrganization`)
|
|
199
|
+
|
|
200
|
+
### Profissionais Liberais
|
|
201
|
+
- Advogado/escritório → `LegalService` (geralmente preferível a `Attorney`)
|
|
202
|
+
- Contador → `AccountingService`
|
|
203
|
+
- Consultoria empresarial → `ProfessionalService`
|
|
204
|
+
- Arquiteto → `LocalBusiness` + descrição (não há `Architect` em schema.org)
|
|
205
|
+
- Engenheiro → `LocalBusiness` + descrição
|
|
206
|
+
- Designer/agência criativa → `ProfessionalService`
|
|
207
|
+
- Coach → `LocalBusiness` + descrição
|
|
208
|
+
- Tradutor/intérprete → `ProfessionalService`
|
|
209
|
+
|
|
210
|
+
### Tecnologia & Mídia
|
|
211
|
+
- Agência de marketing → `Organization` + `additionalType` "MarketingAgency"
|
|
212
|
+
- Empresa de TI/software → `Organization` (raramente local)
|
|
213
|
+
- Estúdio fotográfico → `LocalBusiness` + descrição
|
|
214
|
+
- Estúdio de gravação → `LocalBusiness` + descrição
|
|
215
|
+
- Produtora audiovisual → `Organization`
|
|
216
|
+
|
|
217
|
+
### Imobiliário & Financeiro
|
|
218
|
+
- Imobiliária → `RealEstateAgent`
|
|
219
|
+
- Corretor individual → `RealEstateAgent`
|
|
220
|
+
- Banco/agência → `BankOrCreditUnion`
|
|
221
|
+
- Casa de câmbio → `LocalBusiness` + descrição
|
|
222
|
+
- Corretora de seguros → `InsuranceAgency`
|
|
223
|
+
- Financeira → `FinancialService`
|
|
224
|
+
- Administradora de condomínios → `LocalBusiness` + descrição
|
|
225
|
+
|
|
226
|
+
### Esporte & Fitness
|
|
227
|
+
- Academia → `ExerciseGym`
|
|
228
|
+
- Estúdio de Pilates/Yoga/Crossfit → `SportsActivityLocation`
|
|
229
|
+
- Clube esportivo → `SportsClub`
|
|
230
|
+
- Personal trainer → `LocalBusiness` + descrição
|
|
231
|
+
|
|
232
|
+
### Eventos & Entretenimento
|
|
233
|
+
- Buffet/casa de festas → `EventVenue`
|
|
234
|
+
- DJ/banda → `MusicGroup` ou `LocalBusiness`
|
|
235
|
+
- Cinema → `MovieTheater`
|
|
236
|
+
- Teatro → `PerformingArtsTheater`
|
|
237
|
+
- Casa noturna → `NightClub`
|
|
238
|
+
|
|
239
|
+
### Segurança
|
|
240
|
+
- Empresa de segurança eletrônica/CFTV → `SecuritySystemInstaller` (subtipo de `HomeAndConstructionBusiness`)
|
|
241
|
+
- Vigilância patrimonial → `LocalBusiness` + descrição
|
|
242
|
+
|
|
243
|
+
## Templates canônicos (esqueletos prontos)
|
|
244
|
+
|
|
245
|
+
### Template 1: LocalBusiness completo (genérico, adaptar tipo)
|
|
246
|
+
|
|
247
|
+
```json
|
|
248
|
+
{
|
|
249
|
+
"@context": "https://schema.org",
|
|
250
|
+
"@type": ["TIPO_ESPECIFICO", "LocalBusiness"],
|
|
251
|
+
"@id": "https://DOMINIO.com.br/#business",
|
|
252
|
+
"name": "NOME FANTASIA",
|
|
253
|
+
"alternateName": "VARIACAO_DO_NOME",
|
|
254
|
+
"legalName": "RAZAO_SOCIAL",
|
|
255
|
+
"url": "https://DOMINIO.com.br/",
|
|
256
|
+
"logo": "https://DOMINIO.com.br/logo.png",
|
|
257
|
+
"image": "https://DOMINIO.com.br/fachada.jpg",
|
|
258
|
+
"description": "DESCRICAO_RICA_150_CHARS_COM_KEYWORD_NATURAL",
|
|
259
|
+
"telephone": "+55-DD-NNNNN-NNNN",
|
|
260
|
+
"email": "contato@DOMINIO.com.br",
|
|
261
|
+
"priceRange": "$$",
|
|
262
|
+
"currenciesAccepted": "BRL",
|
|
263
|
+
"paymentAccepted": "PIX, Cartão de Crédito, Cartão de Débito, Dinheiro",
|
|
264
|
+
"taxID": "XX.XXX.XXX/XXXX-XX",
|
|
265
|
+
"foundingDate": "AAAA-MM-DD",
|
|
266
|
+
"address": {
|
|
267
|
+
"@type": "PostalAddress",
|
|
268
|
+
"streetAddress": "RUA E NUMERO",
|
|
269
|
+
"addressLocality": "CIDADE",
|
|
270
|
+
"addressRegion": "UF",
|
|
271
|
+
"postalCode": "XXXXX-XXX",
|
|
272
|
+
"addressCountry": "BR"
|
|
273
|
+
},
|
|
274
|
+
"geo": {
|
|
275
|
+
"@type": "GeoCoordinates",
|
|
276
|
+
"latitude": -XX.XXXXXX,
|
|
277
|
+
"longitude": -XX.XXXXXX
|
|
278
|
+
},
|
|
279
|
+
"areaServed": [
|
|
280
|
+
{"@type": "City", "name": "Cidade1"},
|
|
281
|
+
{"@type": "City", "name": "Cidade2"}
|
|
282
|
+
],
|
|
283
|
+
"openingHoursSpecification": [
|
|
284
|
+
{
|
|
285
|
+
"@type": "OpeningHoursSpecification",
|
|
286
|
+
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
|
287
|
+
"opens": "08:00",
|
|
288
|
+
"closes": "18:00"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"@type": "OpeningHoursSpecification",
|
|
292
|
+
"dayOfWeek": "Saturday",
|
|
293
|
+
"opens": "08:00",
|
|
294
|
+
"closes": "12:00"
|
|
295
|
+
}
|
|
296
|
+
],
|
|
297
|
+
"sameAs": [
|
|
298
|
+
"https://instagram.com/PERFIL",
|
|
299
|
+
"https://facebook.com/PERFIL",
|
|
300
|
+
"https://linkedin.com/company/PERFIL"
|
|
301
|
+
]
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Template 2: Service (uma página de serviço específico)
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"@context": "https://schema.org",
|
|
310
|
+
"@type": "Service",
|
|
311
|
+
"@id": "https://DOMINIO.com.br/servicos/SLUG/#service",
|
|
312
|
+
"name": "NOME DO SERVIÇO",
|
|
313
|
+
"description": "DESCRICAO_RICA_DO_SERVICO",
|
|
314
|
+
"provider": {
|
|
315
|
+
"@id": "https://DOMINIO.com.br/#business"
|
|
316
|
+
},
|
|
317
|
+
"areaServed": [
|
|
318
|
+
{"@type": "City", "name": "Cidade1"},
|
|
319
|
+
{"@type": "City", "name": "Cidade2"}
|
|
320
|
+
],
|
|
321
|
+
"serviceType": "TIPO_DO_SERVICO",
|
|
322
|
+
"offers": {
|
|
323
|
+
"@type": "Offer",
|
|
324
|
+
"priceCurrency": "BRL",
|
|
325
|
+
"priceSpecification": {
|
|
326
|
+
"@type": "PriceSpecification",
|
|
327
|
+
"priceCurrency": "BRL",
|
|
328
|
+
"minPrice": 100,
|
|
329
|
+
"maxPrice": 500
|
|
330
|
+
},
|
|
331
|
+
"availability": "https://schema.org/InStock"
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Note o `@id` do `provider` referenciando o `LocalBusiness` na home — isso conecta as entidades.
|
|
337
|
+
|
|
338
|
+
### Template 3: Product (página de produto)
|
|
339
|
+
|
|
340
|
+
```json
|
|
341
|
+
{
|
|
342
|
+
"@context": "https://schema.org",
|
|
343
|
+
"@type": "Product",
|
|
344
|
+
"@id": "https://DOMINIO.com.br/produtos/SLUG/#product",
|
|
345
|
+
"name": "NOME DO PRODUTO",
|
|
346
|
+
"description": "DESCRICAO_RICA",
|
|
347
|
+
"image": [
|
|
348
|
+
"https://DOMINIO.com.br/imagens/produto-1.jpg",
|
|
349
|
+
"https://DOMINIO.com.br/imagens/produto-2.jpg"
|
|
350
|
+
],
|
|
351
|
+
"brand": {
|
|
352
|
+
"@type": "Brand",
|
|
353
|
+
"name": "MARCA"
|
|
354
|
+
},
|
|
355
|
+
"sku": "CODIGO_DO_PRODUTO",
|
|
356
|
+
"gtin13": "EAN_SE_HOUVER",
|
|
357
|
+
"offers": {
|
|
358
|
+
"@type": "Offer",
|
|
359
|
+
"url": "https://DOMINIO.com.br/produtos/SLUG/",
|
|
360
|
+
"priceCurrency": "BRL",
|
|
361
|
+
"price": 199.90,
|
|
362
|
+
"priceValidUntil": "2026-12-31",
|
|
363
|
+
"availability": "https://schema.org/InStock",
|
|
364
|
+
"itemCondition": "https://schema.org/NewCondition",
|
|
365
|
+
"seller": {
|
|
366
|
+
"@id": "https://DOMINIO.com.br/#business"
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
"aggregateRating": {
|
|
370
|
+
"@type": "AggregateRating",
|
|
371
|
+
"ratingValue": "4.7",
|
|
372
|
+
"reviewCount": "23"
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
⚠️ **Nunca invente `aggregateRating`.** Só inclua se houver reviews reais e públicas. Google penaliza fake reviews em schema.
|
|
378
|
+
|
|
379
|
+
### Template 4: FAQPage
|
|
380
|
+
|
|
381
|
+
```json
|
|
382
|
+
{
|
|
383
|
+
"@context": "https://schema.org",
|
|
384
|
+
"@type": "FAQPage",
|
|
385
|
+
"mainEntity": [
|
|
386
|
+
{
|
|
387
|
+
"@type": "Question",
|
|
388
|
+
"name": "PERGUNTA 1?",
|
|
389
|
+
"acceptedAnswer": {
|
|
390
|
+
"@type": "Answer",
|
|
391
|
+
"text": "RESPOSTA_COMPLETA. Pode incluir HTML básico se necessário, mas evite tags complexas."
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"@type": "Question",
|
|
396
|
+
"name": "PERGUNTA 2?",
|
|
397
|
+
"acceptedAnswer": {
|
|
398
|
+
"@type": "Answer",
|
|
399
|
+
"text": "RESPOSTA_COMPLETA"
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
]
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
⚠️ **As perguntas e respostas no schema devem ser idênticas (ou muito próximas) ao texto visível na página.** Google exige isso. Schema FAQ "fantasma" não rankeia.
|
|
407
|
+
|
|
408
|
+
### Template 5: BreadcrumbList
|
|
409
|
+
|
|
410
|
+
```json
|
|
411
|
+
{
|
|
412
|
+
"@context": "https://schema.org",
|
|
413
|
+
"@type": "BreadcrumbList",
|
|
414
|
+
"itemListElement": [
|
|
415
|
+
{
|
|
416
|
+
"@type": "ListItem",
|
|
417
|
+
"position": 1,
|
|
418
|
+
"name": "Home",
|
|
419
|
+
"item": "https://DOMINIO.com.br/"
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"@type": "ListItem",
|
|
423
|
+
"position": 2,
|
|
424
|
+
"name": "Serviços",
|
|
425
|
+
"item": "https://DOMINIO.com.br/servicos/"
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"@type": "ListItem",
|
|
429
|
+
"position": 3,
|
|
430
|
+
"name": "Desentupimento",
|
|
431
|
+
"item": "https://DOMINIO.com.br/servicos/desentupimento/"
|
|
432
|
+
}
|
|
433
|
+
]
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Template 6: Article / BlogPosting
|
|
438
|
+
|
|
439
|
+
```json
|
|
440
|
+
{
|
|
441
|
+
"@context": "https://schema.org",
|
|
442
|
+
"@type": "BlogPosting",
|
|
443
|
+
"@id": "https://DOMINIO.com.br/blog/SLUG/#article",
|
|
444
|
+
"headline": "TITULO_DO_ARTIGO",
|
|
445
|
+
"description": "RESUMO_150_CHARS",
|
|
446
|
+
"image": "https://DOMINIO.com.br/blog/SLUG/capa.jpg",
|
|
447
|
+
"datePublished": "AAAA-MM-DDTHH:MM:SS-03:00",
|
|
448
|
+
"dateModified": "AAAA-MM-DDTHH:MM:SS-03:00",
|
|
449
|
+
"author": {
|
|
450
|
+
"@type": "Person",
|
|
451
|
+
"name": "NOME DO AUTOR",
|
|
452
|
+
"url": "https://DOMINIO.com.br/autor/SLUG-AUTOR/"
|
|
453
|
+
},
|
|
454
|
+
"publisher": {
|
|
455
|
+
"@id": "https://DOMINIO.com.br/#business"
|
|
456
|
+
},
|
|
457
|
+
"mainEntityOfPage": {
|
|
458
|
+
"@type": "WebPage",
|
|
459
|
+
"@id": "https://DOMINIO.com.br/blog/SLUG/"
|
|
460
|
+
},
|
|
461
|
+
"articleBody": "TEXTO_COMPLETO_DO_ARTIGO_OU_OMITIR"
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### Template 7: HowTo (tutoriais passo-a-passo)
|
|
466
|
+
|
|
467
|
+
```json
|
|
468
|
+
{
|
|
469
|
+
"@context": "https://schema.org",
|
|
470
|
+
"@type": "HowTo",
|
|
471
|
+
"name": "Como [FAZER_ALGO]",
|
|
472
|
+
"description": "DESCRICAO_BREVE",
|
|
473
|
+
"totalTime": "PT30M",
|
|
474
|
+
"supply": [
|
|
475
|
+
{"@type": "HowToSupply", "name": "Material 1"},
|
|
476
|
+
{"@type": "HowToSupply", "name": "Material 2"}
|
|
477
|
+
],
|
|
478
|
+
"tool": [
|
|
479
|
+
{"@type": "HowToTool", "name": "Ferramenta 1"}
|
|
480
|
+
],
|
|
481
|
+
"step": [
|
|
482
|
+
{
|
|
483
|
+
"@type": "HowToStep",
|
|
484
|
+
"position": 1,
|
|
485
|
+
"name": "Primeiro passo",
|
|
486
|
+
"text": "DESCRICAO_DO_PASSO",
|
|
487
|
+
"image": "https://DOMINIO.com.br/passo-1.jpg"
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"@type": "HowToStep",
|
|
491
|
+
"position": 2,
|
|
492
|
+
"name": "Segundo passo",
|
|
493
|
+
"text": "DESCRICAO_DO_PASSO"
|
|
494
|
+
}
|
|
495
|
+
]
|
|
496
|
+
}
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Template 8: hasOfferCatalog (catálogo de serviços/produtos dentro do LocalBusiness)
|
|
500
|
+
|
|
501
|
+
Encaixar dentro do `LocalBusiness`:
|
|
502
|
+
|
|
503
|
+
```json
|
|
504
|
+
"hasOfferCatalog": {
|
|
505
|
+
"@type": "OfferCatalog",
|
|
506
|
+
"name": "Catálogo de Serviços",
|
|
507
|
+
"itemListElement": [
|
|
508
|
+
{
|
|
509
|
+
"@type": "OfferCatalog",
|
|
510
|
+
"name": "Categoria 1",
|
|
511
|
+
"itemListElement": [
|
|
512
|
+
{
|
|
513
|
+
"@type": "Offer",
|
|
514
|
+
"itemOffered": {
|
|
515
|
+
"@type": "Service",
|
|
516
|
+
"name": "Serviço A",
|
|
517
|
+
"description": "Descrição do serviço A"
|
|
518
|
+
}
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"@type": "Offer",
|
|
522
|
+
"itemOffered": {
|
|
523
|
+
"@type": "Service",
|
|
524
|
+
"name": "Serviço B"
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
]
|
|
528
|
+
}
|
|
529
|
+
]
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
## Composição multi-schema na mesma página
|
|
534
|
+
|
|
535
|
+
Em uma página de serviço, por exemplo, geralmente compõem-se 3 schemas: `Service` + `LocalBusiness` (referência por @id) + `BreadcrumbList`. Pode ser feito de duas formas:
|
|
536
|
+
|
|
537
|
+
**Opção A — múltiplos blocos `<script>`:**
|
|
538
|
+
|
|
539
|
+
```html
|
|
540
|
+
<script type="application/ld+json">
|
|
541
|
+
{ "@context": "https://schema.org", "@type": "Service", ... }
|
|
542
|
+
</script>
|
|
543
|
+
<script type="application/ld+json">
|
|
544
|
+
{ "@context": "https://schema.org", "@type": "BreadcrumbList", ... }
|
|
545
|
+
</script>
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
**Opção B — `@graph` (recomendada para conexão entre entidades):**
|
|
549
|
+
|
|
550
|
+
```json
|
|
551
|
+
{
|
|
552
|
+
"@context": "https://schema.org",
|
|
553
|
+
"@graph": [
|
|
554
|
+
{
|
|
555
|
+
"@type": ["Plumber", "LocalBusiness"],
|
|
556
|
+
"@id": "https://DOMINIO.com.br/#business",
|
|
557
|
+
"name": "...",
|
|
558
|
+
...
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
"@type": "Service",
|
|
562
|
+
"@id": "https://DOMINIO.com.br/servicos/desentupimento/#service",
|
|
563
|
+
"provider": {"@id": "https://DOMINIO.com.br/#business"},
|
|
564
|
+
...
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"@type": "BreadcrumbList",
|
|
568
|
+
...
|
|
569
|
+
}
|
|
570
|
+
]
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
Preferir `@graph` quando entidades se referenciam. Mais limpo, mais semântico, Google lê melhor.
|
|
575
|
+
|
|
576
|
+
## Erros comuns que esta skill EVITA
|
|
577
|
+
|
|
578
|
+
1. **`address` como string em vez de objeto `PostalAddress`.** Errado: `"address": "Rua X, 123"`. Certo: objeto aninhado.
|
|
579
|
+
2. **Sem `@id`.** Sem `@id`, cada página é entidade isolada. Com `@id`, Google conecta tudo.
|
|
580
|
+
3. **`telephone` em formato inválido.** Use formato internacional `+55-31-XXXXX-XXXX` ou `+5531999999999`.
|
|
581
|
+
4. **`openingHours` com string em vez de `OpeningHoursSpecification` array.** Strings (`Mo-Fr 08:00-18:00`) ainda funcionam mas estão depreciadas. Sempre array de objetos.
|
|
582
|
+
5. **`sameAs` apontando para URLs quebradas.** Cada URL em `sameAs` deve resolver. URL quebrada = sinal negativo.
|
|
583
|
+
6. **`aggregateRating` sem reviews reais.** Schema fake = penalização manual.
|
|
584
|
+
7. **`@type` plural errado.** Quando array, é `["TipoEspecifico", "TipoGenerico"]`, sempre.
|
|
585
|
+
8. **`logo` como caminho relativo.** Sempre URL absoluta com HTTPS.
|
|
586
|
+
9. **Schema FAQ com perguntas que não estão visíveis na página.** Google removeu rich result FAQ em 2023, mas o schema ainda alimenta Knowledge Graph — só funciona se conteúdo for visível.
|
|
587
|
+
10. **`Person` sem `url` ou `sameAs`.** Pessoa sem identidade verificável tem peso baixo de E-E-A-T.
|
|
588
|
+
|
|
589
|
+
## Validação obrigatória pós-geração
|
|
590
|
+
|
|
591
|
+
Antes de entregar ao usuário, mentalmente valide:
|
|
592
|
+
|
|
593
|
+
- [ ] Todo `@type` existe no schema.org? (não inventou tipo como `BarberShop` que não existe nativamente)
|
|
594
|
+
- [ ] Todos os campos obrigatórios do tipo estão presentes? (`Article` exige `headline`, `image`, `datePublished`, `author`)
|
|
595
|
+
- [ ] URLs são absolutas e HTTPS?
|
|
596
|
+
- [ ] `address` é objeto, não string?
|
|
597
|
+
- [ ] `telephone` em formato internacional?
|
|
598
|
+
- [ ] `geo` tem `latitude` e `longitude` numéricos (não strings)?
|
|
599
|
+
- [ ] Datas em ISO 8601 com timezone (`-03:00` para Brasil)?
|
|
600
|
+
- [ ] `sameAs` com URLs reais (não placeholders)?
|
|
601
|
+
- [ ] Não inventou `aggregateRating`, `priceRange` ou outros dados não fornecidos?
|
|
602
|
+
- [ ] `@id` consistente entre referências cruzadas?
|
|
603
|
+
|
|
604
|
+
## Entrega ao usuário
|
|
605
|
+
|
|
606
|
+
Sempre entregue em 4 partes:
|
|
607
|
+
|
|
608
|
+
### Parte 1: O JSON-LD pronto pra colar
|
|
609
|
+
Bloco de código limpo, sem comentários (JSON-LD não suporta comentários nativos).
|
|
610
|
+
|
|
611
|
+
### Parte 2: Onde colar
|
|
612
|
+
```html
|
|
613
|
+
<head>
|
|
614
|
+
...outras tags...
|
|
615
|
+
|
|
616
|
+
<script type="application/ld+json">
|
|
617
|
+
[SEU SCHEMA AQUI]
|
|
618
|
+
</script>
|
|
619
|
+
|
|
620
|
+
</head>
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### Parte 3: Como instalar (por stack)
|
|
624
|
+
|
|
625
|
+
- **WordPress + Elementor:** Plugin recomendado: WPCode (antigo Insert Headers and Footers). Vai em Code Snippets → Header → cola o `<script>` inteiro.
|
|
626
|
+
- **WordPress + tema próprio:** edite `header.php` ou use hook `wp_head` em `functions.php`.
|
|
627
|
+
- **Wix / Squarespace / Webflow:** ferramentas têm "custom code" / "code injection" no painel de SEO.
|
|
628
|
+
- **Site estático / Next.js / React:** componente próprio no `<Head>` (Next.js usa `next/head` ou `next/script`).
|
|
629
|
+
- **Shopify:** `theme.liquid`, dentro de `<head>`.
|
|
630
|
+
|
|
631
|
+
### Parte 4: Como validar
|
|
632
|
+
|
|
633
|
+
1. Abra [Google Rich Results Test](https://search.google.com/test/rich-results) → cole URL ou código → veja erros/avisos
|
|
634
|
+
2. Abra [Schema.org Validator](https://validator.schema.org/) → mesma coisa, mais detalhado
|
|
635
|
+
3. Após corrigir tudo, no Google Search Console: Cobertura → Inspeção de URL → "Solicitar indexação"
|
|
636
|
+
|
|
637
|
+
⚠️ **Resultados visíveis no Google levam 2-8 semanas.** Não prometa rich results em "uma semana".
|
|
638
|
+
|
|
639
|
+
## Edge cases
|
|
640
|
+
|
|
641
|
+
**Negócio com múltiplas localidades:** criar `LocalBusiness` separado por unidade, com endereço próprio. Conectar todos a um `Organization` master.
|
|
642
|
+
|
|
643
|
+
**Negócio que não tem endereço físico (online-only / service area only):** usar `Organization` em vez de `LocalBusiness`. Adicionar `areaServed` mas omitir `address` físico, ou usar `address` da sede administrativa com nota.
|
|
644
|
+
|
|
645
|
+
**Negócio em loja dentro de outro estabelecimento (kiosk em shopping):** `address` aponta pro shopping; `name` da empresa, não do shopping; `containedInPlace` apontando pro shopping.
|
|
646
|
+
|
|
647
|
+
**Profissional liberal autônomo (sem CNPJ):** usar `Person` + `worksFor` (Organization) ou `LocalBusiness` se atende em consultório próprio.
|
|
648
|
+
|
|
649
|
+
**Empresa com nome diferente do legal:** `name` (fantasia) e `legalName` (razão social) são campos distintos. Use ambos.
|
|
650
|
+
|
|
651
|
+
## Exemplo de invocação esperada
|
|
652
|
+
|
|
653
|
+
**Usuário:** "Cria o schema da Limppetec, é loja de equipamentos de limpeza em Contagem-MG"
|
|
654
|
+
|
|
655
|
+
**Resposta esperada:** acionar essa skill, perguntar dados que faltam (telefone, horário, área atendida, redes sociais, marcas, CNPJ se possível), gerar o JSON-LD com `@type: ["Store", "LocalBusiness"]`, `hasOfferCatalog` com aluguel + venda + serviços, entregar nos 4 blocos (schema + onde colar + como instalar + como validar).
|
|
656
|
+
|
|
657
|
+
**Usuário:** "Acabei de escrever um post no blog sobre como escolher lavadora de alta pressão, gera o schema"
|
|
658
|
+
|
|
659
|
+
**Resposta esperada:** acionar essa skill, gerar `BlogPosting` + `BreadcrumbList`, perguntar autor, data, imagem se não souber.
|
|
660
|
+
|
|
661
|
+
**Usuário:** "Adiciona FAQ schema nessa página: [cola HTML]"
|
|
662
|
+
|
|
663
|
+
**Resposta esperada:** acionar essa skill, extrair perguntas e respostas do HTML, gerar `FAQPage` com texto idêntico ao visível na página.
|