feat: implement programmatic SEO solutions hub
- Add /solutions hub page with 10 category cards - Add /solutions/by-concern directory page - Add /solutions/by-oil directory page - Add Solutions section to Footer with navigation links - Add Breadcrumb component for solution pages - Add translations for all solution pages (sr, en, de, fr) - Fix ExitIntentDetector JSON parsing error - Update sitemap with solution pages - Create 3 sample solution pages with data files
This commit is contained in:
503
docs/PROGRAMMATIC_SEO_PLAN.md
Normal file
503
docs/PROGRAMMATIC_SEO_PLAN.md
Normal file
@@ -0,0 +1,503 @@
|
||||
# Programmatic SEO Plan for ManoonOils
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Create 100+ SEO-optimized landing pages from structured datasets to capture high-intent search traffic and convert visitors into serum buyers.
|
||||
|
||||
---
|
||||
|
||||
## Dataset Ideas (7 Core Categories)
|
||||
|
||||
### 1. **Ingredient Benefits Database** ⭐ Highest Priority
|
||||
**Dataset Size:** 50-100 ingredients × 4 locales = 200-400 pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface Ingredient {
|
||||
slug: string; // "rosehip-oil"
|
||||
name: {
|
||||
sr: "Ulje divlje ruže";
|
||||
en: "Rosehip Oil";
|
||||
de: "Hagebuttenöl";
|
||||
fr: "Huile de rose musquée";
|
||||
};
|
||||
benefits: string[]; // ["anti-aging", "hydration", "scars"]
|
||||
skinTypes: string[]; // ["dry", "mature", "sensitive"]
|
||||
scientificName: string;
|
||||
origin: string;
|
||||
extractionMethod: string;
|
||||
keyCompounds: string[]; // ["vitamin A", "omega-3", "antioxidants"]
|
||||
usageInstructions: string;
|
||||
complementaryIngredients: string[]; // ["vitamin-e", "jojoba-oil"]
|
||||
relatedProducts: string[]; // Product slugs to recommend
|
||||
faqs: FAQ[];
|
||||
seoKeywords: {
|
||||
primary: string;
|
||||
secondary: string[];
|
||||
longTail: string[];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/ingredients/[slug]`
|
||||
- Hero: Ingredient name + key benefit
|
||||
- Scientific overview
|
||||
- Benefits for skin (with icons)
|
||||
- How to use (with video placeholder)
|
||||
- "Best for" skin types
|
||||
- Related Manoon products (product cards)
|
||||
- FAQ schema markup
|
||||
- CTA: "Shop serums with [ingredient]"
|
||||
|
||||
**Example Pages:**
|
||||
- `/ingredients/rosehip-oil` - "Rosehip Oil for Anti-Aging: Benefits & How to Use"
|
||||
- `/ingredients/bakuchiol` - "Bakuchiol: Natural Retinol Alternative"
|
||||
- `/ingredients/sea-buckthorn` - "Sea Buckthorn Oil: Vitamin C Powerhouse"
|
||||
|
||||
---
|
||||
|
||||
### 2. **Skin Concern Solutions** ⭐ Highest Priority
|
||||
**Dataset Size:** 20-30 concerns × 4 locales = 80-120 pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface SkinConcern {
|
||||
slug: string; // "fine-lines"
|
||||
name: {
|
||||
sr: "Bore i linije";
|
||||
en: "Fine Lines & Wrinkles";
|
||||
de: "Feine Linien";
|
||||
fr: "Rides et ridules";
|
||||
};
|
||||
description: string;
|
||||
causes: string[];
|
||||
bestIngredients: string[]; // Links to ingredient pages
|
||||
recommendedRoutine: {
|
||||
morning: string[];
|
||||
evening: string[];
|
||||
};
|
||||
relatedProducts: string[];
|
||||
beforeAfterImages: boolean;
|
||||
testimonials: Testimonial[];
|
||||
seoKeywords: SEOKeywords;
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/concerns/[slug]`
|
||||
- Empathy hook: "Struggling with [concern]?"
|
||||
- Explain the problem
|
||||
- Best ingredients (linking to ingredient pages)
|
||||
- Recommended products
|
||||
- Customer results/testimonials
|
||||
- Free guide download (lead capture)
|
||||
- CTA: "Start your transformation"
|
||||
|
||||
**Example Pages:**
|
||||
- `/concerns/fine-lines` - "How to Reduce Fine Lines Naturally"
|
||||
- `/concerns/hyperpigmentation` - "Dark Spots: Causes & Natural Solutions"
|
||||
- `/concerns/dull-skin` - "Get Your Glow Back: Dull Skin Remedies"
|
||||
|
||||
---
|
||||
|
||||
### 3. **Ingredient Comparison Matrix**
|
||||
**Dataset Size:** 50 ingredient pairs = 50 comparison pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface IngredientComparison {
|
||||
slug: string; // "retinol-vs-bakuchiol"
|
||||
ingredientA: string; // Reference to ingredient
|
||||
ingredientB: string;
|
||||
comparisonPoints: {
|
||||
effectiveness: string;
|
||||
gentleness: string;
|
||||
price: string;
|
||||
availability: string;
|
||||
bestFor: string[];
|
||||
};
|
||||
winner: string | "tie";
|
||||
recommendation: string; // "Choose X if..., Choose Y if..."
|
||||
relatedProducts: {
|
||||
a: string[];
|
||||
b: string[];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/compare/[slug]`
|
||||
- Head-to-head comparison table
|
||||
- Which is better for what
|
||||
- Product recommendations for both
|
||||
- "Can't decide? Try our quiz"
|
||||
- CTA: Shop both options
|
||||
|
||||
**Example Pages:**
|
||||
- `/compare/retinol-vs-bakuchiol`
|
||||
- `/compare/vitamin-c-vs-niacinamide`
|
||||
- `/compare/rosehip-vs-argan-oil`
|
||||
|
||||
---
|
||||
|
||||
### 4. **Seasonal Skincare Guides**
|
||||
**Dataset Size:** 4 seasons × 5 climates × 4 locales = 80 pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface SeasonalGuide {
|
||||
slug: string; // "winter-skincare-routine"
|
||||
season: "winter" | "spring" | "summer" | "autumn";
|
||||
climate: "cold" | "dry" | "humid" | "temperate" | "tropical";
|
||||
title: LocalizedString;
|
||||
challenges: string[];
|
||||
recommendedIngredients: string[];
|
||||
routine: {
|
||||
morning: RoutineStep[];
|
||||
evening: RoutineStep[];
|
||||
};
|
||||
productBundle: string[];
|
||||
tips: string[];
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/guides/seasonal/[slug]`
|
||||
- Season-specific challenges
|
||||
- Ingredient recommendations
|
||||
- Step-by-step routine
|
||||
- Product bundle suggestion
|
||||
- "Get the seasonal routine set" CTA
|
||||
|
||||
**Example Pages:**
|
||||
- `/guides/seasonal/winter-skincare-routine`
|
||||
- `/guides/seasonal/summer-anti-aging`
|
||||
- `/guides/seasonal/spring-skin-renewal`
|
||||
|
||||
---
|
||||
|
||||
### 5. **Age-Specific Routines**
|
||||
**Dataset Size:** 6 age groups × 4 locales = 24 pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface AgeRoutine {
|
||||
slug: string; // "skincare-routine-30s"
|
||||
ageRange: string; // "20s", "30s", "40s", "50s", "60s+"
|
||||
title: LocalizedString;
|
||||
skinChanges: string[];
|
||||
keyConcerns: string[];
|
||||
recommendedIngredients: string[];
|
||||
routine: DailyRoutine;
|
||||
productRecommendations: string[];
|
||||
preventionTips: string[];
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/routines/age/[slug]`
|
||||
- "Best skincare routine for your [age]s"
|
||||
- What happens to skin at this age
|
||||
- Key ingredients to start using
|
||||
- Morning & evening routine
|
||||
- Product recommendations
|
||||
- "Shop the [age]s routine bundle"
|
||||
|
||||
**Example Pages:**
|
||||
- `/routines/age/skincare-routine-30s`
|
||||
- `/routines/age/anti-aging-routine-40s`
|
||||
- `/routines/age/mature-skin-care-50s`
|
||||
|
||||
---
|
||||
|
||||
### 6. **Skin Type Hubs**
|
||||
**Dataset Size:** 6 skin types × 4 locales = 24 pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface SkinType {
|
||||
slug: string; // "dry-skin"
|
||||
name: LocalizedString;
|
||||
characteristics: string[];
|
||||
causes: string[];
|
||||
ingredientsToLookFor: string[];
|
||||
ingredientsToAvoid: string[];
|
||||
recommendedProducts: string[];
|
||||
routine: DailyRoutine;
|
||||
tips: string[];
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/skin-types/[slug]`
|
||||
- Quiz: "Do you have [skin type]?"
|
||||
- Characteristics checklist
|
||||
- Best ingredients (with links)
|
||||
- Complete routine
|
||||
- Products specifically for this type
|
||||
- CTA: "Build your [type] routine"
|
||||
|
||||
**Example Pages:**
|
||||
- `/skin-types/dry-skin`
|
||||
- `/skin-types/sensitive-skin`
|
||||
- `/skin-types/combination-skin`
|
||||
|
||||
---
|
||||
|
||||
### 7. **Geographic/Climate-Specific**
|
||||
**Dataset Size:** 20 regions × 4 seasons = 80 pages
|
||||
|
||||
**Data Structure:**
|
||||
```typescript
|
||||
interface ClimateGuide {
|
||||
slug: string; // "skincare-for-cold-climates"
|
||||
region: string;
|
||||
climate: string;
|
||||
challenges: string[];
|
||||
recommendedIngredients: string[];
|
||||
routineModifications: string;
|
||||
productBundle: string[];
|
||||
localTestimonials?: Testimonial[];
|
||||
}
|
||||
```
|
||||
|
||||
**Page Template:** `/climate/[slug]`
|
||||
- "Skincare for [climate] climates"
|
||||
- Local skin challenges
|
||||
- Best ingredients for this climate
|
||||
- Modified routine
|
||||
- "Customers in [region] love..."
|
||||
|
||||
**Example Pages:**
|
||||
- `/climate/skincare-for-cold-climates`
|
||||
- `/climate/skincare-for-humid-climates`
|
||||
- `/climate/skincare-for-arid-climates`
|
||||
|
||||
---
|
||||
|
||||
## Data Storage Strategy
|
||||
|
||||
### Option A: JSON Files (Recommended for MVP)
|
||||
```
|
||||
data/
|
||||
├── ingredients/
|
||||
│ ├── rosehip-oil.json
|
||||
│ ├── bakuchiol.json
|
||||
│ └── ...
|
||||
├── concerns/
|
||||
│ ├── fine-lines.json
|
||||
│ ├── hyperpigmentation.json
|
||||
│ └── ...
|
||||
├── comparisons/
|
||||
│ ├── retinol-vs-bakuchiol.json
|
||||
│ └── ...
|
||||
└── locales/
|
||||
├── sr/
|
||||
├── en/
|
||||
├── de/
|
||||
└── fr/
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- Easy to version control
|
||||
- Simple to edit
|
||||
- Fast to implement
|
||||
- Works with Next.js static generation
|
||||
|
||||
### Option B: Headless CMS (Strapi/Sanity)
|
||||
**Pros:**
|
||||
- Non-technical team can edit
|
||||
- Rich media support
|
||||
- Relationships between entities
|
||||
|
||||
### Option C: Database (PostgreSQL/MongoDB)
|
||||
**Pros:**
|
||||
- Dynamic content
|
||||
- User-generated content ready
|
||||
- Advanced filtering
|
||||
|
||||
---
|
||||
|
||||
## Technical Implementation
|
||||
|
||||
### URL Structure
|
||||
```
|
||||
/ingredients/[slug] # Ingredient deep-dives
|
||||
/concerns/[slug] # Problem-solving pages
|
||||
/compare/[slug] # Comparison pages
|
||||
/guides/seasonal/[slug] # Seasonal content
|
||||
/routines/age/[slug] # Age-specific routines
|
||||
/skin-types/[slug] # Skin type hubs
|
||||
/climate/[slug] # Climate guides
|
||||
```
|
||||
|
||||
### Page Generation (Next.js)
|
||||
```typescript
|
||||
// app/ingredients/[slug]/page.tsx
|
||||
export async function generateStaticParams() {
|
||||
const ingredients = await getAllIngredients();
|
||||
return ingredients.map((i) => ({ slug: i.slug }));
|
||||
}
|
||||
|
||||
export default async function IngredientPage({
|
||||
params: { slug, locale }
|
||||
}) {
|
||||
const ingredient = await getIngredient(slug, locale);
|
||||
return <IngredientTemplate data={ingredient} />;
|
||||
}
|
||||
```
|
||||
|
||||
### SEO Template Fields (Per Page)
|
||||
```typescript
|
||||
interface SEOTemplate {
|
||||
title: string; // "Rosehip Oil for Anti-Aging | Benefits & Uses | ManoonOils"
|
||||
metaDescription: string; // 155 chars with keywords
|
||||
canonical: string; // Full URL
|
||||
ogTitle: string;
|
||||
ogDescription: string;
|
||||
ogImage: string; // Dynamic OG image with ingredient
|
||||
keywords: string[];
|
||||
faqSchema: FAQPageSchema;
|
||||
productSchema?: ProductSchema;
|
||||
breadcrumb: BreadcrumbItem[];
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Content Templates
|
||||
|
||||
### Ingredient Page Template
|
||||
```
|
||||
H1: [Ingredient Name] for [Primary Benefit]: Complete Guide
|
||||
|
||||
Hero Section:
|
||||
- Large ingredient image
|
||||
- Key benefits (3 icons)
|
||||
- CTA: "Shop [ingredient] serums"
|
||||
|
||||
H2: What is [Ingredient]?
|
||||
- Scientific explanation
|
||||
- Origin & extraction
|
||||
- Key compounds
|
||||
|
||||
H2: Benefits of [Ingredient] for Skin
|
||||
- H3: Anti-aging properties
|
||||
- H3: Hydration benefits
|
||||
- H3: Additional benefits
|
||||
|
||||
H2: Best Skin Types for [Ingredient]
|
||||
- Visual skin type selector
|
||||
|
||||
H2: How to Use [Ingredient] in Your Routine
|
||||
- Morning routine
|
||||
- Evening routine
|
||||
- What to pair with (links to comparisons)
|
||||
|
||||
H2: Our [Ingredient] Products
|
||||
- Product cards with prices
|
||||
- "Shop all [ingredient] products"
|
||||
|
||||
H2: Frequently Asked Questions
|
||||
- FAQ schema markup
|
||||
- 5-7 common questions
|
||||
|
||||
Related Content:
|
||||
- Compare with similar ingredients
|
||||
- Read about skin concerns it treats
|
||||
|
||||
CTA: "Start your [ingredient] routine"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Conversion Strategy
|
||||
|
||||
### Lead Magnets (Email Capture)
|
||||
1. **"The Natural Anti-Aging Guide"** - PDF download
|
||||
2. **"Ingredient Compatibility Chart"** - Interactive tool
|
||||
3. **"Personalized Routine Quiz"** - Email results
|
||||
4. **"Seasonal Skincare Calendar"** - Year-long guide
|
||||
|
||||
### Product CTAs
|
||||
1. **Primary:** "Shop [ingredient] serums" → Category page
|
||||
2. **Secondary:** "Get the complete routine" → Bundle offer
|
||||
3. **Tertiary:** "Take the skin quiz" → Lead capture
|
||||
|
||||
### Cross-Selling
|
||||
- "Customers who viewed [ingredient] also bought..."
|
||||
- "Complete your routine with..."
|
||||
- "Pair with [complementary ingredient] for best results"
|
||||
|
||||
---
|
||||
|
||||
## Expected Traffic & ROI
|
||||
|
||||
### Traffic Estimates (6-month projection)
|
||||
| Dataset | Pages | Avg Monthly Searches/Page | Est. Monthly Traffic |
|
||||
|---------|-------|---------------------------|---------------------|
|
||||
| Ingredients | 100 | 500 | 5,000 |
|
||||
| Concerns | 50 | 1,000 | 10,000 |
|
||||
| Comparisons | 50 | 800 | 8,000 |
|
||||
| Seasonal | 80 | 300 | 6,000 |
|
||||
| Age Routines | 24 | 600 | 3,000 |
|
||||
| Skin Types | 24 | 700 | 3,000 |
|
||||
| Climate | 80 | 200 | 2,000 |
|
||||
| **TOTAL** | **408** | **-** | **37,000** |
|
||||
|
||||
### Conversion Targets
|
||||
- **Organic CTR:** 3-5% (industry average)
|
||||
- **Page-to-Product CTR:** 15-20%
|
||||
- **Product-to-Purchase:** 2-3%
|
||||
- **Estimated Monthly Revenue:** €15,000-30,000 (at €50 AOV)
|
||||
|
||||
---
|
||||
|
||||
## Implementation Timeline
|
||||
|
||||
### Phase 1: Foundation (Weeks 1-2)
|
||||
- [ ] Set up data structure
|
||||
- [ ] Create 10 priority ingredient pages
|
||||
- [ ] Build reusable templates
|
||||
- [ ] Implement JSON-LD schemas
|
||||
|
||||
### Phase 2: Core Content (Weeks 3-6)
|
||||
- [ ] Create 50 ingredient pages
|
||||
- [ ] Create 20 concern pages
|
||||
- [ ] Build comparison tool
|
||||
- [ ] Add lead magnets
|
||||
|
||||
### Phase 3: Scale (Weeks 7-10)
|
||||
- [ ] Generate all 400+ pages
|
||||
- [ ] Implement internal linking
|
||||
- [ ] Add dynamic OG images
|
||||
- [ ] A/B test CTAs
|
||||
|
||||
### Phase 4: Optimize (Weeks 11-12)
|
||||
- [ ] Analyze top performers
|
||||
- [ ] Update underperformers
|
||||
- [ ] Add user-generated content
|
||||
- [ ] Expand winning categories
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics
|
||||
|
||||
### SEO Metrics
|
||||
- **Organic traffic:** 37,000+/month by month 6
|
||||
- **Keyword rankings:** Top 10 for 100+ keywords
|
||||
- **Featured snippets:** Capture 20+ position 0
|
||||
- **Domain authority:** Increase from current baseline
|
||||
|
||||
### Business Metrics
|
||||
- **Revenue from organic:** €15,000-30,000/month
|
||||
- **Email list growth:** 1,000+ subscribers/month
|
||||
- **Customer acquisition cost:** Lower than paid ads
|
||||
- **Lifetime value:** Higher (organic customers retain better)
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Approve dataset priorities** - Which categories to start with?
|
||||
2. **Create data structure** - Set up JSON/CMS schemas
|
||||
3. **Build 3 sample pages** - One from each priority category
|
||||
4. **Test & iterate** - Measure performance before scaling
|
||||
5. **Full production** - Generate all 400+ pages
|
||||
|
||||
Want me to start building the data structure and first sample pages?
|
||||
Reference in New Issue
Block a user