claude-plugin-wordpress-manager 2.12.2 → 2.14.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 (62) hide show
  1. package/.claude-plugin/plugin.json +8 -3
  2. package/CHANGELOG.md +94 -2
  3. package/agents/wp-accessibility-auditor.md +1 -1
  4. package/agents/wp-content-strategist.md +2 -2
  5. package/agents/wp-deployment-engineer.md +1 -1
  6. package/agents/wp-distribution-manager.md +1 -1
  7. package/agents/wp-monitoring-agent.md +1 -1
  8. package/agents/wp-performance-optimizer.md +1 -1
  9. package/agents/wp-security-auditor.md +1 -1
  10. package/agents/wp-site-manager.md +3 -3
  11. package/commands/wp-setup.md +2 -2
  12. package/docs/GUIDE.md +260 -21
  13. package/docs/VALIDATION.md +341 -0
  14. package/docs/guides/wp-ecommerce.md +4 -4
  15. package/docs/plans/2026-03-01-tier3-wcop-implementation.md +1 -1
  16. package/docs/plans/2026-03-01-tier4-5-implementation.md +1 -1
  17. package/docs/plans/2026-03-02-content-framework-architecture.md +612 -0
  18. package/docs/plans/2026-03-02-content-framework-strategic-reflections.md +228 -0
  19. package/docs/plans/2026-03-02-content-intelligence-phase2.md +560 -0
  20. package/docs/plans/2026-03-02-content-pipeline-phase1.md +456 -0
  21. package/docs/plans/2026-03-02-dashboard-kanban-design.md +761 -0
  22. package/docs/plans/2026-03-02-dashboard-kanban-implementation.md +598 -0
  23. package/docs/plans/2026-03-02-dashboard-strategy.md +363 -0
  24. package/docs/plans/2026-03-02-editorial-calendar-phase3.md +490 -0
  25. package/docs/validation/.gitkeep +0 -0
  26. package/docs/validation/dashboard.html +286 -0
  27. package/docs/validation/results.json +1705 -0
  28. package/package.json +16 -3
  29. package/scripts/context-scanner.mjs +446 -0
  30. package/scripts/dashboard-renderer.mjs +553 -0
  31. package/scripts/run-validation.mjs +1132 -0
  32. package/servers/wp-rest-bridge/build/server.js +17 -6
  33. package/servers/wp-rest-bridge/build/tools/index.js +0 -9
  34. package/servers/wp-rest-bridge/build/tools/plugin-repository.js +23 -31
  35. package/servers/wp-rest-bridge/build/tools/schema.js +10 -2
  36. package/servers/wp-rest-bridge/build/tools/unified-content.js +10 -2
  37. package/servers/wp-rest-bridge/build/wordpress.d.ts +0 -3
  38. package/servers/wp-rest-bridge/build/wordpress.js +16 -98
  39. package/servers/wp-rest-bridge/package.json +1 -0
  40. package/skills/wp-analytics/SKILL.md +153 -0
  41. package/skills/wp-analytics/references/signals-feed-schema.md +417 -0
  42. package/skills/wp-content/references/content-templates.md +1 -1
  43. package/skills/wp-content/references/seo-optimization.md +8 -8
  44. package/skills/wp-content-attribution/references/roi-calculation.md +1 -1
  45. package/skills/wp-content-attribution/references/utm-tracking-setup.md +5 -5
  46. package/skills/wp-content-generation/references/generation-workflow.md +2 -2
  47. package/skills/wp-content-pipeline/SKILL.md +461 -0
  48. package/skills/wp-content-pipeline/references/content-brief-schema.md +377 -0
  49. package/skills/wp-content-pipeline/references/site-config-schema.md +431 -0
  50. package/skills/wp-content-repurposing/references/auto-transform-pipeline.md +1 -1
  51. package/skills/wp-content-repurposing/references/email-newsletter.md +1 -1
  52. package/skills/wp-content-repurposing/references/platform-specs.md +2 -2
  53. package/skills/wp-content-repurposing/references/transform-templates.md +27 -27
  54. package/skills/wp-dashboard/SKILL.md +121 -0
  55. package/skills/wp-deploy/references/ssh-deploy.md +2 -2
  56. package/skills/wp-editorial-planner/SKILL.md +262 -0
  57. package/skills/wp-editorial-planner/references/editorial-schema.md +268 -0
  58. package/skills/wp-multilang-network/references/content-sync.md +3 -3
  59. package/skills/wp-multilang-network/references/network-architecture.md +1 -1
  60. package/skills/wp-multilang-network/references/seo-international.md +7 -7
  61. package/skills/wp-structured-data/references/schema-types.md +4 -4
  62. package/skills/wp-webhooks/references/payload-formats.md +3 -3
@@ -0,0 +1,417 @@
1
+ # Signals Feed Schema
2
+
3
+ **Version**: 1.0.0
4
+ **Phase**: Content Intelligence (Phase 2)
5
+ **Location**: `.content-state/signals-feed.md`
6
+
7
+ ## Overview
8
+
9
+ The `signals-feed.md` file bridges wp-analytics output and GenSignal input. It translates WordPress metrics collected by GA4, Plausible, GSC, and Core Web Vitals tools into the NormalizedEvent format, enabling GenSignal's pattern detection and scoring pipelines to operate on WordPress analytics data without custom adapters. Each feed is a point-in-time snapshot covering a defined measurement period with optional period-over-period delta calculations.
10
+
11
+ ## Frontmatter Fields
12
+
13
+ The file uses YAML frontmatter to declare feed metadata.
14
+
15
+ | Field | Type | Required | Default | Description |
16
+ |-------|------|----------|---------|-------------|
17
+ | `feed_id` | string | Yes | -- | Unique identifier. Format: `FEED-{site_id}-YYYY-MM` |
18
+ | `site_id` | string | Yes | -- | Must match a `.content-state/{site_id}.config.md` |
19
+ | `generated` | ISO 8601 | Yes | -- | Timestamp auto-set at generation time |
20
+ | `period` | string | Yes | -- | Measurement window. Format: `YYYY-MM-DD..YYYY-MM-DD` |
21
+ | `comparison_period` | string | No | -- | Baseline window. Auto-calculated: same duration offset backward |
22
+ | `source_tools` | string[] | Yes | -- | List of MCP tools that contributed data to this feed |
23
+ | `anomaly_threshold` | number | No | 30 | Percentage delta that qualifies an event as an anomaly |
24
+ | `status` | enum | No | generated | One of: `generated`, `reviewed`, `actioned` |
25
+
26
+ ### Field Notes
27
+
28
+ - `feed_id` is deterministic: regenerating the feed for the same site and month produces the same ID
29
+ - `site_id` is validated against existing `.content-state/{site_id}.config.md` files
30
+ - `comparison_period` is omitted when no historical data exists (first run)
31
+ - `source_tools` lists only tools that returned data, not all tools attempted
32
+
33
+ ## NormalizedEvent Format
34
+
35
+ Each event in the feed body represents a single metric observation for an entity during the measurement period.
36
+
37
+ ### Fields
38
+
39
+ | Field | Type | Required | Description |
40
+ |-------|------|----------|-------------|
41
+ | `entity_id` | string | Yes | Format: `{EntityType}:{identifier}` |
42
+ | `relation` | string | Yes | The metric being measured |
43
+ | `value` | number | Yes | Metric value for the current period |
44
+ | `unit` | string | Yes | One of: `count`, `seconds`, `percentage`, `position` |
45
+ | `ts` | ISO 8601 | Yes | End of measurement period |
46
+ | `delta_pct` | integer | No | % change vs comparison period. Positive = increase. Omitted if no baseline. Note: in YAML `+47` and `47` are equivalent integers; the `+` prefix is a display convention only |
47
+ | `provenance` | object | Yes | Data origin metadata |
48
+
49
+ ### Entity Types
50
+
51
+ The `entity_id` field uses a typed prefix to identify the entity:
52
+
53
+ | Prefix | Format | Example |
54
+ |--------|--------|---------|
55
+ | `Page:` | `Page:{url_path}` | `Page:/premium-water-benefici` |
56
+ | `Keyword:` | `Keyword:{search_term}` | `Keyword:acqua premium` |
57
+ | `Source:` | `Source:{source_name}` | `Source:linkedin` |
58
+ | `Site:` | `Site:{site_id}` | `Site:mysite` |
59
+
60
+ ### Valid Relations by Entity Type
61
+
62
+ **Page**
63
+
64
+ | Relation | Unit | Description |
65
+ |----------|------|-------------|
66
+ | `pageviews` | count | Total page views in the period |
67
+ | `sessions` | count | Sessions that included this page |
68
+ | `avg_engagement_time` | seconds | Mean engaged time on the page |
69
+ | `bounce_rate` | percentage | Non-engaged session rate |
70
+ | `conversions` | count | Conversion events on this page |
71
+
72
+ **Keyword**
73
+
74
+ | Relation | Unit | Description |
75
+ |----------|------|-------------|
76
+ | `search_impressions` | count | Times the page appeared in search results |
77
+ | `search_clicks` | count | Clicks from search results |
78
+ | `search_ctr` | percentage | Click-through rate from search |
79
+ | `search_position` | position | Average ranking position |
80
+
81
+ **Source**
82
+
83
+ | Relation | Unit | Description |
84
+ |----------|------|-------------|
85
+ | `referral_sessions` | count | Sessions from this traffic source |
86
+ | `referral_conversions` | count | Conversions from this traffic source |
87
+ | `referral_bounce_rate` | percentage | Bounce rate for sessions from this source |
88
+
89
+ **Site**
90
+
91
+ | Relation | Unit | Description |
92
+ |----------|------|-------------|
93
+ | `total_sessions` | count | Total sessions across all pages |
94
+ | `total_pageviews` | count | Total page views across all pages |
95
+ | `total_conversions` | count | Total conversions site-wide |
96
+ | `lcp` | seconds | Largest Contentful Paint (Core Web Vital) |
97
+ | `cls` | count | Cumulative Layout Shift (Core Web Vital, unitless score). `count` is used as catch-all for unitless numeric values when no more specific unit applies |
98
+ | `inp` | seconds | Interaction to Next Paint (Core Web Vital) |
99
+ | `fcp` | seconds | First Contentful Paint |
100
+ | `ttfb` | seconds | Time to First Byte |
101
+
102
+ > All CWV time-based metrics are normalized to **seconds** for consistency with other time metrics. API values in milliseconds should be divided by 1000.
103
+
104
+ ### Provenance Object
105
+
106
+ | Field | Type | Required | Description |
107
+ |-------|------|----------|-------------|
108
+ | `source_id` | string | Yes | MCP tool name that produced this data point (e.g., `ga4_top_pages`) |
109
+ | `site` | string | Yes | The `site_id` this data belongs to |
110
+
111
+ ### GenSignal Compatibility
112
+
113
+ The NormalizedEvent format maps 1:1 to GenSignal's Harvest stage input:
114
+
115
+ - The `entity_id` format uses GenSignal's `{Type}:{identifier}` convention, so events can be ingested without transformation
116
+ - The `provenance` block enables GenSignal's `quality.corroboration` scoring by tracking which tool produced each data point
117
+ - Multiple events for the same entity from different tools strengthen corroboration scores
118
+ - The `delta_pct` field provides pre-computed trend data that GenSignal's Detect stage can use directly
119
+
120
+ ## Body Structure
121
+
122
+ The Markdown body after frontmatter contains YAML code blocks organized by signal category.
123
+
124
+ ### Section Layout
125
+
126
+ ```
127
+ # Normalized Events
128
+
129
+ ## Traffic Signals
130
+ (Page-level metrics from GA4/Plausible)
131
+
132
+ ## Search Signals
133
+ (Keyword-level metrics from GSC)
134
+
135
+ ## Source Signals
136
+ (Traffic source metrics from GA4)
137
+
138
+ ## Performance Signals
139
+ (CWV metrics from CrUX/PageSpeed)
140
+
141
+ # Anomalies & Patterns
142
+ (Markdown table of detected anomalies)
143
+ ```
144
+
145
+ ### Traffic Signals
146
+
147
+ Contains `Page:` entity events sourced from `ga4_top_pages`, `ga4_report`, or `pl_aggregate`. Each event is a YAML object in a fenced code block.
148
+
149
+ ### Search Signals
150
+
151
+ Contains `Keyword:` entity events sourced from `gsc_search_analytics`. Captures search visibility and click behavior.
152
+
153
+ ### Source Signals
154
+
155
+ Contains `Source:` entity events sourced from `ga4_traffic_sources`. Tracks referral performance by channel.
156
+
157
+ ### Performance Signals
158
+
159
+ Contains `Site:` entity events sourced from `cwv_crux_origin` (site-level) or `cwv_pagespeed` (URL-level). Captures Core Web Vitals and loading metrics.
160
+
161
+ ### Anomalies & Patterns
162
+
163
+ A Markdown table listing all events where `|delta_pct| >= anomaly_threshold`. Only events that exceed the threshold appear here.
164
+
165
+ | Column | Description |
166
+ |--------|-------------|
167
+ | Entity | The `entity_id` of the anomalous event |
168
+ | Metric | The `relation` that triggered the anomaly |
169
+ | Delta | The `delta_pct` value with sign (e.g., `+120%`) |
170
+ | Pattern Match | Name of the matched GenSignal pattern, or "Unclassified anomaly" |
171
+ | Action | Recommended action template |
172
+
173
+ ## Delta Calculation Rules
174
+
175
+ Period-over-period deltas compare the current `period` to the `comparison_period`.
176
+
177
+ ### Formula
178
+
179
+ ```
180
+ delta_pct = round(((current - previous) / previous) * 100)
181
+ ```
182
+
183
+ ### Edge Cases
184
+
185
+ | Scenario | Result |
186
+ |----------|--------|
187
+ | `previous = 0` and `current > 0` | `delta_pct = +999` |
188
+ | `previous = 0` and `current = 0` | `delta_pct = 0` |
189
+ | No previous data available | Omit `delta_pct` entirely |
190
+ | Normal calculation | Round to nearest integer |
191
+
192
+ ### Notes
193
+
194
+ - Values are always integers (no decimal places)
195
+ - Positive values indicate an increase, negative values a decrease
196
+ - The `comparison_period` frontmatter field records which period was used as baseline
197
+ - When `comparison_period` is omitted, no event will have a `delta_pct` field
198
+
199
+ ## GenSignal Pattern Matching
200
+
201
+ Three patterns are detectable from WordPress analytics data alone. The wp-analytics Step 7 evaluates each anomaly against these patterns before writing the Anomalies & Patterns table.
202
+
203
+ ### 1. Search Intent Shift
204
+
205
+ Users are clicking more on existing rankings, indicating growing search intent for the topic.
206
+
207
+ **Detection**: GSC shows `search_ctr` increasing while `search_position` remains stable -- users are clicking more on existing rankings without position changes.
208
+
209
+ **Trigger conditions** (any):
210
+ - `search_ctr` delta >= +20% sustained over the measurement period
211
+ - `search_impressions` delta >= +50% on keywords containing commercial modifiers (e.g., "comprare", "prezzo", "migliore", "acquistare") -- commercial modifiers are a strong signal qualifier
212
+ - `search_impressions` delta >= +100% on any keyword, regardless of modifiers
213
+
214
+ **Data sources**: `gsc_search_analytics`
215
+
216
+ **Action template**: `"Investigate: content cluster opportunity"`
217
+
218
+ ### 2. Early-Adopter Surge
219
+
220
+ A single traffic source is growing disproportionately compared to overall site traffic, signaling an emerging audience channel.
221
+
222
+ **Detection**: Single traffic source shows disproportionate growth vs other sources.
223
+
224
+ **Trigger conditions**:
225
+ - A single `Source:*` entity has `referral_sessions` delta >= +50%
226
+ - AND site-level `total_sessions` delta < +20%
227
+
228
+ **Data sources**: `ga4_traffic_sources`
229
+
230
+ **Action template**: `"Scale: increase posting frequency on {source}"`
231
+
232
+ ### 3. Hype-to-Utility Crossover
233
+
234
+ Engagement metrics improve while raw pageviews plateau, indicating a shift from curiosity-driven to utility-driven traffic.
235
+
236
+ **Detection**: Engagement improving while raw pageviews plateau -- shift from curiosity to utility traffic.
237
+
238
+ **Trigger conditions** (all must be true):
239
+ - `avg_engagement_time` delta >= +15%
240
+ - `bounce_rate` delta <= -10%
241
+ - `pageviews` delta between -20% and +10%
242
+
243
+ **Data sources**: `ga4_top_pages`, `ga4_report`
244
+
245
+ **Action template**: `"Shift: add conversion touchpoints to high-engagement pages"`
246
+
247
+ ### Unclassified Anomalies
248
+
249
+ Any anomaly (event with `|delta_pct| >= anomaly_threshold`) that does not match one of the three patterns above is labeled:
250
+
251
+ - **Pattern Match**: `"Unclassified anomaly"`
252
+ - **Action**: `"Review: investigate cause of {delta_pct} change in {relation}"`
253
+
254
+ ## Status Lifecycle
255
+
256
+ ```
257
+ generated --> reviewed --> actioned
258
+ ```
259
+
260
+ | Status | Meaning | Set By |
261
+ |--------|---------|--------|
262
+ | `generated` | Created by wp-analytics Step 7. No human review yet | Automated |
263
+ | `reviewed` | User or Claude reviewed anomalies, confirmed or dismissed findings | Manual |
264
+ | `actioned` | Findings acted upon -- briefs created, campaigns launched, or changes deployed | Manual |
265
+
266
+ Status transitions are forward-only. A feed does not revert from `actioned` to `reviewed`.
267
+
268
+ ## Integration Notes
269
+
270
+ ### GenSignal
271
+
272
+ NormalizedEvent maps 1:1 to the GenSignal Harvest stage. The `provenance` block enables corroboration scoring. Multiple source tools reporting on the same entity strengthen the signal quality score.
273
+
274
+ ### Phase 1 Bridge (wp-content-pipeline)
275
+
276
+ Anomalies with the action `"Investigate: content cluster opportunity"` feed the `wp-content-pipeline` skill by creating content briefs in `pipeline-active/`. The Search Intent Shift pattern is the primary trigger for new content ideation.
277
+
278
+ ### Phase 3 Bridge (wp-editorial-planner)
279
+
280
+ The Anomalies & Patterns table provides data-driven topic suggestions for `wp-editorial-planner`. Each anomaly row can be converted into an editorial calendar entry with priority based on delta magnitude.
281
+
282
+ ### Overwrite Semantics
283
+
284
+ `signals-feed.md` is overwritten each time Step 7 runs. It is not archived -- it is a point-in-time snapshot. The `comparison_period` field preserves the baseline reference so the context of delta calculations is never lost. For historical tracking, rely on the underlying analytics platforms (GA4, GSC) rather than feed archives.
285
+
286
+ ## Validation Rules
287
+
288
+ Before writing a `signals-feed.md` file, Step 7 validates the following:
289
+
290
+ | Rule | Check |
291
+ |------|-------|
292
+ | `feed_id` format | Must follow `FEED-{site_id}-YYYY-MM` pattern |
293
+ | `site_id` exists | Must match an existing `.content-state/{site_id}.config.md` |
294
+ | Event completeness | Every event must have `entity_id`, `relation`, `value`, `unit`, `ts`, and `provenance` |
295
+ | Entity prefix | `entity_id` must use a recognized prefix: `Page:`, `Keyword:`, `Source:`, `Site:` |
296
+ | Relation validity | `relation` must be valid for the entity type (see Valid Relations table) |
297
+ | Delta type | `delta_pct` values must be integers when present |
298
+ | Threshold value | `anomaly_threshold` must be a positive number |
299
+
300
+ If any validation fails, Step 7 logs the error and does not write the file.
301
+
302
+ ## Example Feed
303
+
304
+ A complete `signals-feed.md` for the mysite site, February 2026.
305
+
306
+ ````markdown
307
+ ---
308
+ feed_id: "FEED-mysite-2026-02"
309
+ site_id: mysite
310
+ generated: "2026-03-01T09:00:00Z"
311
+ period: "2026-02-01..2026-02-28"
312
+ comparison_period: "2026-01-01..2026-01-31"
313
+ source_tools:
314
+ - ga4_top_pages
315
+ - ga4_traffic_sources
316
+ - ga4_report
317
+ - gsc_search_analytics
318
+ - cwv_crux_origin
319
+ anomaly_threshold: 30
320
+ status: generated
321
+ ---
322
+
323
+ # Normalized Events
324
+
325
+ ## Traffic Signals
326
+
327
+ ```yaml
328
+ - entity_id: "Page:/premium-water-benefici"
329
+ relation: pageviews
330
+ value: 3240
331
+ unit: count
332
+ ts: "2026-02-28T23:59:59Z"
333
+ delta_pct: +47
334
+ provenance:
335
+ source_id: ga4_top_pages
336
+ site: mysite
337
+
338
+ - entity_id: "Page:/premium-water-benefici"
339
+ relation: avg_engagement_time
340
+ value: 185
341
+ unit: seconds
342
+ ts: "2026-02-28T23:59:59Z"
343
+ delta_pct: +12
344
+ provenance:
345
+ source_id: ga4_top_pages
346
+ site: mysite
347
+
348
+ - entity_id: "Page:/prodotti"
349
+ relation: pageviews
350
+ value: 1850
351
+ unit: count
352
+ ts: "2026-02-28T23:59:59Z"
353
+ delta_pct: +8
354
+ provenance:
355
+ source_id: ga4_top_pages
356
+ site: mysite
357
+ ```
358
+
359
+ ## Search Signals
360
+
361
+ ```yaml
362
+ - entity_id: "Keyword:acqua premium"
363
+ relation: search_impressions
364
+ value: 8500
365
+ unit: count
366
+ ts: "2026-02-28T23:59:59Z"
367
+ delta_pct: +120
368
+ provenance:
369
+ source_id: gsc_search_analytics
370
+ site: mysite
371
+
372
+ - entity_id: "Keyword:acqua premium benefici"
373
+ relation: search_ctr
374
+ value: 4.2
375
+ unit: percentage
376
+ ts: "2026-02-28T23:59:59Z"
377
+ delta_pct: -8
378
+ provenance:
379
+ source_id: gsc_search_analytics
380
+ site: mysite
381
+ ```
382
+
383
+ ## Source Signals
384
+
385
+ ```yaml
386
+ - entity_id: "Source:linkedin"
387
+ relation: referral_sessions
388
+ value: 420
389
+ unit: count
390
+ ts: "2026-02-28T23:59:59Z"
391
+ delta_pct: +85
392
+ provenance:
393
+ source_id: ga4_traffic_sources
394
+ site: mysite
395
+ ```
396
+
397
+ ## Performance Signals
398
+
399
+ ```yaml
400
+ - entity_id: "Site:mysite"
401
+ relation: lcp
402
+ value: 2.1
403
+ unit: seconds
404
+ ts: "2026-02-28T23:59:59Z"
405
+ provenance:
406
+ source_id: cwv_crux_origin
407
+ site: mysite
408
+ ```
409
+
410
+ # Anomalies & Patterns
411
+
412
+ | Entity | Metric | Delta | Pattern Match | Action |
413
+ |--------|--------|-------|---------------|--------|
414
+ | Keyword:acqua premium | search_impressions | +120% | Search Intent Shift | Investigate: content cluster opportunity |
415
+ | Source:linkedin | referral_sessions | +85% | Early-Adopter Surge | Scale: increase posting frequency on linkedin |
416
+ | Page:/premium-water-benefici | pageviews | +47% | Unclassified anomaly | Review: investigate cause of +47% change in pageviews |
417
+ ````
@@ -47,7 +47,7 @@ Featured Image: [Relevant, optimized, with alt text]
47
47
 
48
48
  ```
49
49
  Title: [Number] [Keyword] [Benefit/Hook]
50
- Example: "7 Benefits of Cactus Water for Daily Hydration"
50
+ Example: "7 Benefits of Sparkling Water for Daily Hydration"
51
51
 
52
52
  ---
53
53
 
@@ -15,8 +15,8 @@
15
15
  - Avoid keyword stuffing
16
16
 
17
17
  ### Examples
18
- - Good: "Cactus Water Benefits — Zero Calorie Hydration | DolceZero"
19
- - Bad: "Cactus Water Benefits | Best Cactus Water | Buy Cactus Water"
18
+ - Good: "Sparkling Water Benefits — Zero Calorie Hydration | AcmeBrand"
19
+ - Bad: "Sparkling Water Benefits | Best Sparkling Water | Buy Sparkling Water"
20
20
 
21
21
  ## Meta Description (Excerpt)
22
22
 
@@ -33,8 +33,8 @@
33
33
  - Each page must have a unique meta description
34
34
 
35
35
  ### Examples
36
- - Good: "Discover the natural benefits of Sicilian cactus water. Zero calories, rich in antioxidants. Try DolceZero today."
37
- - Bad: "Welcome to our website. We sell cactus water products. Click here."
36
+ - Good: "Discover the natural benefits of premium sparkling water. Zero calories, rich in antioxidants. Try AcmeBrand today."
37
+ - Bad: "Welcome to our website. We sell sparkling water products. Click here."
38
38
 
39
39
  ## URL Slug Optimization
40
40
 
@@ -46,8 +46,8 @@
46
46
  - Never change an existing indexed slug (use 301 redirect)
47
47
 
48
48
  ### Examples
49
- - Good: `/cactus-water-benefits`
50
- - Bad: `/the-amazing-benefits-of-drinking-cactus-water-for-your-health-2026`
49
+ - Good: `/sparkling-water-benefits`
50
+ - Bad: `/the-amazing-benefits-of-drinking-premium-water-for-your-health-2026`
51
51
 
52
52
  ## Heading Hierarchy
53
53
 
@@ -91,13 +91,13 @@ Cluster posts link to each other where relevant
91
91
 
92
92
  ### File Naming
93
93
  ```
94
- Good: cactus-water-bottle-dolcezero.webp
94
+ Good: product-bottle-acmebrand.webp
95
95
  Bad: IMG_20260226_123456.jpg
96
96
  ```
97
97
 
98
98
  ### Alt Text
99
99
  ```
100
- Good: "DolceZero cactus water bottle in three sweetness levels"
100
+ Good: "AcmeBrand sparkling water bottle in three sweetness levels"
101
101
  Bad: "image" or "" (empty)
102
102
  ```
103
103
 
@@ -35,7 +35,7 @@ wc_list_orders(status="completed", after="2025-01-01", before="2025-01-31", per_
35
35
  list_content(type="post", status="publish", after="2025-01-01", before="2025-01-31")
36
36
 
37
37
  # Step 4: Match campaign slugs to post titles
38
- # Result: { post_title: "Cactus Water Benefits", slug: "cactus-water-benefits", revenue: 2500, orders: 15 }
38
+ # Result: { post_title: "Sparkling Water Benefits", slug: "sparkling-water-benefits", revenue: 2500, orders: 15 }
39
39
  ```
40
40
 
41
41
  ### Revenue Per Post Benchmarks
@@ -10,7 +10,7 @@ Use this file when setting up UTM parameter capture for WooCommerce orders — p
10
10
  | `utm_medium` | Marketing channel type | `organic`, `email`, `cpc`, `social`, `referral` |
11
11
  | `utm_campaign` | Specific campaign name | `spring-sale-2025`, `product-launch-x` |
12
12
  | `utm_content` | Differentiates ad/link variants | `cta-button`, `sidebar-banner`, `post-footer` |
13
- | `utm_term` | Paid search keywords | `cactus-water-buy`, `zero-calorie-drink` |
13
+ | `utm_term` | Paid search keywords | `premium-water-buy`, `zero-calorie-drink` |
14
14
 
15
15
  ## mu-plugin Pattern: Capture UTM on Checkout
16
16
 
@@ -113,13 +113,13 @@ Tag all blog-to-product links with UTMs:
113
113
 
114
114
  ```html
115
115
  <!-- Blog post CTA linking to product -->
116
- <a href="/product/cactus-water/?utm_source=blog&utm_medium=cta&utm_campaign=cactus-water-benefits&utm_content=post-footer-button">
117
- Buy Cactus Water
116
+ <a href="/product/premium-water/?utm_source=blog&utm_medium=cta&utm_campaign=sparkling-water-benefits&utm_content=post-footer-button">
117
+ Buy Sparkling Water
118
118
  </a>
119
119
 
120
120
  <!-- Sidebar widget linking to product -->
121
- <a href="/product/cactus-water/?utm_source=blog&utm_medium=sidebar&utm_campaign=always-on&utm_content=product-widget">
122
- Try Cactus Water
121
+ <a href="/product/premium-water/?utm_source=blog&utm_medium=sidebar&utm_campaign=always-on&utm_content=product-widget">
122
+ Try Sparkling Water
123
123
  </a>
124
124
  ```
125
125
 
@@ -12,8 +12,8 @@
12
12
  **Brief structure:**
13
13
  | Field | Description | Example |
14
14
  |-------|-------------|---------|
15
- | Topic | Main subject | "Benefits of cactus water for athletes" |
16
- | Primary keyword | Target search term | "cactus water benefits" |
15
+ | Topic | Main subject | "Benefits of sparkling water for athletes" |
16
+ | Primary keyword | Target search term | "sparkling water benefits" |
17
17
  | Audience | Who reads this | Health-conscious millennials |
18
18
  | Goal | Content purpose | Drive product page visits |
19
19
  | Format | Content type | Blog post / Tutorial / Listicle |