bmad-plus 0.1.3 → 0.3.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.
Files changed (33) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +2 -0
  3. package/oveanet-pack/animated-website/DEPLOYMENT.md +104 -0
  4. package/oveanet-pack/animated-website/README.md +63 -0
  5. package/oveanet-pack/animated-website/agent/animated-website-agent.md +325 -0
  6. package/oveanet-pack/animated-website/agent.yaml +63 -0
  7. package/oveanet-pack/animated-website/templates/animated-website-workflow.md +55 -0
  8. package/oveanet-pack/seo-audit-360/DEPLOYMENT.md +115 -0
  9. package/oveanet-pack/seo-audit-360/README.md +66 -0
  10. package/oveanet-pack/seo-audit-360/agent/seo-chief.md +275 -0
  11. package/oveanet-pack/seo-audit-360/agent/seo-judge.md +241 -0
  12. package/oveanet-pack/seo-audit-360/agent/seo-scout.md +171 -0
  13. package/oveanet-pack/seo-audit-360/agent.yaml +70 -0
  14. package/oveanet-pack/seo-audit-360/checklist.md +140 -0
  15. package/oveanet-pack/seo-audit-360/pagespeed-playbook.md +320 -0
  16. package/oveanet-pack/seo-audit-360/ref/cwv-thresholds.md +87 -0
  17. package/oveanet-pack/seo-audit-360/ref/eeat-criteria.md +123 -0
  18. package/oveanet-pack/seo-audit-360/ref/geo-signals.md +167 -0
  19. package/oveanet-pack/seo-audit-360/ref/quality-gates.md +133 -0
  20. package/oveanet-pack/seo-audit-360/ref/schema-catalog.md +91 -0
  21. package/oveanet-pack/seo-audit-360/ref/schema-templates.json +356 -0
  22. package/oveanet-pack/seo-audit-360/scripts/seo_crawl.py +282 -0
  23. package/oveanet-pack/seo-audit-360/scripts/seo_fetch.py +231 -0
  24. package/oveanet-pack/seo-audit-360/scripts/seo_parse.py +255 -0
  25. package/oveanet-pack/seo-audit-360/scripts/seo_screenshot.py +202 -0
  26. package/oveanet-pack/seo-audit-360/templates/seo-audit-workflow.md +241 -0
  27. package/oveanet-pack/universal-backup/DEPLOYMENT.md +80 -0
  28. package/oveanet-pack/universal-backup/README.md +58 -0
  29. package/oveanet-pack/universal-backup/agent/backup-agent.md +71 -0
  30. package/oveanet-pack/universal-backup/agent.yaml +45 -0
  31. package/oveanet-pack/universal-backup/templates/backup-workflow.md +51 -0
  32. package/package.json +2 -1
  33. package/tools/cli/commands/install.js +37 -0
@@ -0,0 +1,133 @@
1
+ # Quality Gates — Content Thresholds (March 2026)
2
+
3
+ > Author: Laurent Rochetta | BMAD+ SEO Engine v2.0
4
+
5
+ ## Word Count Minimums by Page Type
6
+
7
+ | Page Type | Minimum | Notes |
8
+ |-----------|---------|-------|
9
+ | Homepage | 500 | Brand clarity + key offerings |
10
+ | Service page | 800 | Comprehensive service description |
11
+ | Blog / article | 1,500 | Deep topical coverage |
12
+ | Product page | 300+ (400+ complex) | Depends on product complexity |
13
+ | Category page | 200 | Plus product listings |
14
+ | Location page | 500–600 | Must be 60%+ unique per location |
15
+ | Comparison page | 1,200 | Feature matrix + analysis |
16
+ | Landing page | 400 | Conversion-focused |
17
+ | About page | 500 | Company story + credentials |
18
+ | FAQ page | 1,000 | Comprehensive Q&A coverage |
19
+
20
+ > **Word count is NOT a ranking factor.** These are topical coverage floors. A thorough 500-word page beats a padded 2,000-word one.
21
+
22
+ ---
23
+
24
+ ## Location Page Quality Gates
25
+
26
+ | Threshold | Action |
27
+ |-----------|--------|
28
+ | 1–29 location pages | ✅ Normal — ensure 60%+ unique content per page |
29
+ | 30+ location pages | ⚠️ WARNING — enforce 60%+ unique content, audit for thin/duplicate |
30
+ | 50+ location pages | 🛑 HARD STOP — require user justification before proceeding |
31
+
32
+ ### Unique Content Requirements per Location
33
+ - Unique local testimonials or case studies
34
+ - Location-specific service details
35
+ - Local area information and context
36
+ - Original photos (not stock)
37
+ - Unique meta title and description
38
+
39
+ ---
40
+
41
+ ## Programmatic Page Quality Gates
42
+
43
+ | Threshold | Action |
44
+ |-----------|--------|
45
+ | 1–99 programmatic pages | ✅ Normal — verify template quality |
46
+ | 100+ pages | ⚠️ WARNING — audit for thin content and cannibalization |
47
+ | 500+ pages | 🛑 HARD STOP — full audit required before generating more |
48
+
49
+ ### Programmatic Content Requirements
50
+ - Each page must provide unique value (not just data swap)
51
+ - Internal linking automation between related pages
52
+ - Canonical strategy to prevent index bloat
53
+ - Minimum 200 words of unique contextual content per page
54
+ - Quality varies by template — audit samples before scale
55
+
56
+ ---
57
+
58
+ ## Title Tag Guidelines
59
+
60
+ | Criterion | Requirement |
61
+ |-----------|-------------|
62
+ | Length | 50–60 characters (display limit ~600px) |
63
+ | Primary keyword | Include near the beginning |
64
+ | Brand name | Append with " | Brand" or " — Brand" |
65
+ | Uniqueness | Every page must have a unique title |
66
+ | Accuracy | Must reflect actual page content |
67
+
68
+ ---
69
+
70
+ ## Meta Description Guidelines
71
+
72
+ | Criterion | Requirement |
73
+ |-----------|-------------|
74
+ | Length | 150–160 characters |
75
+ | Call to action | Include when appropriate |
76
+ | Primary keyword | Include naturally |
77
+ | Uniqueness | Every page must have a unique description |
78
+ | Accuracy | Must match page content (Google may rewrite if not) |
79
+
80
+ ---
81
+
82
+ ## Heading Hierarchy Rules
83
+
84
+ | Rule | Requirement |
85
+ |------|-------------|
86
+ | H1 count | Exactly 1 per page |
87
+ | H1 content | Should contain primary keyword, be descriptive |
88
+ | Hierarchy | H1 → H2 → H3 (no skipping levels) |
89
+ | Heading frequency | One heading every 200–300 words |
90
+ | Heading style | Descriptive, not generic ("Our Services" → "Professional SEO Audit Services") |
91
+
92
+ ---
93
+
94
+ ## Image Optimization Standards
95
+
96
+ | Criterion | Standard | Priority |
97
+ |-----------|----------|----------|
98
+ | Alt text | Descriptive, meaningful, includes keywords naturally | High |
99
+ | Dimensions | Width and height attributes specified | High (CLS) |
100
+ | Format | WebP or AVIF preferred, JPEG/PNG acceptable | Medium |
101
+ | File size | <200KB for standard, <500KB for hero images | Medium |
102
+ | Lazy loading | `loading="lazy"` for below-fold images | Medium |
103
+ | Preload | `<link rel="preload">` for hero/LCP images | High |
104
+ | Srcset | Responsive sizes for different viewports | Medium |
105
+
106
+ ---
107
+
108
+ ## Internal Linking Standards
109
+
110
+ | Metric | Target |
111
+ |--------|--------|
112
+ | Links per 1,000 words | 3–5 relevant internal links |
113
+ | Anchor text | Descriptive (not "click here") |
114
+ | Orphan pages | 0 (every page linked from at least one other) |
115
+ | Click depth | Important pages within 3 clicks of homepage |
116
+ | Broken links | 0 internal 404s |
117
+
118
+ ---
119
+
120
+ ## Thin Content Detection
121
+
122
+ A page is flagged as "thin content" when:
123
+ 1. Word count is below the minimum for its page type
124
+ 2. Content is predominantly duplicate or near-duplicate of another page
125
+ 3. Content is auto-generated without unique value-add
126
+ 4. Page provides no actionable information
127
+
128
+ ### Doorway Page Prevention
129
+ Never recommend creating pages that:
130
+ - Exist solely to funnel users to another page
131
+ - Have nearly identical content with only location/keyword swaps
132
+ - Provide no standalone value
133
+ - Target many similar keyword variations with minimal differences
@@ -0,0 +1,91 @@
1
+ # Schema.org — Type Catalog & Deprecation Status (March 2026)
2
+
3
+ > Author: Laurent Rochetta | BMAD+ SEO Engine v2.0 | Schema.org v29.4
4
+
5
+ ## Format: Always JSON-LD
6
+ `<script type="application/ld+json">` — Google's explicit recommendation.
7
+ Content with schema has ~2.5× higher AI citation probability (Google/Microsoft, March 2025).
8
+
9
+ ## Active — Recommend Freely
10
+
11
+ | Type | Use Case | Key Properties |
12
+ |------|----------|----------------|
13
+ | Organization | Company/brand | name, url, logo, contactPoint, sameAs |
14
+ | LocalBusiness | Physical location | name, address, telephone, openingHours, geo, priceRange |
15
+ | SoftwareApplication | Apps | name, operatingSystem, applicationCategory, offers |
16
+ | WebApplication | SaaS | name, applicationCategory, offers, featureList |
17
+ | Product | Products | name, image, description, sku, brand, offers, review |
18
+ | ProductGroup | Variants | name, productGroupID, variesBy, hasVariant |
19
+ | Offer | Pricing | price, priceCurrency, availability, url |
20
+ | Service | Services | name, provider, areaServed, description, offers |
21
+ | Article | Articles | headline, author, datePublished, dateModified, image, publisher |
22
+ | BlogPosting | Blog content | Same as Article + blog context |
23
+ | NewsArticle | News | Same as Article + news context |
24
+ | Review | Reviews | reviewRating, author, itemReviewed, reviewBody |
25
+ | AggregateRating | Ratings | ratingValue, reviewCount, bestRating |
26
+ | BreadcrumbList | Navigation | itemListElement with position, name, item |
27
+ | WebSite | Site-level | name, url, potentialAction (SearchAction) |
28
+ | WebPage | Page-level | name, description, datePublished, dateModified |
29
+ | Person | Authors/team | name, jobTitle, url, sameAs, image, worksFor |
30
+ | ProfilePage | Profiles | mainEntity (Person), name, sameAs |
31
+ | ContactPage | Contact | name, url |
32
+ | VideoObject | Video | name, description, thumbnailUrl, uploadDate, duration |
33
+ | ImageObject | Images | contentUrl, caption, creator |
34
+ | Event | Events | name, startDate, endDate, location, organizer |
35
+ | JobPosting | Jobs | title, description, datePosted, hiringOrganization |
36
+ | Course | Education | name, description, provider, hasCourseInstance |
37
+ | DiscussionForumPosting | Forums | headline, author, datePublished, text |
38
+ | Certification | Certifications | certificationIdentification, issuedBy (April 2025) |
39
+ | BroadcastEvent | Live streams | isLiveBroadcast, startDate, endDate |
40
+ | Clip | Video chapters | name, startOffset, endOffset, url |
41
+ | SeekToAction | Video seek | target with timestamp parameter |
42
+ | SoftwareSourceCode | Repos | codeRepository, programmingLanguage, license |
43
+
44
+ ## Restricted — Specific Sites Only
45
+
46
+ | Type | Restriction | Since |
47
+ |------|------------|-------|
48
+ | FAQPage | Government & healthcare ONLY | Aug 2023 |
49
+
50
+ > FAQPage still benefits AI/LLM citation (ChatGPT, Perplexity) even without Google rich results. Existing FAQPage on commercial sites: Info priority, not Critical.
51
+
52
+ ## Deprecated — NEVER Recommend
53
+
54
+ | Type | Since | Notes |
55
+ |------|-------|-------|
56
+ | HowTo | Sept 2023 | Rich results fully removed |
57
+ | SpecialAnnouncement | July 2025 | COVID-era, no longer processed |
58
+ | CourseInfo | June 2025 | Merged into Course |
59
+ | EstimatedSalary | June 2025 | No longer displayed |
60
+ | LearningVideo | June 2025 | Use VideoObject instead |
61
+ | ClaimReview | June 2025 | Fact-check markup discontinued |
62
+ | VehicleListing | June 2025 | Vehicle listings discontinued |
63
+ | Practice Problem | Late 2025 | Educational problems discontinued |
64
+ | Dataset | Late 2025 | Dataset Search discontinued |
65
+
66
+ ## Recent Additions (2024–2026)
67
+
68
+ | Feature | When | Notes |
69
+ |---------|------|-------|
70
+ | Product Certification | April 2025 | Replaces EnergyConsumptionDetails |
71
+ | ProductGroup | 2025 | E-commerce variants |
72
+ | ProfilePage | 2025 | E-E-A-T author pages |
73
+ | DiscussionForumPosting | 2024 | Forum content |
74
+ | LoyaltyProgram | June 2025 | Member pricing |
75
+ | ConferenceEvent | Dec 2025 | Schema.org v29.4 |
76
+ | PerformingArtsEvent | Dec 2025 | Schema.org v29.4 |
77
+
78
+ ## Validation Checklist
79
+ 1. ✅ `@context` = `"https://schema.org"` (not http)
80
+ 2. ✅ `@type` valid + non-deprecated
81
+ 3. ✅ Required properties present
82
+ 4. ✅ Correct data types
83
+ 5. ✅ No placeholder text
84
+ 6. ✅ Absolute URLs only
85
+ 7. ✅ ISO 8601 dates
86
+ 8. ✅ Valid image URLs
87
+
88
+ ## E-Commerce Notes
89
+ - `returnPolicyCountry` required in MerchantReturnPolicy (March 2025)
90
+ - Content API for Shopping sunsets August 18, 2026 → migrate to Merchant API
91
+ - JS-injected Product schema may face delayed processing → include in server HTML
@@ -0,0 +1,356 @@
1
+ {
2
+ "meta": {
3
+ "author": "Laurent Rochetta",
4
+ "engine": "BMAD+ SEO Engine v2.0",
5
+ "schema_org_version": "29.4",
6
+ "last_updated": "2026-03-19"
7
+ },
8
+ "templates": [
9
+ {
10
+ "type": "Organization",
11
+ "use_case": "Company/brand homepage",
12
+ "template": {
13
+ "@context": "https://schema.org",
14
+ "@type": "Organization",
15
+ "name": "[Company Name]",
16
+ "url": "[Website URL]",
17
+ "logo": "[Logo URL]",
18
+ "description": "[Company description]",
19
+ "foundingDate": "[YYYY]",
20
+ "contactPoint": {
21
+ "@type": "ContactPoint",
22
+ "telephone": "[Phone]",
23
+ "contactType": "customer service",
24
+ "availableLanguage": ["English", "French"]
25
+ },
26
+ "sameAs": [
27
+ "[Facebook URL]",
28
+ "[LinkedIn URL]",
29
+ "[Twitter URL]",
30
+ "[YouTube URL]"
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "type": "LocalBusiness",
36
+ "use_case": "Physical business location",
37
+ "template": {
38
+ "@context": "https://schema.org",
39
+ "@type": "LocalBusiness",
40
+ "name": "[Business Name]",
41
+ "url": "[Website URL]",
42
+ "image": "[Photo URL]",
43
+ "telephone": "[Phone]",
44
+ "priceRange": "[$$]",
45
+ "address": {
46
+ "@type": "PostalAddress",
47
+ "streetAddress": "[Street]",
48
+ "addressLocality": "[City]",
49
+ "addressRegion": "[State/Region]",
50
+ "postalCode": "[ZIP]",
51
+ "addressCountry": "[Country Code]"
52
+ },
53
+ "geo": {
54
+ "@type": "GeoCoordinates",
55
+ "latitude": "[Lat]",
56
+ "longitude": "[Long]"
57
+ },
58
+ "openingHoursSpecification": [
59
+ {
60
+ "@type": "OpeningHoursSpecification",
61
+ "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
62
+ "opens": "09:00",
63
+ "closes": "18:00"
64
+ }
65
+ ]
66
+ }
67
+ },
68
+ {
69
+ "type": "Article",
70
+ "use_case": "Blog posts, articles",
71
+ "template": {
72
+ "@context": "https://schema.org",
73
+ "@type": "Article",
74
+ "headline": "[Title - max 110 chars]",
75
+ "description": "[Summary]",
76
+ "author": {
77
+ "@type": "Person",
78
+ "name": "[Author Name]",
79
+ "url": "[Author Profile URL]"
80
+ },
81
+ "datePublished": "[YYYY-MM-DD]",
82
+ "dateModified": "[YYYY-MM-DD]",
83
+ "image": "[Featured Image URL]",
84
+ "publisher": {
85
+ "@type": "Organization",
86
+ "name": "[Publisher Name]",
87
+ "logo": {
88
+ "@type": "ImageObject",
89
+ "url": "[Logo URL]"
90
+ }
91
+ },
92
+ "mainEntityOfPage": {
93
+ "@type": "WebPage",
94
+ "@id": "[Page URL]"
95
+ }
96
+ }
97
+ },
98
+ {
99
+ "type": "Product",
100
+ "use_case": "E-commerce product pages",
101
+ "template": {
102
+ "@context": "https://schema.org",
103
+ "@type": "Product",
104
+ "name": "[Product Name]",
105
+ "image": "[Product Image URL]",
106
+ "description": "[Product Description]",
107
+ "sku": "[SKU]",
108
+ "brand": {
109
+ "@type": "Brand",
110
+ "name": "[Brand Name]"
111
+ },
112
+ "offers": {
113
+ "@type": "Offer",
114
+ "url": "[Product URL]",
115
+ "price": "[Price]",
116
+ "priceCurrency": "[Currency Code]",
117
+ "availability": "https://schema.org/InStock",
118
+ "seller": {
119
+ "@type": "Organization",
120
+ "name": "[Seller Name]"
121
+ }
122
+ },
123
+ "aggregateRating": {
124
+ "@type": "AggregateRating",
125
+ "ratingValue": "[4.5]",
126
+ "reviewCount": "[120]"
127
+ }
128
+ }
129
+ },
130
+ {
131
+ "type": "WebSite",
132
+ "use_case": "Site-level with sitelinks search box",
133
+ "template": {
134
+ "@context": "https://schema.org",
135
+ "@type": "WebSite",
136
+ "name": "[Site Name]",
137
+ "url": "[Homepage URL]",
138
+ "potentialAction": {
139
+ "@type": "SearchAction",
140
+ "target": {
141
+ "@type": "EntryPoint",
142
+ "urlTemplate": "[Search URL]?q={search_term_string}"
143
+ },
144
+ "query-input": "required name=search_term_string"
145
+ }
146
+ }
147
+ },
148
+ {
149
+ "type": "BreadcrumbList",
150
+ "use_case": "Navigation breadcrumbs",
151
+ "template": {
152
+ "@context": "https://schema.org",
153
+ "@type": "BreadcrumbList",
154
+ "itemListElement": [
155
+ {
156
+ "@type": "ListItem",
157
+ "position": 1,
158
+ "name": "Home",
159
+ "item": "[Homepage URL]"
160
+ },
161
+ {
162
+ "@type": "ListItem",
163
+ "position": 2,
164
+ "name": "[Category]",
165
+ "item": "[Category URL]"
166
+ },
167
+ {
168
+ "@type": "ListItem",
169
+ "position": 3,
170
+ "name": "[Current Page]"
171
+ }
172
+ ]
173
+ }
174
+ },
175
+ {
176
+ "type": "Person",
177
+ "use_case": "Author/team member profiles (E-E-A-T)",
178
+ "template": {
179
+ "@context": "https://schema.org",
180
+ "@type": "Person",
181
+ "name": "[Full Name]",
182
+ "jobTitle": "[Job Title]",
183
+ "url": "[Profile URL]",
184
+ "image": "[Photo URL]",
185
+ "description": "[Professional bio]",
186
+ "worksFor": {
187
+ "@type": "Organization",
188
+ "name": "[Company Name]"
189
+ },
190
+ "sameAs": [
191
+ "[LinkedIn URL]",
192
+ "[Twitter URL]",
193
+ "[GitHub URL]"
194
+ ]
195
+ }
196
+ },
197
+ {
198
+ "type": "Service",
199
+ "use_case": "Service business pages",
200
+ "template": {
201
+ "@context": "https://schema.org",
202
+ "@type": "Service",
203
+ "name": "[Service Name]",
204
+ "description": "[Service Description]",
205
+ "provider": {
206
+ "@type": "Organization",
207
+ "name": "[Provider Name]",
208
+ "url": "[Provider URL]"
209
+ },
210
+ "areaServed": {
211
+ "@type": "City",
212
+ "name": "[Service Area]"
213
+ },
214
+ "offers": {
215
+ "@type": "Offer",
216
+ "price": "[Starting Price]",
217
+ "priceCurrency": "[Currency]"
218
+ }
219
+ }
220
+ },
221
+ {
222
+ "type": "VideoObject",
223
+ "use_case": "Video content pages",
224
+ "template": {
225
+ "@context": "https://schema.org",
226
+ "@type": "VideoObject",
227
+ "name": "[Video Title]",
228
+ "description": "[Video Description]",
229
+ "thumbnailUrl": "[Thumbnail URL]",
230
+ "uploadDate": "[YYYY-MM-DD]",
231
+ "duration": "[PT1H30M]",
232
+ "contentUrl": "[Video File URL]",
233
+ "embedUrl": "[Embed URL]",
234
+ "publisher": {
235
+ "@type": "Organization",
236
+ "name": "[Publisher]"
237
+ }
238
+ }
239
+ },
240
+ {
241
+ "type": "Event",
242
+ "use_case": "Events and conferences",
243
+ "template": {
244
+ "@context": "https://schema.org",
245
+ "@type": "Event",
246
+ "name": "[Event Name]",
247
+ "description": "[Event Description]",
248
+ "startDate": "[YYYY-MM-DDTHH:MM]",
249
+ "endDate": "[YYYY-MM-DDTHH:MM]",
250
+ "location": {
251
+ "@type": "Place",
252
+ "name": "[Venue Name]",
253
+ "address": {
254
+ "@type": "PostalAddress",
255
+ "streetAddress": "[Street]",
256
+ "addressLocality": "[City]",
257
+ "addressCountry": "[Country]"
258
+ }
259
+ },
260
+ "organizer": {
261
+ "@type": "Organization",
262
+ "name": "[Organizer Name]",
263
+ "url": "[Organizer URL]"
264
+ },
265
+ "offers": {
266
+ "@type": "Offer",
267
+ "price": "[Price]",
268
+ "priceCurrency": "[Currency]",
269
+ "url": "[Ticket URL]",
270
+ "availability": "https://schema.org/InStock"
271
+ }
272
+ }
273
+ },
274
+ {
275
+ "type": "SoftwareApplication",
276
+ "use_case": "SaaS and app pages",
277
+ "template": {
278
+ "@context": "https://schema.org",
279
+ "@type": "SoftwareApplication",
280
+ "name": "[App Name]",
281
+ "description": "[App Description]",
282
+ "applicationCategory": "[Category]",
283
+ "operatingSystem": "[OS]",
284
+ "offers": {
285
+ "@type": "Offer",
286
+ "price": "[Price or 0]",
287
+ "priceCurrency": "[Currency]"
288
+ },
289
+ "aggregateRating": {
290
+ "@type": "AggregateRating",
291
+ "ratingValue": "[Rating]",
292
+ "ratingCount": "[Count]"
293
+ }
294
+ }
295
+ },
296
+ {
297
+ "type": "ProfilePage",
298
+ "use_case": "Author/creator profile pages (E-E-A-T)",
299
+ "template": {
300
+ "@context": "https://schema.org",
301
+ "@type": "ProfilePage",
302
+ "mainEntity": {
303
+ "@type": "Person",
304
+ "name": "[Author Name]",
305
+ "url": "[Profile URL]",
306
+ "description": "[Bio and expertise]",
307
+ "sameAs": ["[LinkedIn]", "[Twitter]"]
308
+ }
309
+ }
310
+ },
311
+ {
312
+ "type": "ProductGroup",
313
+ "use_case": "E-commerce product variants",
314
+ "template": {
315
+ "@context": "https://schema.org",
316
+ "@type": "ProductGroup",
317
+ "name": "[Product Name]",
318
+ "description": "[Group description]",
319
+ "productGroupID": "[Group ID]",
320
+ "variesBy": ["https://schema.org/size", "https://schema.org/color"],
321
+ "hasVariant": [
322
+ {
323
+ "@type": "Product",
324
+ "name": "[Variant Name]",
325
+ "sku": "[SKU]",
326
+ "color": "[Color]",
327
+ "size": "[Size]",
328
+ "offers": {
329
+ "@type": "Offer",
330
+ "price": "[Price]",
331
+ "priceCurrency": "[Currency]",
332
+ "availability": "https://schema.org/InStock"
333
+ }
334
+ }
335
+ ]
336
+ }
337
+ },
338
+ {
339
+ "type": "Certification",
340
+ "use_case": "Product certifications (April 2025)",
341
+ "template": {
342
+ "@context": "https://schema.org",
343
+ "@type": "Product",
344
+ "name": "[Product Name]",
345
+ "hasCertification": {
346
+ "@type": "Certification",
347
+ "certificationIdentification": "[Certification Name]",
348
+ "issuedBy": {
349
+ "@type": "Organization",
350
+ "name": "[Issuing Organization]"
351
+ }
352
+ }
353
+ }
354
+ }
355
+ ]
356
+ }