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.
@@ -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.