# Comparison Pages Template Placeholders Reference


**Last Updated:** 2025-11-20

Complete reference guide for all placeholders used in comparison page templates.

## Overview

Both template files (`compare_template_details.php` and `compare_template_nodetails.php`) use placeholders in the format `{PLACEHOLDER}` to mark content that must be replaced when creating a new comparison page.

## Placeholder Format

- **Format**: `{PLACEHOLDER_NAME}` (uppercase with underscores)
- **Lowercase variants**: `{competitor}` (for URLs, file paths)
- **Hyphenated variants**: `{competitor-slug}` (for URL slugs)

## Core Placeholders

### Competitor Name Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR}` | Display name (capitalized) | "Clockin", "Personio", "Planday" | Titles, headings, meta tags, schema, content |
| `{competitor}` | Lowercase slug (no spaces) | "clockin", "personio", "planday" | Image paths, URLs, file names |
| `{competitor-slug}` | URL slug (hyphens if needed) | "clockin", "personio", "planday" | Canonical URLs, schema URLs |

**Usage Notes:**
- `{COMPETITOR}`: Use in all user-facing text (titles, headings, descriptions)
- `{competitor}`: Use in file paths, image src attributes, technical references
- `{competitor-slug}`: Use in URLs (canonical, schema, breadcrumbs)

### Rating & Review Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_RATING}` | Overall rating value | "4.9", "4.3", "4.7" | Header rating display, schema aggregateRating |
| `{COMPETITOR_REVIEWS}` | Total review count | "329", "368", "542" | Header review count, schema ratingCount |

**Usage Notes:**
- Rating should match the star display (e.g., 4.9 = 4 full stars + 90% of 5th star)
- Review count should be a number without formatting (e.g., "329" not "329 Bewertungen")

### Content Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_DESCRIPTION}` | Full product description paragraph | "Clockin ist eine Software zur digitalen Zeiterfassung..." | Product description section |
| `{COMPETITOR_CATEGORY}` | Product category | "Zeiterfassung", "HR-Software", "Personalmanagement" | Meta tags, schema, descriptions |
| `{COMPETITOR_FOCUS}` | Focus/use case description | "Schichtplanung, Zeiterfassung & Personalmanagement" | Meta descriptions, hero text |
| `{COMPETITOR_TARGET}` | Target audience | "Unternehmen", "Agenturen", "Mittelständische Unternehmen" | Descriptions (if used) |

**Usage Notes:**
- `{COMPETITOR_DESCRIPTION}`: Should be 2-3 sentences describing the competitor product
- `{COMPETITOR_CATEGORY}`: Use consistent category name throughout
- `{COMPETITOR_FOCUS}`: Should match the competitor's main value proposition

### Image Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_LOGO_ALT}` | Alt text for logo | "clockin", "Personio" | Image alt attribute |
| `{COMPETITOR_LOGO_CLASS}` | Additional CSS classes | "" (empty) or "brightness-0 invert" | Image class attribute |

**Usage Notes:**
- `{COMPETITOR_LOGO_ALT}`: Usually lowercase competitor name
- `{COMPETITOR_LOGO_CLASS}`: 
  - Empty string `""` for normal logos
  - `"brightness-0 invert"` for dark logos on dark backgrounds (like Personio)

**Image Path Pattern:**
- Preload: `/v2/img/alternativen/{competitor}-vergleich-logo-160w.webp`
- Logo: `/v2/img/alternativen/{competitor}-logo.webp`
- Comparison logo: `/v2/img/alternativen/{competitor}-vergleich-logo-160w.webp` and `{competitor}-vergleich-logo-320w.webp`

### Pricing Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_PRICE_STARTING}` | Starting price | "3.19", "0.00", "89" | Schema offers.price |
| `{COMPETITOR_PRICE_UNIT}` | Price unit text | "pro User pro Monat", "auf Anfrage", "pro Standort pro Monat" | Schema priceSpecification.unitText |
| `{COMPETITOR_PRICING_PLANS}` | Complete pricing HTML structure | Full HTML with pricing cards | Pricing section |

**Usage Notes:**
- `{COMPETITOR_PRICE_STARTING}`: Use lowest price if multiple tiers, or "0.00" if on-request pricing
- `{COMPETITOR_PRICE_UNIT}`: Should match competitor's pricing model
- `{COMPETITOR_PRICING_PLANS}`: Replace entire pricing section HTML structure

**Pricing HTML Structure Example:**
```html
<div class="bg-gray-50 rounded-lg p-4">
    <div class="flex justify-between items-start mb-2">
        <div>
            <h5 class="font-medium text-gray-900 mb-1">Plan Name</h5>
            <p class="text-xs text-gray-500">Plan description</p>
        </div>
        <div class="text-right">
            <span class="text-2xl font-bold text-ordio-blue">€X,XX</span>
            <p class="text-sm text-gray-600">/ Unit / Period</p>
        </div>
    </div>
</div>
```

### FAQ Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_FAQ_TITLE}` | FAQ section title | "Häufige Fragen zu Clockin & Zeiterfassung Alternativen 2025" | FAQ section heading |
| `{COMPETITOR_FAQ_ITEMS}` | Complete FAQ HTML structure | Full HTML with all FAQ items | FAQ section body |
| `{COMPETITOR_FAQ_SCHEMA_ITEMS}` | FAQ schema JSON array | JSON array of Question/Answer objects | FAQPage schema |

**Usage Notes:**
- Minimum 5-7 FAQ items required
- FAQ items in HTML must match FAQPage schema items
- FAQ title should include competitor name and category

**FAQ HTML Structure Example:**
```html
<details class="bg-white rounded-lg p-6 [&>summary::-webkit-details-marker]:hidden [&>summary::marker]:content-none group">
    <summary class="font-inter600 text-lg cursor-pointer flex items-center justify-between hover:text-ordio-blue transition-colors duration-200">
        <span>Question text?</span>
        <svg class="w-5 h-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
        </svg>
    </summary>
    <div class="mt-4 text-gray-600 transition-all duration-300 ease-in-out">
        <p class="mb-4">Answer text with <strong>bold</strong> and <a href="/link" class="text-ordio-blue hover:underline">links</a>.</p>
    </div>
</details>
```

**FAQ Schema Structure Example:**
```json
{
    "@type": "Question",
    "name": "Was kostet {COMPETITOR}?",
    "acceptedAnswer": {
        "@type": "Answer",
        "text": "Full answer text here..."
    }
}
```

### Details Template Only Placeholders

These placeholders are **only** used in `compare_template_details.php`:

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_DETAILS_BUTTON}` | Details button text | "Clockin Details", "Planday Details" | Expandable details button |
| `{COMPETITOR_FEATURES}` | Features list HTML | Full HTML with feature items | "Dazu zählen" section |
| `{COMPETITOR_INTEGRATIONS}` | Integrations list HTML | Full HTML with integration items | "Schnittstellen" section |
| `{COMPETITOR_SPECIAL}` | Special characteristics HTML | Full HTML with special items | "Das macht {competitor} besonders" section |

**Usage Notes:**
- Only use these if creating page from Details template
- Each section uses checkmark list items with SVG icons
- Maintain consistent HTML structure for styling

**Feature/Integration/Special HTML Structure Example:**
```html
<div class="flex items-center text-sm text-gray-600 checkmark-container">
    <svg class="w-4 h-4 mr-2 checkmark-icon" fill="#10b981" viewBox="0 0 20 20">
        <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
    </svg>
    Feature/Integration/Special characteristic text
</div>
```

### Schema Placeholders

| Placeholder | Description | Example Values | Used In |
|------------|-------------|----------------|---------|
| `{COMPETITOR_SCHEMA_NAME}` | Schema name (may differ from display) | "ClockIn", "Personio", "Planday" | SoftwareApplication.name |
| `{COMPETITOR_SCHEMA_DESCRIPTION}` | Schema description | Full product description for schema | SoftwareApplication.description |
| `{COMPETITOR_SCHEMA_URL}` | Schema URL slug | "clockin", "personio" | Schema @id and url fields |

**Usage Notes:**
- `{COMPETITOR_SCHEMA_NAME}`: May have different capitalization than display name (e.g., "ClockIn" vs "Clockin")
- `{COMPETITOR_SCHEMA_DESCRIPTION}`: Should be comprehensive product description (2-3 sentences)
- `{COMPETITOR_SCHEMA_URL}`: Usually same as `{competitor-slug}`

## Placeholder Replacement Workflow

### Step 1: Basic Information
Replace these first (use Find & Replace):
1. `{COMPETITOR}` → Competitor display name
2. `{competitor}` → Lowercase slug
3. `{competitor-slug}` → URL slug

### Step 2: Ratings & Reviews
Replace:
- `{COMPETITOR_RATING}` → Rating value
- `{COMPETITOR_REVIEWS}` → Review count

### Step 3: Content
Replace:
- `{COMPETITOR_DESCRIPTION}` → Full description paragraph
- `{COMPETITOR_CATEGORY}` → Category name
- `{COMPETITOR_FOCUS}` → Focus/use case description

### Step 4: Images
Replace:
- `{COMPETITOR_LOGO_ALT}` → Logo alt text
- `{COMPETITOR_LOGO_CLASS}` → CSS classes (or empty string)
- Update image paths: `{competitor}-vergleich-logo-160w.webp`

### Step 5: Pricing
Replace:
- `{COMPETITOR_PRICE_STARTING}` → Starting price
- `{COMPETITOR_PRICE_UNIT}` → Price unit text
- `{COMPETITOR_PRICING_PLANS}` → Complete pricing HTML

### Step 6: FAQ
Replace:
- `{COMPETITOR_FAQ_TITLE}` → FAQ section title
- `{COMPETITOR_FAQ_ITEMS}` → Complete FAQ HTML
- `{COMPETITOR_FAQ_SCHEMA_ITEMS}` → FAQ schema JSON array

### Step 7: Details (Details Template Only)
Replace:
- `{COMPETITOR_DETAILS_BUTTON}` → Button text
- `{COMPETITOR_FEATURES}` → Features HTML
- `{COMPETITOR_INTEGRATIONS}` → Integrations HTML
- `{COMPETITOR_SPECIAL}` → Special characteristics HTML

### Step 8: Schema
Replace:
- `{COMPETITOR_SCHEMA_NAME}` → Schema name
- `{COMPETITOR_SCHEMA_DESCRIPTION}` → Schema description
- `{COMPETITOR_SCHEMA_URL}` → Schema URL slug

## Common Values Reference

### Categories
- "Zeiterfassung" - Time tracking
- "HR-Software" - HR software
- "Personalmanagement" - Personnel management
- "Schichtplanung" - Shift planning

### Price Units
- "pro User pro Monat" - Per user per month
- "pro Standort pro Monat" - Per location per month
- "auf Anfrage" - On request
- "pro Mitarbeiter pro Monat" - Per employee per month

### Logo Classes
- `""` (empty) - Normal logo
- `"brightness-0 invert"` - Dark logo on dark background

## Validation Checklist

After replacing all placeholders:

- [ ] All `{COMPETITOR}` placeholders replaced
- [ ] All `{competitor}` placeholders replaced
- [ ] All `{competitor-slug}` placeholders replaced
- [ ] Rating and review count updated
- [ ] Description updated
- [ ] Category and focus updated
- [ ] Image paths updated and variants generated
- [ ] Logo alt text and classes updated
- [ ] Pricing information updated
- [ ] FAQ items added (minimum 5-7)
- [ ] FAQ schema matches FAQ items
- [ ] Schema URLs are absolute and correct
- [ ] OMR Reviews URL updated
- [ ] All TODO comments addressed

## Examples

### Example: Clockin

**Basic Information:**
- `{COMPETITOR}` → "Clockin"
- `{competitor}` → "clockin"
- `{competitor-slug}` → "clockin"

**Ratings:**
- `{COMPETITOR_RATING}` → "4.9"
- `{COMPETITOR_REVIEWS}` → "329"

**Content:**
- `{COMPETITOR_CATEGORY}` → "Zeiterfassung"
- `{COMPETITOR_FOCUS}` → "Schichtplanung, Zeiterfassung & Personalmanagement"

**Images:**
- `{COMPETITOR_LOGO_ALT}` → "clockin"
- `{COMPETITOR_LOGO_CLASS}` → "" (empty)

**Pricing:**
- `{COMPETITOR_PRICE_STARTING}` → "3.19"
- `{COMPETITOR_PRICE_UNIT}` → "pro User pro Monat"

### Example: Personio

**Basic Information:**
- `{COMPETITOR}` → "Personio"
- `{competitor}` → "personio"
- `{competitor-slug}` → "personio"

**Ratings:**
- `{COMPETITOR_RATING}` → "4.3"
- `{COMPETITOR_REVIEWS}` → "368"

**Content:**
- `{COMPETITOR_CATEGORY}` → "HR-Software"
- `{COMPETITOR_FOCUS}` → "Recruiting, Onboarding, Personalverwaltung und Lohnabrechnung"

**Images:**
- `{COMPETITOR_LOGO_ALT}` → "Personio"
- `{COMPETITOR_LOGO_CLASS}` → "brightness-0 invert"

**Pricing:**
- `{COMPETITOR_PRICE_STARTING}` → "0.00"
- `{COMPETITOR_PRICE_UNIT}` → "auf Anfrage"

## Quick Find & Replace Patterns

Use these patterns for efficient replacement:

1. **Competitor Name (all variants):**
   - Find: `Clockin` → Replace: `{COMPETITOR}`
   - Find: `clockin` → Replace: `{competitor}`
   - Find: `clockin-vergleich` → Replace: `{competitor-slug}-vergleich`

2. **Rating & Reviews:**
   - Find: `4.9` → Replace: `{COMPETITOR_RATING}` (be careful - may match other numbers)
   - Find: `329 Bewertungen` → Replace: `{COMPETITOR_REVIEWS} Bewertungen`

3. **Image Paths:**
   - Find: `clockin-vergleich-logo` → Replace: `{competitor}-vergleich-logo`
   - Find: `clockin-logo.webp` → Replace: `{competitor}-logo.webp`

## Troubleshooting

### Placeholder Not Found
- Check for typos in placeholder name
- Verify placeholder format: `{PLACEHOLDER}` (uppercase, underscores)
- Check if placeholder is template-specific (Details vs No Details)

### Multiple Replacements Needed
- Use Find & Replace with "Replace All" carefully
- Review each replacement to ensure context is correct
- Some placeholders may appear multiple times (e.g., `{COMPETITOR}`)

### Schema Validation Errors
- Ensure all schema placeholders are replaced
- Verify URLs are absolute (start with `https://www.ordio.com`)
- Check JSON syntax is valid after replacement

## Related Documentation

- [Template Usage Guide](COMPARISON_PAGES_TEMPLATE_USAGE.md) - How to use templates
- [Comparison Pages Guide](COMPARISON_PAGES_GUIDE.md) - Complete creation workflow
- [Quick Reference](COMPARISON_PAGES_ai//QUICK_REFERENCE.md) - Quick lookup patterns

