feat(content): improve city-cost-de template; add country-overview + city-pricing templates

city-cost-de.md.jinja:
- Lead with market score hook instead of raw venue count
- Stats strip hero (venues, market score, peak rate, population)
- Better section headings ("What Does a Padel Investment Cost in X?")
- Mid-body planner CTA after financial cards
- Expanded FAQ (6 questions incl. ROI and country comparison)
- Footer cross-link to country overview page
- Fixed url_pattern to use country_slug directly

country-overview.md.jinja:
- Country hub page at /markets/{country_slug}
- Aggregates: total venues, cities, avg market score, pricing
- Top-5 cities table with internal links to city pages
- Hub-and-spoke internal linking architecture

city-pricing.md.jinja:
- Per-city pricing deep-dive at /markets/{country_slug}/{city_slug}/court-prices
- Stats strip: peak rate, off-peak, P25-P75 range, occupancy
- Pricing table + market context (above/below national median)
- Occupancy-driven pricing explanation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-23 18:38:06 +01:00
parent cb95ecc9e6
commit 3667616f3d
3 changed files with 228 additions and 30 deletions

View File

@@ -5,43 +5,45 @@ content_type: calculator
data_table: serving.pseo_city_costs_de data_table: serving.pseo_city_costs_de
natural_key: city_slug natural_key: city_slug
languages: [de, en] languages: [de, en]
url_pattern: "/markets/{{ country_name_en | lower | slugify }}/{{ city_slug }}" url_pattern: "/markets/{{ country_slug }}/{{ city_slug }}"
title_pattern: "Padel in {{ city_name }} — Market Analysis & Costs" title_pattern: "Padel in {{ city_name }} — Investment Costs & Market Analysis {{ 'now' | datetimeformat('%Y') }}"
meta_description_pattern: "How much does it cost to build a padel center in {{ city_name }}? {{ padel_venue_count }} venues, pricing data & financial model." meta_description_pattern: "Is {{ city_name }} worth building a padel center in? {{ padel_venue_count }} venues, market score {{ market_score | round(1) }}/100, and a full financial model. Updated {{ 'now' | datetimeformat('%B %Y') }}."
schema_type: [Article, FAQPage] schema_type: [Article, FAQPage]
priority_column: population priority_column: population
--- ---
# Padel in {{ city_name }} # Is {{ city_name }} Worth Building a Padel Center In?
{{ city_name }} ({{ country_name_en }}) is home to **{{ padel_venue_count }}** padel venues, serving a population of {{ population | int | default(0) }} residents. That gives the city a venue density of {{ venues_per_100k | round(1) }} venues per 100,000 people. <div class="stats-strip">
<div class="stats-strip__item">
<div class="stats-strip__label">Padel Venues</div>
<div class="stats-strip__value">{{ padel_venue_count }}</div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Market Score</div>
<div class="stats-strip__value">{{ market_score | round(1) }}<span class="stats-strip__unit">/100</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Peak Rate</div>
<div class="stats-strip__value">{% if median_peak_rate %}{{ median_peak_rate | round(0) | int }}{% else %}—{% endif %}<span class="stats-strip__unit">{% if median_peak_rate %}{{ price_currency }}/hr{% endif %}</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Population</div>
<div class="stats-strip__value">{% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}<span class="stats-strip__unit">M</span>{% else %}{{ (population / 1000) | round(0) | int }}<span class="stats-strip__unit">K</span>{% endif %}</div>
</div>
</div>
## Market Overview {{ city_name }} has a **market score of {{ market_score | round(1) }}/100** — placing it{% if market_score >= 70 %} among the strongest padel markets in {{ country_name_en }}{% elif market_score >= 45 %} in the mid-tier of {{ country_name_en }}'s padel markets{% else %} in an early-stage padel market with room for growth{% endif %}. The city currently has **{{ padel_venue_count }} padel venues** serving a population of {% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}M{% else %}{{ (population / 1000) | round(0) | int }}K{% endif %} residents — a density of {{ venues_per_100k | round(1) }} venues per 100,000 people.
The padel market in {{ city_name }} shows a market score of **{{ market_score | round(1) }}** based on our analysis of venue density, pricing, and occupancy data. The question investors actually need answered is: given current pricing, occupancy, and build costs, what does the return look like? The financial model below uses real {{ city_name }} market data to give you that answer.
| Metric | Value | ## What Does a Padel Investment Cost in {{ city_name }}?
|--------|-------|
| Venues | {{ padel_venue_count }} |
| Venues per 100k | {{ venues_per_100k | round(1) }} |
| Market Score | {{ market_score | round(1) }} |
| Data Confidence | {{ data_confidence }} |
## Pricing
Court rental rates in {{ city_name }}:
- **Peak hours**: {{ median_peak_rate | round(0) | int }} per hour
- **Off-peak hours**: {{ median_offpeak_rate | round(0) | int }} per hour
- **Average hourly rate**: {{ median_hourly_rate | round(0) | int }} per hour
## What Would It Cost to Build?
Based on current market data for {{ city_name }}, here is what a padel center investment looks like: Based on current market data for {{ city_name }}, here is what a padel center investment looks like:
[scenario:{{ scenario_slug }}:capex] [scenario:{{ scenario_slug }}:capex]
## Revenue Potential ## Revenue Potential in {{ city_name }}
[scenario:{{ scenario_slug }}:operating] [scenario:{{ scenario_slug }}:operating]
@@ -49,16 +51,51 @@ Based on current market data for {{ city_name }}, here is what a padel center in
[scenario:{{ scenario_slug }}:returns] [scenario:{{ scenario_slug }}:returns]
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Adjust these numbers for your own plan →
<a href="/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Model it in the Planner</a>
</div>
## {{ city_name }} Padel Pricing
Court rental rates in {{ city_name }} based on Playtomic availability data:
| Rate Type | Price |
|-----------|-------|
| Peak hours | {% if median_peak_rate %}{{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr{% else %}No data{% endif %} |
| Off-peak hours | {% if median_offpeak_rate %}{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/hr{% else %}No data{% endif %} |
| Average hourly rate | {% if median_hourly_rate %}{{ median_hourly_rate | round(0) | int }} {{ price_currency }}/hr{% else %}No data{% endif %} |
| Estimated occupancy | {% if median_occupancy_rate %}{{ (median_occupancy_rate * 100) | round(0) | int }}%{% else %}No data{% endif %} |
## {{ city_name }} Market Overview
| Metric | Value |
|--------|-------|
| Venues | {{ padel_venue_count }} |
| Venues per 100K residents | {{ venues_per_100k | round(1) }} |
| Market Score | {{ market_score | round(1) }}/100 |
| Data Confidence | {{ (data_confidence * 100) | round(0) | int }}% |
## FAQ ## FAQ
**Is {{ city_name }} a good location for a padel center?**
{{ city_name }} scores **{{ market_score | round(1) }}/100** on our market index, which accounts for population size, existing venue density, and data completeness. {% if market_score >= 70 %}A score above 70 indicates a strong market: high population, growing venue count, and solid pricing data. {% elif market_score >= 45 %}A mid-range score means decent fundamentals but a more competitive or data-limited market. {% else %}A lower score reflects either a smaller city, sparse venue data, or an early-stage market — which can also mean lower competition and first-mover advantage. {% endif %}Use the planner above to model your specific assumptions.
**What is the return on investment for a padel center in {{ city_name }}?**
ROI depends on your build cost, court count, pricing, and occupancy assumptions. The financial model above uses real {{ city_name }} market data as defaults — peak rate {% if median_peak_rate %}{{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr{% else %}estimated from regional benchmarks{% endif %}, estimated occupancy {% if median_occupancy_rate %}{{ (median_occupancy_rate * 100) | round(0) | int }}%{% else %}based on country averages{% endif %}. Adjust the inputs in the planner to see how your scenario compares.
**How much does it cost to build a padel center in {{ city_name }}?** **How much does it cost to build a padel center in {{ city_name }}?**
Based on our financial model, building a padel center in {{ city_name }} with typical court configurations requires a total investment that depends on venue type (indoor vs outdoor), land costs, and construction standards in {{ country_name_en }}. Total investment depends on venue type (indoor vs outdoor), land costs, and local construction standards in {{ country_name_en }}. The capex model above breaks down the key cost drivers for a typical {{ city_name }} build based on current market assumptions.
**How many padel courts are there in {{ city_name }}?** **How many padel courts are there in {{ city_name }}?**
{{ city_name }} currently has {{ padel_venue_count }} padel venues. With a population of {{ population | int | default(0) }}, this translates to {{ venues_per_100k | round(1) }} venues per 100,000 residents. {{ city_name }} has **{{ padel_venue_count }} padel venues**. With a population of {% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}M{% else %}{{ (population / 1000) | round(0) | int }}K{% endif %}, that translates to **{{ venues_per_100k | round(1) }} venues per 100,000 residents**.
**Is {{ city_name }} a good location for a padel center?**
{{ city_name }} has a market score of {{ market_score | round(1) }} based on our analysis. Factors include current venue density, pricing levels, and estimated occupancy rates.
**What are typical padel court rental prices in {{ city_name }}?** **What are typical padel court rental prices in {{ city_name }}?**
Peak hour rates average around {{ median_peak_rate | round(0) | int }} per hour, while off-peak rates are approximately {{ median_offpeak_rate | round(0) | int }} per hour. {% if median_peak_rate %}Peak hour rates average around **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr**, while off-peak rates are approximately **{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/hr**. These figures come from live Playtomic booking data.{% else %}Pricing data from Playtomic is not yet available for {{ city_name }}. The financial model uses {{ country_name_en }}-wide benchmarks as a proxy.{% endif %}
**How does {{ city_name }} compare to other {{ country_name_en }} cities?**
{{ city_name }}'s market score of {{ market_score | round(1) }}/100 reflects its ranking among tracked {{ country_name_en }} cities. See the [{{ country_name_en }} market overview](/markets/{{ country_slug }}) for a full comparison across cities.
---
*More {{ country_name_en }} padel markets: [{{ country_name_en }} overview](/markets/{{ country_slug }})*

View File

@@ -0,0 +1,80 @@
---
name: "City Padel Court Prices"
slug: city-pricing
content_type: editorial
data_table: serving.pseo_city_pricing
natural_key: city_slug
languages: [en, de]
url_pattern: "/markets/{{ country_slug }}/{{ city_slug }}/court-prices"
title_pattern: "Padel Court Prices in {{ city_name }} — {{ 'now' | datetimeformat('%Y') }} Rates"
meta_description_pattern: "Current padel court rental prices in {{ city_name }}: peak {{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr, off-peak {{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/hr. Data from {{ venue_count }} venues."
schema_type: [Article, FAQPage]
priority_column: venue_count
---
# Padel Court Prices in {{ city_name }}
<div class="stats-strip">
<div class="stats-strip__item">
<div class="stats-strip__label">Peak Rate</div>
<div class="stats-strip__value">{{ median_peak_rate | round(0) | int }}<span class="stats-strip__unit">{{ price_currency }}/hr</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Off-Peak Rate</div>
<div class="stats-strip__value">{{ median_offpeak_rate | round(0) | int }}<span class="stats-strip__unit">{{ price_currency }}/hr</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Price Range</div>
<div class="stats-strip__value">{{ hourly_rate_p25 | round(0) | int }}{{ hourly_rate_p75 | round(0) | int }}<span class="stats-strip__unit">{{ price_currency }}</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Avg Occupancy</div>
<div class="stats-strip__value">{{ (median_occupancy_rate * 100) | round(0) | int }}<span class="stats-strip__unit">%</span></div>
</div>
</div>
Padel court prices in {{ city_name }} range from **{{ hourly_rate_p25 | round(0) | int }} to {{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/hr**, with a median peak rate of **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr**. This data is sourced from **{{ venue_count }} venues** actively listed on Playtomic.
## Pricing Breakdown
| Rate Type | Median | Notes |
|-----------|--------|-------|
| Peak hours | {{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr | Weekday evenings, weekends |
| Off-peak hours | {{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/hr | Weekday mornings/afternoons |
| Average hourly | {{ median_hourly_rate | round(0) | int }} {{ price_currency }}/hr | Blended across all slots |
| Price range (P25P75) | {{ hourly_rate_p25 | round(0) | int }}{{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/hr | Middle 50% of venues |
| Average occupancy | {{ (median_occupancy_rate * 100) | round(0) | int }}% | Across observed slots |
*Based on {{ venue_count }} venues with at least 2 days of booking data in the last 30 days.*
## How Does {{ city_name }} Compare?
{{ city_name }} has {{ padel_venue_count }} padel venues for a population of {% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}M{% else %}{{ (population / 1000) | round(0) | int }}K{% endif %} ({{ venues_per_100k | round(1) }} venues per 100K residents). {% if market_score >= 65 %}With a market score of {{ market_score | round(1) }}/100, {{ city_name }} is one of the stronger padel markets in {{ country_name_en }} — higher occupancy and pricing typically follow dense, competitive markets. {% elif market_score >= 40 %}A market score of {{ market_score | round(1) }}/100 reflects a mid-tier market: enough supply to have competitive pricing, but room for new venues to grow. {% else %}A market score of {{ market_score | round(1) }}/100 indicates an early-stage market where pricing and occupancy benchmarks may shift as the sport grows. {% endif %}
See the [{{ country_name_en }} market overview](/markets/{{ country_slug }}) to compare {{ city_name }} against other cities.
## What Drives Padel Pricing?
**Peak vs off-peak:** The {{ ((median_peak_rate - median_offpeak_rate) / median_offpeak_rate * 100) | round(0) | int }}% premium between peak and off-peak slots in {{ city_name }} reflects demand concentration. Booking a court on a weekday morning is significantly cheaper than Friday evening.
**Occupancy effect:** At {{ (median_occupancy_rate * 100) | round(0) | int }}% average occupancy, {{ city_name }} venues{% if median_occupancy_rate >= 0.6 %} run near capacity during peak hours — operators have pricing power to hold or raise rates{% elif median_occupancy_rate >= 0.4 %} have moderate utilisation, giving players flexibility to find slots at the lower end of the price range{% else %} have capacity to fill, which can mean better deals for players booking flexible slots{% endif %}.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Planning a padel center in {{ city_name }}? Use these rates as inputs →
<a href="/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Open the Planner</a>
</div>
## FAQ
**How much does it cost to rent a padel court in {{ city_name }}?**
The median padel court rental rate in {{ city_name }} is **{{ median_hourly_rate | round(0) | int }} {{ price_currency }}/hr** overall — **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr** at peak times and **{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/hr** off-peak. The cheapest venues charge from {{ hourly_rate_p25 | round(0) | int }} {{ price_currency }}/hr; premium venues reach {{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/hr or more. Data comes from {{ venue_count }} active Playtomic venues.
**When are padel courts cheapest in {{ city_name }}?**
Off-peak slots — typically weekday mornings and early afternoons — are priced at around **{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/hr**, compared to **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr** during peak hours. Booking in advance for mid-week mornings gives you the best rates in {{ city_name }}.
**How many padel venues are there in {{ city_name }}?**
{{ city_name }} has **{{ padel_venue_count }} padel venues** in total. This pricing analysis covers **{{ venue_count }} venues** with sufficient Playtomic booking data (at least 2 days of availability snapshots in the last 30 days).
---
*See also: [{{ city_name }} investment analysis](/markets/{{ country_slug }}/{{ city_slug }}) · [{{ country_name_en }} market overview](/markets/{{ country_slug }})*

View File

@@ -0,0 +1,81 @@
---
name: "Country Padel Overview"
slug: country-overview
content_type: editorial
data_table: serving.pseo_country_overview
natural_key: country_slug
languages: [en, de]
url_pattern: "/markets/{{ country_slug }}"
title_pattern: "Padel in {{ country_name_en }} — Market Overview {{ 'now' | datetimeformat('%Y') }}"
meta_description_pattern: "{{ total_venues }} padel venues across {{ city_count }} cities in {{ country_name_en }}. Market scores, pricing data, and investment analysis for each city."
schema_type: [Article]
priority_column: total_venues
---
# Padel in {{ country_name_en }} — Market Overview
<div class="stats-strip">
<div class="stats-strip__item">
<div class="stats-strip__label">Total Venues</div>
<div class="stats-strip__value">{{ total_venues }}</div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Cities Tracked</div>
<div class="stats-strip__value">{{ city_count }}</div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Avg Market Score</div>
<div class="stats-strip__value">{{ avg_market_score }}<span class="stats-strip__unit">/100</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Median Peak Rate</div>
<div class="stats-strip__value">{% if median_peak_rate %}{{ median_peak_rate | int }}{% else %}—{% endif %}<span class="stats-strip__unit">{% if median_peak_rate and price_currency %}{{ price_currency }}/hr{% endif %}</span></div>
</div>
</div>
{{ country_name_en }} has **{{ total_venues }} padel venues** tracked across **{{ city_count }} cities**. The average market score across tracked cities is **{{ avg_market_score }}/100**{% if avg_market_score >= 65 %} — a strong market with widespread venue penetration and solid pricing data{% elif avg_market_score >= 40 %} — a growing market with healthy city coverage{% else %} — an emerging market where early entrants can still capture prime locations{% endif %}.
## Top Cities in {{ country_name_en }}
The cities below are ranked by market score — a composite of population size, venue density, and data quality.
| City | Market Analysis |
|------|----------------|
{% for i in range(top_city_names | length) %}| [{{ top_city_names[i] }}](/markets/{{ country_slug }}/{{ top_city_slugs[i] }}) | [View investment analysis →](/markets/{{ country_slug }}/{{ top_city_slugs[i] }}) |
{% endfor %}
## Pricing Overview
{% if median_peak_rate %}
Court rental rates across {{ country_name_en }} cities (median from Playtomic live data):
| Rate Type | Median |
|-----------|--------|
| Peak hours | {{ median_peak_rate | int }} {{ price_currency }}/hr |
| Off-peak hours | {% if median_offpeak_rate %}{{ median_offpeak_rate | int }} {{ price_currency }}/hr{% else %}No data{% endif %} |
| Average hourly | {% if median_hourly_rate %}{{ median_hourly_rate | int }} {{ price_currency }}/hr{% else %}No data{% endif %} |
Prices vary significantly by city — larger cities with higher demand command premium rates. See individual city pages for city-specific benchmarks.
{% else %}
Detailed pricing data from Playtomic is not yet available for {{ country_name_en }} cities in aggregate. Visit individual city pages for the latest data where available.
{% endif %}
## Build Your Business Plan for {{ country_name_en }}
Every city has a different cost structure, competitive landscape, and customer base. The Padelnomics financial planner lets you model a padel center with real local market data as defaults — then adjust every assumption to match your specific site.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Build your business plan for a {{ country_name_en }} padel center →
<a href="/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Open the Planner</a>
</div>
## FAQ
**How many padel courts are there in {{ country_name_en }}?**
We currently track **{{ total_venues }} padel venues** across **{{ city_count }} cities** in {{ country_name_en }}. This covers venues listed on Playtomic and venues identified through our Overpass/OpenStreetMap data source. The actual total may be higher as independent clubs not listed on booking platforms are not always captured.
**Which city in {{ country_name_en }} is best for a padel center?**
Our top-ranked city by market score is **{{ top_city_names[0] }}** (score: {{ top_city_market_score }}/100). Market score combines population size, existing venue density, and data quality — a high score indicates a large addressable market with validated pricing data. However, the best city for *you* depends on land availability, local competition, and your target customer profile.
**What are typical padel court prices in {{ country_name_en }}?**
{% if median_peak_rate %}Based on live Playtomic data, median peak rates across {{ country_name_en }} cities are **{{ median_peak_rate | int }} {{ price_currency }}/hr** and off-peak rates are around **{% if median_offpeak_rate %}{{ median_offpeak_rate | int }}{% else %}—{% endif %} {{ price_currency }}/hr**. Individual cities vary — see each city's page for local benchmarks.{% else %}Pricing data is not yet available in aggregate for {{ country_name_en }}. Check individual city pages where Playtomic data is available.{% endif %}