seomd-cli 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/seomd.js +54 -0
- package/package.json +46 -0
- package/src/commands/analyze.js +145 -0
- package/src/commands/init.js +160 -0
- package/src/commands/status.js +192 -0
- package/src/commands/sync.js +122 -0
- package/src/commands/validate.js +58 -0
- package/src/generators/directory.js +136 -0
- package/src/generators/reverse.js +62 -0
- package/src/generators/seomd.js +55 -0
- package/src/templates/blog/SEO.REVERSE.md +176 -0
- package/src/templates/blog/SEO.md +348 -0
- package/src/templates/ecommerce/SEO.REVERSE.md +199 -0
- package/src/templates/ecommerce/SEO.md +354 -0
- package/src/templates/local/SEO.REVERSE.md +222 -0
- package/src/templates/local/SEO.md +360 -0
- package/src/templates/marketplace/SEO.REVERSE.md +222 -0
- package/src/templates/marketplace/SEO.md +360 -0
- package/src/templates/saas/SEO.REVERSE.md +268 -0
- package/src/templates/saas/SEO.md +372 -0
- package/src/utils/api-client.js +41 -0
- package/src/utils/constants.js +132 -0
- package/src/utils/parser.js +46 -0
- package/src/utils/writeback.js +130 -0
- package/src/validators/seomd.js +211 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
# SEO.md
|
|
2
|
+
|
|
3
|
+
## {{brand}}
|
|
4
|
+
|
|
5
|
+
### spec v1.0 | <https://seomd.dev>
|
|
6
|
+
|
|
7
|
+
#### generated: {{date}}
|
|
8
|
+
|
|
9
|
+
## FIELD OWNERSHIP
|
|
10
|
+
|
|
11
|
+
### no prefix = founder declares (you own this)
|
|
12
|
+
|
|
13
|
+
### _analysis: = platform writes back (do not edit manually)
|
|
14
|
+
|
|
15
|
+
## Site
|
|
16
|
+
|
|
17
|
+
site:
|
|
18
|
+
type: local
|
|
19
|
+
domain: {{domain}}
|
|
20
|
+
canonical: https://{{domain}}
|
|
21
|
+
locale: en-US
|
|
22
|
+
launched: null # YYYY-MM-DD
|
|
23
|
+
|
|
24
|
+
## Identity
|
|
25
|
+
|
|
26
|
+
identity:
|
|
27
|
+
brand: "{{brand}}"
|
|
28
|
+
tagline: null
|
|
29
|
+
social:
|
|
30
|
+
twitter: null
|
|
31
|
+
linkedin: null
|
|
32
|
+
github: null
|
|
33
|
+
schema_org_type: LocalBusiness
|
|
34
|
+
|
|
35
|
+
## Keywords
|
|
36
|
+
|
|
37
|
+
keywords:
|
|
38
|
+
|
|
39
|
+
### FOUNDER DECLARES
|
|
40
|
+
|
|
41
|
+
primary: "{{primary_keyword}}"
|
|
42
|
+
secondary: [] # add your secondary keywords
|
|
43
|
+
negative: # terms that dilute your intent signal
|
|
44
|
+
- "free"
|
|
45
|
+
- "tutorial"
|
|
46
|
+
- "how to"
|
|
47
|
+
competitor_terms:
|
|
48
|
+
{{competitor_terms}}
|
|
49
|
+
category_terms: # unbranded category queries
|
|
50
|
+
- "best {{primary_keyword}}"
|
|
51
|
+
- "top {{primary_keyword}} tools"
|
|
52
|
+
long_tail: [] # add long-tail variations
|
|
53
|
+
seasonal: null # add seasonal terms if applicable
|
|
54
|
+
|
|
55
|
+
### PLATFORM WRITES BACK
|
|
56
|
+
|
|
57
|
+
_analysis:
|
|
58
|
+
source: null
|
|
59
|
+
primary_search_volume: null
|
|
60
|
+
primary_intent_type: null
|
|
61
|
+
primary_trend: null
|
|
62
|
+
recommended_secondary: []
|
|
63
|
+
negative_additions_suggested: []
|
|
64
|
+
last_analyzed: null
|
|
65
|
+
next_analysis: null
|
|
66
|
+
|
|
67
|
+
## Intent
|
|
68
|
+
|
|
69
|
+
intent:
|
|
70
|
+
|
|
71
|
+
### FOUNDER DECLARES
|
|
72
|
+
|
|
73
|
+
#### Add queries your buyers actually type into AI engines
|
|
74
|
+
|
|
75
|
+
#### Tip: think about what someone asks ChatGPT or Perplexity
|
|
76
|
+
|
|
77
|
+
#### when they are looking for a solution like yours
|
|
78
|
+
|
|
79
|
+
informational:
|
|
80
|
+
priority: medium
|
|
81
|
+
queries:
|
|
82
|
+
- "what is {{primary_keyword}}"
|
|
83
|
+
- "how does {{primary_keyword}} work"
|
|
84
|
+
|
|
85
|
+
comparison:
|
|
86
|
+
priority: medium
|
|
87
|
+
queries:
|
|
88
|
+
{{competitors_comparison_queries}}
|
|
89
|
+
- "best {{primary_keyword}} for startups"
|
|
90
|
+
|
|
91
|
+
transactional:
|
|
92
|
+
priority: critical
|
|
93
|
+
queries:
|
|
94
|
+
- "is {{brand_lower}} worth it"
|
|
95
|
+
- "should I use {{brand_lower}}"
|
|
96
|
+
- "{{brand_lower}} pricing"
|
|
97
|
+
|
|
98
|
+
reputational:
|
|
99
|
+
priority: critical
|
|
100
|
+
queries:
|
|
101
|
+
- "{{brand_lower}} reviews"
|
|
102
|
+
- "is {{brand_lower}} legit"
|
|
103
|
+
- "{{brand_lower}} problems"
|
|
104
|
+
|
|
105
|
+
category:
|
|
106
|
+
priority: high
|
|
107
|
+
queries:
|
|
108
|
+
- "best {{primary_keyword}}"
|
|
109
|
+
- "top {{primary_keyword}} 2026"
|
|
110
|
+
|
|
111
|
+
### PLATFORM WRITES BACK
|
|
112
|
+
|
|
113
|
+
_analysis:
|
|
114
|
+
source: null
|
|
115
|
+
last_analyzed: null
|
|
116
|
+
next_analysis: null
|
|
117
|
+
informational:
|
|
118
|
+
citation_rate: null
|
|
119
|
+
top_cited_competitor: null
|
|
120
|
+
gap_score: null
|
|
121
|
+
trend: null
|
|
122
|
+
comparison:
|
|
123
|
+
citation_rate: null
|
|
124
|
+
top_cited_competitor: null
|
|
125
|
+
gap_score: null
|
|
126
|
+
trend: null
|
|
127
|
+
transactional:
|
|
128
|
+
citation_rate: null
|
|
129
|
+
top_cited_competitor: null
|
|
130
|
+
gap_score: null
|
|
131
|
+
trend: null
|
|
132
|
+
reputational:
|
|
133
|
+
citation_rate: null
|
|
134
|
+
top_cited_competitor: null
|
|
135
|
+
gap_score: null
|
|
136
|
+
trend: null
|
|
137
|
+
category:
|
|
138
|
+
citation_rate: null
|
|
139
|
+
top_cited_competitor: null
|
|
140
|
+
gap_score: null
|
|
141
|
+
trend: null
|
|
142
|
+
|
|
143
|
+
## Pages
|
|
144
|
+
|
|
145
|
+
pages:
|
|
146
|
+
site_type: local
|
|
147
|
+
|
|
148
|
+
### FOUNDER DECLARES
|
|
149
|
+
|
|
150
|
+
#### status: live | draft | planned
|
|
151
|
+
|
|
152
|
+
required:
|
|
153
|
+
- id: homepage
|
|
154
|
+
url: /
|
|
155
|
+
primary_keyword: null
|
|
156
|
+
status: planned
|
|
157
|
+
priority: 1
|
|
158
|
+
|
|
159
|
+
- id: services
|
|
160
|
+
url: /services
|
|
161
|
+
primary_keyword: null
|
|
162
|
+
status: planned
|
|
163
|
+
priority: 2
|
|
164
|
+
|
|
165
|
+
- id: location
|
|
166
|
+
url: /[city]
|
|
167
|
+
primary_keyword: null
|
|
168
|
+
status: planned
|
|
169
|
+
priority: 3
|
|
170
|
+
|
|
171
|
+
- id: about
|
|
172
|
+
url: /about
|
|
173
|
+
primary_keyword: null
|
|
174
|
+
status: planned
|
|
175
|
+
priority: 4
|
|
176
|
+
|
|
177
|
+
- id: reviews
|
|
178
|
+
url: /reviews
|
|
179
|
+
primary_keyword: null
|
|
180
|
+
status: planned
|
|
181
|
+
priority: 5
|
|
182
|
+
|
|
183
|
+
- id: faq
|
|
184
|
+
url: /faq
|
|
185
|
+
primary_keyword: null
|
|
186
|
+
status: planned
|
|
187
|
+
priority: 6
|
|
188
|
+
|
|
189
|
+
- id: contact
|
|
190
|
+
url: /contact
|
|
191
|
+
primary_keyword: null
|
|
192
|
+
status: planned
|
|
193
|
+
priority: 7
|
|
194
|
+
|
|
195
|
+
- id: service-area
|
|
196
|
+
url: /service-area
|
|
197
|
+
primary_keyword: null
|
|
198
|
+
status: planned
|
|
199
|
+
priority: 8
|
|
200
|
+
|
|
201
|
+
### PLATFORM WRITES BACK
|
|
202
|
+
|
|
203
|
+
_analysis:
|
|
204
|
+
source: null
|
|
205
|
+
last_analyzed: null
|
|
206
|
+
pages: []
|
|
207
|
+
missing_pages: []
|
|
208
|
+
build_order_recommendation: []
|
|
209
|
+
|
|
210
|
+
## Copy
|
|
211
|
+
|
|
212
|
+
copy:
|
|
213
|
+
|
|
214
|
+
### FOUNDER DECLARES
|
|
215
|
+
|
|
216
|
+
h1_contains_primary_keyword: true
|
|
217
|
+
meta_description_length: 150-160
|
|
218
|
+
meta_description_includes_cta: true
|
|
219
|
+
min_word_count:
|
|
220
|
+
homepage: 800
|
|
221
|
+
feature_page: 600
|
|
222
|
+
blog_post: 1200
|
|
223
|
+
comparison_page: 1500
|
|
224
|
+
reading_level: 8 # grade level target
|
|
225
|
+
|
|
226
|
+
## Structure
|
|
227
|
+
|
|
228
|
+
structure:
|
|
229
|
+
|
|
230
|
+
### FOUNDER DECLARES
|
|
231
|
+
|
|
232
|
+
answer_first: true # direct answer in first 50 words
|
|
233
|
+
faq_section_required: true # on all key pages
|
|
234
|
+
faq_minimum_questions: 6
|
|
235
|
+
statistics_per_page: 2 # minimum data points with sources
|
|
236
|
+
citations_required: true # link to primary sources
|
|
237
|
+
short_paragraphs: true # max 3 sentences
|
|
238
|
+
heading_hierarchy: strict # H1 > H2 > H3, no skipping
|
|
239
|
+
|
|
240
|
+
## Authority
|
|
241
|
+
|
|
242
|
+
authority:
|
|
243
|
+
|
|
244
|
+
### FOUNDER DECLARES
|
|
245
|
+
|
|
246
|
+
cite_sources: true
|
|
247
|
+
expert_quotes: false # set true when you have quotes
|
|
248
|
+
eeat_signals:
|
|
249
|
+
experience: null # describe your experience signal
|
|
250
|
+
expertise: null # describe your expertise signal
|
|
251
|
+
authority: null # describe your authority signal
|
|
252
|
+
trust: null # describe your trust signal
|
|
253
|
+
|
|
254
|
+
## Schema
|
|
255
|
+
|
|
256
|
+
schema:
|
|
257
|
+
|
|
258
|
+
### FOUNDER DECLARES
|
|
259
|
+
|
|
260
|
+
types:
|
|
261
|
+
- LocalBusiness
|
|
262
|
+
- FAQPage
|
|
263
|
+
- Review
|
|
264
|
+
- GeoCoordinates
|
|
265
|
+
faq_schema: true
|
|
266
|
+
breadcrumb_schema: true
|
|
267
|
+
organization_schema: true
|
|
268
|
+
|
|
269
|
+
## Crawl
|
|
270
|
+
|
|
271
|
+
crawl:
|
|
272
|
+
|
|
273
|
+
### FOUNDER DECLARES
|
|
274
|
+
|
|
275
|
+
sitemap: /sitemap.xml
|
|
276
|
+
robots_txt: /robots.txt
|
|
277
|
+
allow_ai_bots: true
|
|
278
|
+
allowed_bots:
|
|
279
|
+
- Googlebot
|
|
280
|
+
- Bingbot
|
|
281
|
+
- PerplexityBot
|
|
282
|
+
- ChatGPT-User
|
|
283
|
+
- GPTBot
|
|
284
|
+
- ClaudeBot
|
|
285
|
+
- anthropic-ai
|
|
286
|
+
- cohere-ai
|
|
287
|
+
disallow:
|
|
288
|
+
- /admin
|
|
289
|
+
- /checkout
|
|
290
|
+
- /user/*
|
|
291
|
+
- /api/*
|
|
292
|
+
|
|
293
|
+
## Performance
|
|
294
|
+
|
|
295
|
+
performance:
|
|
296
|
+
|
|
297
|
+
### FOUNDER DECLARES
|
|
298
|
+
|
|
299
|
+
lcp: 2.5s
|
|
300
|
+
cls: 0.1
|
|
301
|
+
fid: 100ms
|
|
302
|
+
page_size: 500kb
|
|
303
|
+
ttfb: 800ms
|
|
304
|
+
|
|
305
|
+
## AEO
|
|
306
|
+
|
|
307
|
+
aeo:
|
|
308
|
+
|
|
309
|
+
### FOUNDER DECLARES
|
|
310
|
+
|
|
311
|
+
### AI Engine Optimization rules
|
|
312
|
+
|
|
313
|
+
answer_first_format: true
|
|
314
|
+
faq_on_all_key_pages: true
|
|
315
|
+
structured_data_priority: high
|
|
316
|
+
content_freshness_target: 30d # update key pages within 30 days
|
|
317
|
+
competitors_to_monitor:
|
|
318
|
+
{{competitors_to_monitor}}
|
|
319
|
+
|
|
320
|
+
### PLATFORM WRITES BACK
|
|
321
|
+
|
|
322
|
+
_analysis:
|
|
323
|
+
source: null
|
|
324
|
+
overall_citation_rate: null
|
|
325
|
+
overall_gap_score: null
|
|
326
|
+
engines_tracked:
|
|
327
|
+
- chatgpt
|
|
328
|
+
- perplexity
|
|
329
|
+
- claude
|
|
330
|
+
- gemini
|
|
331
|
+
- grok
|
|
332
|
+
last_analyzed: null
|
|
333
|
+
next_analysis: null
|
|
334
|
+
|
|
335
|
+
## Monitoring
|
|
336
|
+
|
|
337
|
+
monitoring:
|
|
338
|
+
|
|
339
|
+
### FOUNDER DECLARES
|
|
340
|
+
|
|
341
|
+
sync_schedule: monthly # monthly | weekly | on_demand
|
|
342
|
+
auto_commit: false # platform commits directly to repo
|
|
343
|
+
pr_mode: true # open PR instead of direct commit
|
|
344
|
+
branch: main
|
|
345
|
+
alert_on_gap_score_above: 80 # alert when gap score exceeds threshold
|
|
346
|
+
alert_on_citation_drop: true # alert if citation rate drops
|
|
347
|
+
|
|
348
|
+
## Platform Connection
|
|
349
|
+
|
|
350
|
+
### Connect at <https://seomd.dev/connect>
|
|
351
|
+
|
|
352
|
+
### Add SEOMD_API_KEY to your .env file
|
|
353
|
+
|
|
354
|
+
### Never commit your API key to version control
|
|
355
|
+
|
|
356
|
+
platform:
|
|
357
|
+
provider: null # foxcite | manual | ahrefs | semrush
|
|
358
|
+
project_id: null
|
|
359
|
+
|
|
360
|
+
### api_key: loaded from SEOMD_API_KEY environment variable
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# SEO.REVERSE.md
|
|
2
|
+
|
|
3
|
+
## {{brand}}
|
|
4
|
+
|
|
5
|
+
### spec v1.0 | https://seomd.dev
|
|
6
|
+
|
|
7
|
+
#### generated: {{date}}
|
|
8
|
+
|
|
9
|
+
## This file is generated by the {{brand}} platform.
|
|
10
|
+
### Do not edit manually — run `npx seomd analyze` to update.
|
|
11
|
+
### Run `npx seomd sync` to pull latest intelligence.
|
|
12
|
+
|
|
13
|
+
## Each page section contains a full reverse engineer analysis:
|
|
14
|
+
|
|
15
|
+
### why_page_won — what the top cited competitor does right
|
|
16
|
+
### citation_hooks — specific patterns to replicate
|
|
17
|
+
### gaps_for_brand — where your page falls short
|
|
18
|
+
### remediation_playbook — step by step fixes with effort/impact
|
|
19
|
+
### fastest_win — highest ROI action to take now
|
|
20
|
+
### suggested_content_outline — ready to use outline for your writer/AI
|
|
21
|
+
|
|
22
|
+
domain: {{domain}}
|
|
23
|
+
brand: "{{brand}}"
|
|
24
|
+
primary_competitor: {{primary_competitor}}
|
|
25
|
+
last_analyzed: null
|
|
26
|
+
next_analysis: null
|
|
27
|
+
source: null
|
|
28
|
+
|
|
29
|
+
## Pages
|
|
30
|
+
### Run `npx seomd analyze` to populate these sections
|
|
31
|
+
|
|
32
|
+
pages:
|
|
33
|
+
|
|
34
|
+
### Homepage
|
|
35
|
+
|
|
36
|
+
- id: homepage
|
|
37
|
+
url: /
|
|
38
|
+
status: planned
|
|
39
|
+
citation_rate: null
|
|
40
|
+
gap_score: null
|
|
41
|
+
top_cited_competitor: null
|
|
42
|
+
|
|
43
|
+
why_page_won: []
|
|
44
|
+
citation_hooks: []
|
|
45
|
+
|
|
46
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
47
|
+
|
|
48
|
+
remediation_playbook: []
|
|
49
|
+
|
|
50
|
+
fastest_win:
|
|
51
|
+
action: null
|
|
52
|
+
estimated_gap_score_improvement: null
|
|
53
|
+
effort: null
|
|
54
|
+
|
|
55
|
+
suggested_content_outline: []
|
|
56
|
+
|
|
57
|
+
### Listing
|
|
58
|
+
|
|
59
|
+
- id: listing
|
|
60
|
+
url: /listings/[slug]
|
|
61
|
+
status: planned
|
|
62
|
+
citation_rate: null
|
|
63
|
+
gap_score: null
|
|
64
|
+
top_cited_competitor: null
|
|
65
|
+
|
|
66
|
+
why_page_won: []
|
|
67
|
+
citation_hooks: []
|
|
68
|
+
|
|
69
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
70
|
+
|
|
71
|
+
remediation_playbook: []
|
|
72
|
+
|
|
73
|
+
fastest_win:
|
|
74
|
+
action: null
|
|
75
|
+
estimated_gap_score_improvement: null
|
|
76
|
+
effort: null
|
|
77
|
+
|
|
78
|
+
suggested_content_outline: []
|
|
79
|
+
|
|
80
|
+
### Category
|
|
81
|
+
|
|
82
|
+
- id: category
|
|
83
|
+
url: /[category]
|
|
84
|
+
status: planned
|
|
85
|
+
citation_rate: null
|
|
86
|
+
gap_score: null
|
|
87
|
+
top_cited_competitor: null
|
|
88
|
+
|
|
89
|
+
why_page_won: []
|
|
90
|
+
citation_hooks: []
|
|
91
|
+
|
|
92
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
93
|
+
|
|
94
|
+
remediation_playbook: []
|
|
95
|
+
|
|
96
|
+
fastest_win:
|
|
97
|
+
action: null
|
|
98
|
+
estimated_gap_score_improvement: null
|
|
99
|
+
effort: null
|
|
100
|
+
|
|
101
|
+
suggested_content_outline: []
|
|
102
|
+
|
|
103
|
+
### Seller-profile
|
|
104
|
+
|
|
105
|
+
- id: seller-profile
|
|
106
|
+
url: /sellers/[slug]
|
|
107
|
+
status: planned
|
|
108
|
+
citation_rate: null
|
|
109
|
+
gap_score: null
|
|
110
|
+
top_cited_competitor: null
|
|
111
|
+
|
|
112
|
+
why_page_won: []
|
|
113
|
+
citation_hooks: []
|
|
114
|
+
|
|
115
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
116
|
+
|
|
117
|
+
remediation_playbook: []
|
|
118
|
+
|
|
119
|
+
fastest_win:
|
|
120
|
+
action: null
|
|
121
|
+
estimated_gap_score_improvement: null
|
|
122
|
+
effort: null
|
|
123
|
+
|
|
124
|
+
suggested_content_outline: []
|
|
125
|
+
|
|
126
|
+
### Search-results
|
|
127
|
+
|
|
128
|
+
- id: search-results
|
|
129
|
+
url: /search
|
|
130
|
+
status: planned
|
|
131
|
+
citation_rate: null
|
|
132
|
+
gap_score: null
|
|
133
|
+
top_cited_competitor: null
|
|
134
|
+
|
|
135
|
+
why_page_won: []
|
|
136
|
+
citation_hooks: []
|
|
137
|
+
|
|
138
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
139
|
+
|
|
140
|
+
remediation_playbook: []
|
|
141
|
+
|
|
142
|
+
fastest_win:
|
|
143
|
+
action: null
|
|
144
|
+
estimated_gap_score_improvement: null
|
|
145
|
+
effort: null
|
|
146
|
+
|
|
147
|
+
suggested_content_outline: []
|
|
148
|
+
|
|
149
|
+
### How-it-works
|
|
150
|
+
|
|
151
|
+
- id: how-it-works
|
|
152
|
+
url: /how-it-works
|
|
153
|
+
status: planned
|
|
154
|
+
citation_rate: null
|
|
155
|
+
gap_score: null
|
|
156
|
+
top_cited_competitor: null
|
|
157
|
+
|
|
158
|
+
why_page_won: []
|
|
159
|
+
citation_hooks: []
|
|
160
|
+
|
|
161
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
162
|
+
|
|
163
|
+
remediation_playbook: []
|
|
164
|
+
|
|
165
|
+
fastest_win:
|
|
166
|
+
action: null
|
|
167
|
+
estimated_gap_score_improvement: null
|
|
168
|
+
effort: null
|
|
169
|
+
|
|
170
|
+
suggested_content_outline: []
|
|
171
|
+
|
|
172
|
+
### Pricing
|
|
173
|
+
|
|
174
|
+
- id: pricing
|
|
175
|
+
url: /pricing
|
|
176
|
+
status: planned
|
|
177
|
+
citation_rate: null
|
|
178
|
+
gap_score: null
|
|
179
|
+
top_cited_competitor: null
|
|
180
|
+
|
|
181
|
+
why_page_won: []
|
|
182
|
+
citation_hooks: []
|
|
183
|
+
|
|
184
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
185
|
+
|
|
186
|
+
remediation_playbook: []
|
|
187
|
+
|
|
188
|
+
fastest_win:
|
|
189
|
+
action: null
|
|
190
|
+
estimated_gap_score_improvement: null
|
|
191
|
+
effort: null
|
|
192
|
+
|
|
193
|
+
suggested_content_outline: []
|
|
194
|
+
|
|
195
|
+
### Trust-safety
|
|
196
|
+
|
|
197
|
+
- id: trust-safety
|
|
198
|
+
url: /trust
|
|
199
|
+
status: planned
|
|
200
|
+
citation_rate: null
|
|
201
|
+
gap_score: null
|
|
202
|
+
top_cited_competitor: null
|
|
203
|
+
|
|
204
|
+
why_page_won: []
|
|
205
|
+
citation_hooks: []
|
|
206
|
+
|
|
207
|
+
gaps_for_{{brand_lower_snake}}: []
|
|
208
|
+
|
|
209
|
+
remediation_playbook: []
|
|
210
|
+
|
|
211
|
+
fastest_win:
|
|
212
|
+
action: null
|
|
213
|
+
estimated_gap_score_improvement: null
|
|
214
|
+
effort: null
|
|
215
|
+
|
|
216
|
+
suggested_content_outline: []
|
|
217
|
+
|
|
218
|
+
## Competitor Profiles
|
|
219
|
+
### Platform populated — competitor citation patterns
|
|
220
|
+
|
|
221
|
+
competitors:
|
|
222
|
+
{{reverse_competitors}}
|