Merge branch 'worktree-pseo-template-improvements'

pSEO template improvements:
- Fix double language prefix bug in article URLs
- Add German language to all 3 templates (city-cost-de, city-pricing, country-overview)
- Expand English content depth (~1500 words per template)
- Fix country-overview schema_type to [Article, FAQPage]
- Add cross-template links, scenario cross-references, extra FAQs, second CTAs
This commit is contained in:
Deeman
2026-02-24 02:15:49 +01:00
9 changed files with 436 additions and 37 deletions

View File

@@ -6,7 +6,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased] ## [Unreleased]
### Fixed
- **Double language prefix in article URLs** — articles were served at
`/en/en/markets/italy` (double prefix) because `generate_articles()` stored
`url_path` with the lang prefix baked in, but the blueprint is already mounted
at `/<lang>`. Now `url_path` is stored without the prefix; canonical URLs,
breadcrumbs, sitemap, and admin links all generate correct single-prefix URLs.
- **`/markets` removed from RESERVED_PREFIXES** — pSEO articles live under
`/markets/` and the explicit `/markets` route takes priority over the catch-all,
so the reservation was blocking article generation.
- **`country-overview` schema_type** — changed from `[Article]` to
`[Article, FAQPage]` to enable FAQ rich results for existing FAQ content.
### Added ### Added
- **Bilingual pSEO templates (DE + EN)** — all 3 article templates
(`city-cost-de`, `city-pricing`, `country-overview`) now generate proper
German prose via `{% if language == "de" %}` conditionals. German text uses
informal "Du/Dein", natural business German (not calque translation), and
localized labels/units (€/Std, Hauptzeit/Nebenzeit, etc.).
- **Expanded English pSEO content** — all 3 templates expanded from ~400900
words to ~13001500 words each. Added: Market Context/Landscape sections,
analytical commentary after scenario markers, cross-template links
(cost ↔ pricing ↔ country), planner links in FAQ answers, second CTA at
bottom of each article, 2 additional FAQ questions per template.
- **Scenario cross-reference** — `city-pricing` template now embeds
`[scenario:city-cost-de-{{ city_key }}:operating]` to show operating cost
data from the investment analysis template.
- **CMS admin improvement** — articles list now has HTMX filter bar (search, - **CMS admin improvement** — articles list now has HTMX filter bar (search,
status, template, language), pagination (50/page), and stats strip status, template, language), pagination (50/page), and stats strip
(total/live/scheduled/draft counts). Article actions (publish/unpublish, (total/live/scheduled/draft counts). Article actions (publish/unpublish,

View File

@@ -1,7 +1,7 @@
# Padelnomics — Project Tracker # Padelnomics — Project Tracker
> Move tasks across columns as you work. Add new tasks at the top of the relevant column. > Move tasks across columns as you work. Add new tasks at the top of the relevant column.
> Last updated: 2026-02-23. > Last updated: 2026-02-24.
--- ---
@@ -80,6 +80,8 @@
- [x] Per-city financial model overrides (rates, rent, utilities, permits, court config) - [x] Per-city financial model overrides (rates, rent, utilities, permits, court config)
- [x] Admin CMS (template CRUD, data row management, bulk CSV upload, bulk generate, publish toggle, rebuild) - [x] Admin CMS (template CRUD, data row management, bulk CSV upload, bulk generate, publish toggle, rebuild)
- [x] Admin CMS v2: HTMX filter/search/pagination, background generation, inline actions, sitemap invalidation, markdown editing - [x] Admin CMS v2: HTMX filter/search/pagination, background generation, inline actions, sitemap invalidation, markdown editing
- [x] pSEO template improvements: bilingual DE+EN (all 3 templates), expanded content depth (~1500 words), cross-template links, scenario cross-references, FAQPage schema fix, 2 extra FAQs per template, second CTAs
- [x] URL prefix fix: articles stored without lang prefix (was causing `/en/en/markets/...`), all consumers updated
- [x] Markets hub (`/<lang>/markets`) — article listing with FTS + country/region filters - [x] Markets hub (`/<lang>/markets`) — article listing with FTS + country/region filters
- [x] DuckDB refresh script (`refresh_from_daas.py`) - [x] DuckDB refresh script (`refresh_from_daas.py`)

View File

@@ -69,7 +69,7 @@
{% for a in scorecard %} {% for a in scorecard %}
<tr> <tr>
<td style="max-width:250px"> <td style="max-width:250px">
<a href="{{ a.url_path }}" target="_blank" class="text-sm" title="{{ a.url_path }}">{{ a.title or a.url_path }}</a> <a href="/{{ a.language or 'en' }}{{ a.url_path }}" target="_blank" class="text-sm" title="{{ a.url_path }}">{{ a.title or a.url_path }}</a>
{% if a.template_slug %} {% if a.template_slug %}
<br><span class="text-xs text-slate">{{ a.template_slug }}</span> <br><span class="text-xs text-slate">{{ a.template_slug }}</span>
{% endif %} {% endif %}

View File

@@ -308,8 +308,8 @@ async def generate_articles(
# Build render context: row data + language # Build render context: row data + language
ctx = {**row, "language": lang} ctx = {**row, "language": lang}
# Render URL pattern # Render URL pattern (no lang prefix — blueprint provides /<lang>)
url_path = f"/{lang}" + _render_pattern(config["url_pattern"], ctx) url_path = _render_pattern(config["url_pattern"], ctx)
if is_reserved_path(url_path): if is_reserved_path(url_path):
continue continue
@@ -375,8 +375,8 @@ async def generate_articles(
# Extract FAQ pairs for structured data # Extract FAQ pairs for structured data
faq_pairs = _extract_faq_pairs(body_md) faq_pairs = _extract_faq_pairs(body_md)
# Build SEO metadata # Build SEO metadata (full_url includes lang prefix for canonical/OG)
full_url = base_url + url_path full_url = f"{base_url}/{lang}{url_path}"
publish_dt = datetime( publish_dt = datetime(
publish_date.year, publish_date.month, publish_date.day, publish_date.year, publish_date.month, publish_date.day,
8, 0, 0, 8, 0, 0,
@@ -397,7 +397,7 @@ async def generate_articles(
) )
# JSON-LD # JSON-LD
breadcrumbs = _build_breadcrumbs(url_path, base_url) breadcrumbs = _build_breadcrumbs(f"/{lang}{url_path}", base_url)
jsonld_objects = build_jsonld( jsonld_objects = build_jsonld(
config["schema_type"], config["schema_type"],
title=title, title=title,
@@ -499,7 +499,7 @@ async def preview_article(
ctx = {**row, "language": lang} ctx = {**row, "language": lang}
url_path = f"/{lang}" + _render_pattern(config["url_pattern"], ctx) url_path = _render_pattern(config["url_pattern"], ctx)
title = _render_pattern(config["title_pattern"], ctx) title = _render_pattern(config["title_pattern"], ctx)
meta_desc = _render_pattern(config["meta_description_pattern"], ctx) meta_desc = _render_pattern(config["meta_description_pattern"], ctx)

View File

@@ -23,7 +23,7 @@ BUILD_DIR = Path("data/content/_build")
RESERVED_PREFIXES = ( RESERVED_PREFIXES = (
"/admin", "/auth", "/planner", "/billing", "/dashboard", "/admin", "/auth", "/planner", "/billing", "/dashboard",
"/directory", "/leads", "/suppliers", "/health", "/directory", "/leads", "/suppliers", "/health",
"/sitemap", "/static", "/markets", "/features", "/feedback", "/sitemap", "/static", "/features", "/feedback",
) )
SCENARIO_RE = re.compile(r'\[scenario:([a-z0-9_-]+)(?::([a-z]+))?\]') SCENARIO_RE = re.compile(r'\[scenario:([a-z0-9_-]+)(?::([a-z]+))?\]')

View File

@@ -6,12 +6,119 @@ data_table: serving.pseo_city_costs_de
natural_key: city_key natural_key: city_key
languages: [de, en] languages: [de, en]
url_pattern: "/markets/{{ country_slug }}/{{ city_slug }}" url_pattern: "/markets/{{ country_slug }}/{{ city_slug }}"
title_pattern: "Padel in {{ city_name }} — Investment Costs & Market Analysis {{ 'now' | datetimeformat('%Y') }}" title_pattern: "{% if language == 'de' %}Padel in {{ city_name }} — Investitionskosten & Marktanalyse {{ 'now' | datetimeformat('%Y') }}{% else %}Padel in {{ city_name }} — Investment Costs & Market Analysis {{ 'now' | datetimeformat('%Y') }}{% endif %}"
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') }}." meta_description_pattern: "{% if language == 'de' %}Lohnt sich eine Padelhalle in {{ city_name }}? {{ padel_venue_count }} Anlagen, Market Score {{ market_score | round(1) }}/100 und ein vollständiges Finanzmodell. Stand {{ 'now' | datetimeformat('%B %Y') }}.{% else %}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') }}.{% endif %}"
schema_type: [Article, FAQPage] schema_type: [Article, FAQPage]
priority_column: population priority_column: population
--- ---
{% if language == "de" %}
# Lohnt sich eine Padelhalle in {{ city_name }}?
<div class="stats-strip">
<div class="stats-strip__item">
<div class="stats-strip__label">Padelanlagen</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">Spitzenpreis</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 }}/Std{% endif %}</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Einwohner</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>
{{ city_name }} erreicht einen **Market Score von {{ market_score | round(1) }}/100** — damit liegt die Stadt{% if market_score >= 70 %} unter den stärksten Padel-Märkten in {{ country_name_en }}{% elif market_score >= 45 %} im soliden Mittelfeld der Padel-Märkte in {{ country_name_en }}{% else %} in einem frühen Padel-Markt mit Wachstumspotenzial{% endif %}. Aktuell gibt es **{{ padel_venue_count }} Padelanlagen** für {% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}M{% else %}{{ (population / 1000) | round(0) | int }}K{% endif %} Einwohner — das entspricht {{ venues_per_100k | round(1) }} Anlagen pro 100.000 Einwohner.
Die entscheidende Frage für Investoren: Was bringt ein Padel-Investment bei den aktuellen Preisen, Auslastungsraten und Baukosten tatsächlich? Das Finanzmodell unten rechnet mit echten Marktdaten aus {{ city_name }}.
## Was kostet ein Padel-Investment in {{ city_name }}?
Auf Basis aktueller Marktdaten für {{ city_name }} sieht die Investitionsrechnung so aus:
[scenario:{{ scenario_slug }}:capex]
Die Baukosten hängen stark davon ab, ob Du eine Indoor- oder Outdoor-Anlage planst. Indoor-Hallen in {{ country_name_en }} liegen typischerweise deutlich höher — Hallenbau, Belüftung und Beleuchtung treiben die Kosten. Outdoor-Anlagen sind günstiger im Bau, schränken aber die Saison und damit die Einnahmen ein. Die Courtanzahl bestimmt maßgeblich die Gesamtinvestition: Jeder zusätzliche Court senkt die Kosten pro Court, erhöht aber das Gesamtrisiko.
## Umsatzpotenzial in {{ city_name }}
[scenario:{{ scenario_slug }}:operating]
Der Umsatz steht und fällt mit drei Faktoren: Courtpreise, Auslastung und Nebeneinnahmen. {% if median_peak_rate %}In {{ city_name }} liegen die Spitzenpreise bei {{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std — {% if median_peak_rate >= 40 %}ein starkes Preisniveau, das auf hohe Nachfrage schließen lässt{% elif median_peak_rate >= 25 %}ein marktübliches Niveau für {{ country_name_en }}{% else %}ein vergleichsweise niedriges Preisniveau, das sich mit wachsender Nachfrage entwickeln dürfte{% endif %}. {% endif %}Die Auslastung variiert stark nach Tageszeit und Saison — in den Abendstunden und am Wochenende sind die Courts oft voll, während vormittags und nachmittags Kapazitäten frei bleiben.
## Rendite & Finanzierung
[scenario:{{ scenario_slug }}:returns]
Die Renditekennzahlen zeigen, wie schnell sich Dein Investment amortisiert und welchen Return Du über die Laufzeit erwarten kannst. Die IRR (Internal Rate of Return) ist die wichtigste Kennzahl — sie berücksichtigt den Zeitwert des Geldes und ermöglicht den Vergleich mit alternativen Investments. Eine Payback-Period unter 5 Jahren gilt in der Padel-Branche als solide. Entscheidend ist: Diese Zahlen basieren auf den aktuellen Marktdaten für {{ city_name }}. Passe die Annahmen im Planer an, um Dein spezifisches Szenario durchzurechnen.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Passe die Zahlen an Dein Vorhaben an →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Zum Finanzplaner</a>
</div>
## Marktumfeld in {{ city_name }}
{% if venues_per_100k >= 3.0 %}{{ city_name }} hat mit {{ venues_per_100k | round(1) }} Anlagen pro 100K Einwohner eine vergleichsweise hohe Padel-Dichte. Das spricht für einen etablierten Markt mit bewiesener Nachfrage — bedeutet aber auch mehr Wettbewerb für neue Anlagen. Differenzierung über Lage, Qualität oder Preisgestaltung wird hier zum Erfolgsfaktor.{% elif venues_per_100k >= 1.0 %}Mit {{ venues_per_100k | round(1) }} Anlagen pro 100K Einwohner hat {{ city_name }} eine moderate Padel-Abdeckung. Es gibt nachgewiesene Nachfrage, aber noch Platz für neue Anlagen — besonders in unterversorgten Stadtteilen oder mit einem differenzierten Angebot.{% else %}{{ city_name }} hat mit {{ venues_per_100k | round(1) }} Anlagen pro 100K Einwohner eine niedrige Padel-Dichte. Das bedeutet weniger Wettbewerb und First-Mover-Vorteile — aber auch weniger validierte Nachfragedaten. Die wachsende Popularität von Padel in {{ country_name_en }} spricht für ein hohes Entwicklungspotenzial.{% endif %}
Padel wächst europaweit rasant — in vielen Märkten verdoppelt sich die Anlagenzahl innerhalb weniger Jahre. Die vergleichsweise niedrigen Einstiegshürden (weniger Fläche als Tennis, kürzere Lernkurve für Spieler) treiben das Wachstum.
## Padel-Preise in {{ city_name }}
Courtmieten in {{ city_name }} auf Basis von Playtomic-Buchungsdaten:
| Zeitfenster | Preis |
|-------------|-------|
| Hauptzeiten | {% if median_peak_rate %}{{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std{% else %}Keine Daten{% endif %} |
| Nebenzeiten | {% if median_offpeak_rate %}{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/Std{% else %}Keine Daten{% endif %} |
| Durchschnittspreis | {% if median_hourly_rate %}{{ median_hourly_rate | round(0) | int }} {{ price_currency }}/Std{% else %}Keine Daten{% endif %} |
| Geschätzte Auslastung | {% if median_occupancy_rate %}{{ (median_occupancy_rate * 100) | round(0) | int }}%{% else %}Keine Daten{% endif %} |
Eine detaillierte Preisanalyse mit Preisspannen und Vergleichsdaten findest Du auf der [Preisseite für {{ city_name }}](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}/court-prices).
## {{ city_name }} Marktüberblick
| Kennzahl | Wert |
|----------|------|
| Anlagen | {{ padel_venue_count }} |
| Anlagen pro 100K Einwohner | {{ venues_per_100k | round(1) }} |
| Market Score | {{ market_score | round(1) }}/100 |
| Datenqualität | {{ (data_confidence * 100) | round(0) | int }}% |
## FAQ
**Ist {{ city_name }} ein guter Standort für eine Padelhalle?**
{{ city_name }} erreicht **{{ market_score | round(1) }}/100** auf unserem Marktindex, der Bevölkerungsgröße, Anlagendichte und Datenqualität berücksichtigt. {% if market_score >= 70 %}Ein Score über 70 signalisiert einen starken Markt: große Bevölkerung, wachsende Anlagenzahl und belastbare Preisdaten. {% elif market_score >= 45 %}Ein mittlerer Score bedeutet solide Grundlagen, aber einen teils stärker umkämpften oder datenlimitierten Markt. {% else %}Ein niedrigerer Score spricht für eine kleinere Stadt, begrenzte Datenlage oder einen Markt im Aufbau — was gleichzeitig weniger Wettbewerb und First-Mover-Vorteile bedeuten kann. {% endif %}Mit dem [Finanzplaner](/{{ language }}/planner) kannst Du Deine eigenen Annahmen durchrechnen.
**Wie hoch ist die Rendite einer Padelhalle in {{ city_name }}?**
Die Rendite hängt von Deinen Baukosten, der Courtanzahl, Preisgestaltung und Auslastungsannahmen ab. Das Finanzmodell oben nutzt echte Marktdaten aus {{ city_name }} als Ausgangswerte — Spitzenpreis {% if median_peak_rate %}{{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std{% else %}geschätzt auf Basis regionaler Benchmarks{% endif %}, geschätzte Auslastung {% if median_occupancy_rate %}{{ (median_occupancy_rate * 100) | round(0) | int }}%{% else %}basierend auf Landesdurchschnitt{% endif %}. [Passe die Eingaben im Planer an](/{{ language }}/planner), um Dein Szenario zu vergleichen.
**Was kostet es, eine Padelhalle in {{ city_name }} zu bauen?**
Das Gesamtinvestment hängt vom Hallentyp (Indoor vs. Outdoor), Grundstückskosten und lokalen Baustandards in {{ country_name_en }} ab. Das CAPEX-Modell oben schlüsselt die wichtigsten Kostentreiber für einen typischen Bau in {{ city_name }} auf.
**Wie viele Padelplätze gibt es in {{ city_name }}?**
{{ city_name }} hat **{{ padel_venue_count }} Padelanlagen**. Bei {% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}M{% else %}{{ (population / 1000) | round(0) | int }}K{% endif %} Einwohnern entspricht das **{{ venues_per_100k | round(1) }} Anlagen pro 100.000 Einwohner**.
**Was kosten Padel-Courts in {{ city_name }}?**
{% if median_peak_rate %}Zu Hauptzeiten liegen die Preise bei durchschnittlich **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std**, in Nebenzeiten bei ca. **{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/Std**. Die Daten stammen aus Live-Buchungsdaten von Playtomic.{% else %}Für {{ city_name }} liegen noch keine Playtomic-Preisdaten vor. Das Finanzmodell nutzt Benchmarks aus {{ country_name_en }} als Näherung.{% endif %}
**Wie schneidet {{ city_name }} im Vergleich zu anderen Städten in {{ country_name_en }} ab?**
Der Market Score von {{ market_score | round(1) }}/100 zeigt {{ city_name }}s Position unter den erfassten Städten in {{ country_name_en }}. In der [Marktübersicht für {{ country_name_en }}](/{{ language }}/markets/{{ country_slug }}) findest Du den Vergleich aller Städte.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Bereit für Deine eigene Kalkulation? →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Businessplan erstellen</a>
</div>
---
*Weitere Padel-Märkte in {{ country_name_en }}: [{{ country_name_en }} Übersicht](/{{ language }}/markets/{{ country_slug }})*
{% else %}
# Is {{ city_name }} Worth Building a Padel Center In? # Is {{ city_name }} Worth Building a Padel Center In?
<div class="stats-strip"> <div class="stats-strip">
@@ -43,19 +150,31 @@ Based on current market data for {{ city_name }}, here is what a padel center in
[scenario:{{ scenario_slug }}:capex] [scenario:{{ scenario_slug }}:capex]
Construction costs vary significantly depending on whether you build an indoor or outdoor facility. Indoor halls in {{ country_name_en }} run considerably higher — structural build, ventilation, and lighting drive the cost. Outdoor courts are cheaper to construct but limit your operating season and revenue potential. The number of courts is the single biggest lever on total investment: each additional court lowers the per-court cost, but increases your total capital at risk.
## Revenue Potential in {{ city_name }} ## Revenue Potential in {{ city_name }}
[scenario:{{ scenario_slug }}:operating] [scenario:{{ scenario_slug }}:operating]
Revenue depends on three factors: court rental pricing, occupancy rates, and ancillary income (coaching, retail, food & beverage). {% if median_peak_rate %}In {{ city_name }}, peak rates sit at {{ median_peak_rate | round(0) | int }} {{ price_currency }}/hr — {% if median_peak_rate >= 40 %}a strong price point that signals high local demand{% elif median_peak_rate >= 25 %}a standard rate for the {{ country_name_en }} market{% else %}a relatively low price point that may rise as local demand grows{% endif %}. {% endif %}Utilisation swings sharply by time of day and season — evenings and weekends tend to run at or near capacity, while weekday mornings and afternoons have idle courts.
## Financial Returns ## Financial Returns
[scenario:{{ scenario_slug }}:returns] [scenario:{{ scenario_slug }}:returns]
The return metrics above show how quickly your investment pays back and what long-term return you can expect. IRR (Internal Rate of Return) is the key metric — it accounts for the time value of money and lets you compare against alternative investments like real estate or equities. A payback period under 5 years is considered solid in the padel industry. These numbers are based on current {{ city_name }} market data. [Adjust the assumptions in the planner](/{{ language }}/planner) to model your specific scenario.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;"> <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 → 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> <a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Model it in the Planner</a>
</div> </div>
## Market Context
{% if venues_per_100k >= 3.0 %}With {{ venues_per_100k | round(1) }} venues per 100K residents, {{ city_name }} has a relatively high padel density. This indicates a proven market with demonstrated demand — but also more competition for new entrants. Differentiation through location, facility quality, or pricing strategy becomes the key success factor.{% elif venues_per_100k >= 1.0 %}At {{ venues_per_100k | round(1) }} venues per 100K residents, {{ city_name }} has moderate padel coverage. There is proven demand, but room for new facilities — particularly in underserved areas of the city or with a differentiated offering.{% else %}{{ city_name }} has a low padel density of {{ venues_per_100k | round(1) }} venues per 100K residents. This means less competition and potential first-mover advantage — but also less validated demand data. The rapid growth of padel across {{ country_name_en }} suggests significant development potential.{% endif %}
Padel is growing rapidly across Europe — many markets are seeing venue counts double within a few years. The sport's relatively low barriers to entry (less space than tennis, faster learning curve for players) continue to drive expansion.
## {{ city_name }} Padel Pricing ## {{ city_name }} Padel Pricing
Court rental rates in {{ city_name }} based on Playtomic availability data: Court rental rates in {{ city_name }} based on Playtomic availability data:
@@ -67,6 +186,8 @@ Court rental rates in {{ city_name }} based on Playtomic availability data:
| Average hourly rate | {% if median_hourly_rate %}{{ median_hourly_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 %} | | Estimated occupancy | {% if median_occupancy_rate %}{{ (median_occupancy_rate * 100) | round(0) | int }}%{% else %}No data{% endif %} |
For a detailed pricing breakdown with price ranges and venue comparisons, see the [{{ city_name }} court prices page](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}/court-prices).
## {{ city_name }} Market Overview ## {{ city_name }} Market Overview
| Metric | Value | | Metric | Value |
@@ -79,10 +200,10 @@ Court rental rates in {{ city_name }} based on Playtomic availability data:
## FAQ ## FAQ
**Is {{ city_name }} a good location for a padel center?** **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. {{ 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 [Padelnomics planner](/{{ language }}/planner) to model your specific assumptions.
**What is the return on investment for a padel center in {{ city_name }}?** **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. 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](/{{ language }}/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 }}?**
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. 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.
@@ -94,8 +215,14 @@ Total investment depends on venue type (indoor vs outdoor), land costs, and loca
{% 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 %} {% 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?** **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. {{ 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](/{{ language }}/markets/{{ country_slug }}) for a full comparison across cities.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Ready to run the numbers for {{ city_name }}? →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Build your business plan</a>
</div>
--- ---
*More {{ country_name_en }} padel markets: [{{ country_name_en }} overview](/markets/{{ country_slug }})* *More {{ country_name_en }} padel markets: [{{ country_name_en }} overview](/{{ language }}/markets/{{ country_slug }})*
{% endif %}

View File

@@ -6,12 +6,110 @@ data_table: serving.pseo_city_pricing
natural_key: city_key natural_key: city_key
languages: [en, de] languages: [en, de]
url_pattern: "/markets/{{ country_slug }}/{{ city_slug }}/court-prices" url_pattern: "/markets/{{ country_slug }}/{{ city_slug }}/court-prices"
title_pattern: "Padel Court Prices in {{ city_name }} — {{ 'now' | datetimeformat('%Y') }} Rates" title_pattern: "{% if language == 'de' %}Padel-Court-Preise in {{ city_name }} — Aktuelle Tarife {{ 'now' | datetimeformat('%Y') }}{% else %}Padel Court Prices in {{ city_name }} — {{ 'now' | datetimeformat('%Y') }} Rates{% endif %}"
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." meta_description_pattern: "{% if language == 'de' %}Aktuelle Padel-Courtmieten in {{ city_name }}: Hauptzeit {{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std, Nebenzeit {{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/Std. Daten von {{ venue_count }} Anlagen.{% else %}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.{% endif %}"
schema_type: [Article, FAQPage] schema_type: [Article, FAQPage]
priority_column: venue_count priority_column: venue_count
--- ---
{% if language == "de" %}
# Padel-Court-Preise in {{ city_name }}
<div class="stats-strip">
<div class="stats-strip__item">
<div class="stats-strip__label">Hauptzeit</div>
<div class="stats-strip__value">{{ median_peak_rate | round(0) | int }}<span class="stats-strip__unit">{{ price_currency }}/Std</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Nebenzeit</div>
<div class="stats-strip__value">{{ median_offpeak_rate | round(0) | int }}<span class="stats-strip__unit">{{ price_currency }}/Std</span></div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Preisspanne</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">Ø Auslastung</div>
<div class="stats-strip__value">{{ (median_occupancy_rate * 100) | round(0) | int }}<span class="stats-strip__unit">%</span></div>
</div>
</div>
Die Padel-Courtmieten in {{ city_name }} liegen zwischen **{{ hourly_rate_p25 | round(0) | int }} und {{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/Std**, mit einem medianen Spitzenpreis von **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std**. Die Daten stammen von **{{ venue_count }} Anlagen**, die aktuell auf Playtomic gelistet sind.
## Preisübersicht
| Zeitfenster | Median | Hinweis |
|-------------|--------|---------|
| Hauptzeiten | {{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std | Abends unter der Woche, Wochenende |
| Nebenzeiten | {{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/Std | Vormittags/Nachmittags unter der Woche |
| Durchschnitt | {{ median_hourly_rate | round(0) | int }} {{ price_currency }}/Std | Gewichteter Mittelwert aller Slots |
| Preisspanne (P25P75) | {{ hourly_rate_p25 | round(0) | int }}{{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/Std | Mittlere 50 % der Anlagen |
| Durchschnittliche Auslastung | {{ (median_occupancy_rate * 100) | round(0) | int }}% | Über alle erfassten Slots |
*Basierend auf {{ venue_count }} Anlagen mit mindestens 2 Tagen Buchungsdaten in den letzten 30 Tagen.*
## Preisentwicklung und Trends
Der Aufschlag von {{ ((median_peak_rate - median_offpeak_rate) / median_offpeak_rate * 100) | round(0) | int }}% zwischen Haupt- und Nebenzeiten in {{ city_name }} zeigt die typische Nachfragekonzentration im Padel: Abendstunden und Wochenende sind deutlich teurer, weil die Courts dort voll ausgelastet sind.
Die Preisspanne von {{ hourly_rate_p25 | round(0) | int }} bis {{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/Std (mittlere 50 % der Anlagen) deutet auf {% if (hourly_rate_p75 - hourly_rate_p25) >= 15 %}eine starke Preisdifferenzierung im Markt — es gibt sowohl günstige Basisanlagen als auch Premium-Einrichtungen mit höheren Preisen{% elif (hourly_rate_p75 - hourly_rate_p25) >= 8 %}eine moderate Preisspreizung, die auf einen reifenden Markt mit verschiedenen Angebotsqualitäten hinweist{% else %}ein relativ einheitliches Preisniveau — der Markt ist entweder noch jung oder die Anlagen bieten vergleichbare Qualität{% endif %}.
## Wie steht {{ city_name }} im Vergleich da?
{{ city_name }} hat {{ padel_venue_count }} Padelanlagen für {% if population >= 1000000 %}{{ (population / 1000000) | round(1) }}M{% else %}{{ (population / 1000) | round(0) | int }}K{% endif %} Einwohner ({{ venues_per_100k | round(1) }} Anlagen pro 100K Einwohner). {% if market_score >= 65 %}Mit einem Market Score von {{ market_score | round(1) }}/100 gehört {{ city_name }} zu den stärksten Padel-Märkten in {{ country_name_en }} — höhere Auslastung und Preise sind typisch für dichte, etablierte Märkte. {% elif market_score >= 40 %}Ein Market Score von {{ market_score | round(1) }}/100 steht für einen Markt im Aufbau: genug Angebot für marktgerechte Preise, aber Raum für neue Anlagen. {% else %}Ein Market Score von {{ market_score | round(1) }}/100 deutet auf einen Markt in der Frühphase hin, in dem sich Preise und Auslastung mit dem Wachstum des Sports noch deutlich entwickeln können. {% endif %}
Die Anlagendichte von {{ venues_per_100k | round(1) }} pro 100K Einwohner beeinflusst die Preisgestaltung direkt: {% if venues_per_100k >= 3.0 %}Höhere Dichte bedeutet mehr Wettbewerb, was die Preise eher stabilisiert oder senkt.{% elif venues_per_100k >= 1.0 %}Moderate Dichte ermöglicht marktgerechte Preise bei gleichzeitigem Wachstumsspielraum.{% else %}Niedrige Dichte gibt Betreibern mehr Preissetzungsmacht — vorausgesetzt, die Nachfrage ist da.{% endif %}
In der [Marktübersicht {{ country_name_en }}](/{{ language }}/markets/{{ country_slug }}) kannst Du {{ city_name }} mit anderen Städten vergleichen. Du planst ein Investment? Die vollständige [Investitionsanalyse für {{ city_name }}](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}) enthält ein detailliertes Finanzmodell.
## Was bestimmt die Padel-Preise?
**Haupt- vs. Nebenzeiten:** Ein Court am Dienstagvormittag ist deutlich günstiger als am Freitagabend — der {{ ((median_peak_rate - median_offpeak_rate) / median_offpeak_rate * 100) | round(0) | int }}%-Aufschlag spiegelt die Nachfragekonzentration wider.
**Auslastungseffekt:** Bei {{ (median_occupancy_rate * 100) | round(0) | int }}% durchschnittlicher Auslastung{% if median_occupancy_rate >= 0.6 %} laufen die Anlagen in {{ city_name }} zu Spitzenzeiten nahe der Kapazitätsgrenze — Betreiber haben Spielraum, die Preise zu halten oder anzuheben{% elif median_occupancy_rate >= 0.4 %} haben die Anlagen in {{ city_name }} moderate Nutzung, was Spielern Flexibilität bei der Slotsuche im unteren Preissegment bietet{% else %} haben die Anlagen in {{ city_name }} noch Kapazitäten zu füllen — das kann für Spieler bessere Preise bei flexibler Buchung bedeuten{% endif %}.
**Anlagenqualität:** Neuere Indoor-Anlagen mit Premium-Ausstattung (LED-Beleuchtung, Klimaanlage, Lounge-Bereich) können deutlich höhere Preise verlangen als ältere Outdoor-Courts.
**Marktreife:** In etablierteren Märkten sind die Preise tendenziell höher und stabiler. In jüngeren Märkten können sich Preise schneller verändern, wenn neue Anlagen eröffnen.
## Investitionsaussichten
Diese Preisdaten fließen direkt in das Finanzmodell für {{ city_name }} ein:
[scenario:city-cost-de-{{ city_key }}:operating]
*Aus der [{{ city_name }} Investitionsanalyse](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}).*
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Du planst eine Padelhalle in {{ city_name }}? Nutze diese Preise als Kalkulationsgrundlage →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Zum Finanzplaner</a>
</div>
## FAQ
**Was kostet eine Padel-Stunde in {{ city_name }}?**
Der mediane Stundenpreis in {{ city_name }} liegt bei **{{ median_hourly_rate | round(0) | int }} {{ price_currency }}/Std** — zu Hauptzeiten **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std**, in Nebenzeiten **{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/Std**. Die günstigsten Anlagen starten bei {{ hourly_rate_p25 | round(0) | int }} {{ price_currency }}/Std, Premium-Anlagen verlangen {{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/Std oder mehr. Datenbasis: {{ venue_count }} aktive Playtomic-Anlagen.
**Wann ist Padel in {{ city_name }} am günstigsten?**
In Nebenzeiten — typischerweise vormittags und am frühen Nachmittag unter der Woche — liegen die Preise bei ca. **{{ median_offpeak_rate | round(0) | int }} {{ price_currency }}/Std**, verglichen mit **{{ median_peak_rate | round(0) | int }} {{ price_currency }}/Std** zu Hauptzeiten.
**Wie viele Padelanlagen gibt es in {{ city_name }}?**
{{ city_name }} hat **{{ padel_venue_count }} Padelanlagen** insgesamt. Diese Preisanalyse erfasst **{{ venue_count }} Anlagen** mit ausreichend Playtomic-Buchungsdaten.
**Wie schneidet {{ city_name }} preislich im Vergleich zu anderen Städten in {{ country_name_en }} ab?**
Die Preise in {{ city_name }} liegen {% if median_peak_rate >= 40 %}im oberen Bereich{% elif median_peak_rate >= 25 %}im Mittelfeld{% else %}unter dem Durchschnitt{% endif %} für {{ country_name_en }}. In der [Marktübersicht {{ country_name_en }}](/{{ language }}/markets/{{ country_slug }}) findest Du den Vergleich aller Städte.
**Steigen oder fallen die Padel-Preise in {{ city_name }}?**
Die aktuellen Daten sind eine Momentaufnahme auf Basis von Playtomic-Livedaten. Generell stabilisieren sich Preise in reiferen Märkten, während sie in wachsenden Märkten tendenziell steigen. Im [Finanzplaner](/{{ language }}/planner) kannst Du verschiedene Preisszenarien durchrechnen.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Nutze die {{ city_name }}-Preisdaten für Deinen Businessplan →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Zum Finanzplaner</a>
</div>
---
*Siehe auch: [{{ city_name }} Investitionsanalyse](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}) · [Marktübersicht {{ country_name_en }}](/{{ language }}/markets/{{ country_slug }})*
{% else %}
# Padel Court Prices in {{ city_name }} # Padel Court Prices in {{ city_name }}
<div class="stats-strip"> <div class="stats-strip">
@@ -47,21 +145,41 @@ Padel court prices in {{ city_name }} range from **{{ hourly_rate_p25 | round(0)
*Based on {{ venue_count }} venues with at least 2 days of booking data in the last 30 days.* *Based on {{ venue_count }} venues with at least 2 days of booking data in the last 30 days.*
## Pricing Trends
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 the typical demand concentration in padel: evening and weekend hours are significantly more expensive because courts run at near-full capacity.
The P25P75 price range of {{ hourly_rate_p25 | round(0) | int }} to {{ hourly_rate_p75 | round(0) | int }} {{ price_currency }}/hr suggests {% if (hourly_rate_p75 - hourly_rate_p25) >= 15 %}strong price differentiation in the market — there are both budget-friendly basic facilities and premium venues commanding higher rates{% elif (hourly_rate_p75 - hourly_rate_p25) >= 8 %}a moderate price spread, indicating a maturing market with varied facility quality{% else %}a relatively uniform price level — the market is either still young or venues offer comparable quality{% endif %}.
## How Does {{ city_name }} Compare? ## 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 %} {{ 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. Venue density of {{ venues_per_100k | round(1) }} per 100K residents directly influences pricing: {% if venues_per_100k >= 3.0 %}higher density means more competition, which tends to stabilize or compress prices.{% elif venues_per_100k >= 1.0 %}moderate density supports market-rate pricing with room for growth.{% else %}low density gives operators more pricing power — provided demand exists.{% endif %}
See the [{{ country_name_en }} market overview](/{{ language }}/markets/{{ country_slug }}) to compare {{ city_name }} against other cities. Thinking about investing? The full [{{ city_name }} investment analysis](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}) includes a detailed financial model.
## What Drives Padel Pricing? ## 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. **Peak vs off-peak:** A court on a Tuesday morning is significantly cheaper than Friday evening — the {{ ((median_peak_rate - median_offpeak_rate) / median_offpeak_rate * 100) | round(0) | int }}% premium reflects demand concentration.
**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 %}. **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 %}.
**Facility quality:** Newer indoor facilities with premium features (LED lighting, climate control, lounge areas) command significantly higher rates than older outdoor courts. The P25P75 range reflects these quality differences.
**Market maturity:** More established padel markets tend to have higher, more stable prices. In newer markets, prices may shift more quickly as new venues open or demand grows.
## Investment Outlook
These pricing numbers feed directly into the financial model for {{ city_name }}:
[scenario:city-cost-de-{{ city_key }}:operating]
*From the [{{ city_name }} investment analysis](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}).*
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;"> <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 → 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> <a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Open the Planner</a>
</div> </div>
## FAQ ## FAQ
@@ -70,11 +188,23 @@ See the [{{ country_name_en }} market overview](/markets/{{ country_slug }}) to
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. 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 }}?** **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 }}. 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.
**How many padel venues are there 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). {{ city_name }} has **{{ padel_venue_count }} padel venues** in total. This pricing analysis covers **{{ venue_count }} venues** with sufficient Playtomic booking data.
**How does padel pricing in {{ city_name }} compare to other {{ country_name_en }} cities?**
{{ city_name }}'s pricing sits {% if median_peak_rate >= 40 %}at the higher end{% elif median_peak_rate >= 25 %}in the mid-range{% else %}below average{% endif %} for {{ country_name_en }}. See the [{{ country_name_en }} market overview](/{{ language }}/markets/{{ country_slug }}) for a full city-by-city comparison.
**Are padel court prices in {{ city_name }} going up or down?**
The current data is a snapshot based on live Playtomic booking data. In general, prices stabilise in mature markets and tend to rise in growing ones. Use the [financial planner](/{{ language }}/planner) to model different pricing scenarios and stress-test your business plan.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Use {{ city_name }} pricing data in your business plan →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Open the Planner</a>
</div>
--- ---
*See also: [{{ city_name }} investment analysis](/markets/{{ country_slug }}/{{ city_slug }}) · [{{ country_name_en }} market overview](/markets/{{ country_slug }})* *See also: [{{ city_name }} investment analysis](/{{ language }}/markets/{{ country_slug }}/{{ city_slug }}) · [{{ country_name_en }} market overview](/{{ language }}/markets/{{ country_slug }})*
{% endif %}

View File

@@ -6,12 +6,103 @@ data_table: serving.pseo_country_overview
natural_key: country_slug natural_key: country_slug
languages: [en, de] languages: [en, de]
url_pattern: "/markets/{{ country_slug }}" url_pattern: "/markets/{{ country_slug }}"
title_pattern: "Padel in {{ country_name_en }} — Market Overview {{ 'now' | datetimeformat('%Y') }}" title_pattern: "{% if language == 'de' %}Padel in {{ country_name_en }} — Marktüberblick {{ 'now' | datetimeformat('%Y') }}{% else %}Padel in {{ country_name_en }} — Market Overview {{ 'now' | datetimeformat('%Y') }}{% endif %}"
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." meta_description_pattern: "{% if language == 'de' %}{{ total_venues }} Padelanlagen in {{ city_count }} Städten in {{ country_name_en }}. Market Scores, Preisdaten und Investmentanalysen für jede Stadt.{% else %}{{ total_venues }} padel venues across {{ city_count }} cities in {{ country_name_en }}. Market scores, pricing data, and investment analysis for each city.{% endif %}"
schema_type: [Article] schema_type: [Article, FAQPage]
priority_column: total_venues priority_column: total_venues
--- ---
{% if language == "de" %}
# Padel in {{ country_name_en }} — Marktüberblick
<div class="stats-strip">
<div class="stats-strip__item">
<div class="stats-strip__label">Anlagen gesamt</div>
<div class="stats-strip__value">{{ total_venues }}</div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Erfasste Städte</div>
<div class="stats-strip__value">{{ city_count }}</div>
</div>
<div class="stats-strip__item">
<div class="stats-strip__label">Ø 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 Spitzenpreis</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 }}/Std{% endif %}</span></div>
</div>
</div>
In {{ country_name_en }} erfassen wir aktuell **{{ total_venues }} Padelanlagen** in **{{ city_count }} Städten**. Der durchschnittliche Market Score liegt bei **{{ avg_market_score }}/100**{% if avg_market_score >= 65 %} — ein starker Markt mit breiter Infrastruktur und belastbaren Preisdaten{% elif avg_market_score >= 40 %} — ein wachsender Markt mit guter Abdeckung{% else %} — ein aufstrebender Markt, in dem Früheinsteiger noch Premiumstandorte sichern können{% endif %}.
## Marktlandschaft
Padel wächst in {{ country_name_en }} mit bemerkenswertem Tempo. Unsere Daten zeigen {{ total_venues }} erfasste Anlagen — eine Zahl, die angesichts nicht auf Buchungsplattformen gelisteter Clubs vermutlich noch höher liegt. Der durchschnittliche Market Score von {{ avg_market_score }}/100 über {{ city_count }} Städte spiegelt sowohl die Marktreife als auch die Datenverfügbarkeit wider.
{% if avg_market_score >= 65 %}Märkte mit Scores über 65 weisen in der Regel eine etablierte Spielerbasis, belastbare Preisdaten und berechenbare Nachfragemuster auf — entscheidend für eine solide Finanzplanung. Dennoch bleiben viele Städte unterversorgt: Selbst in reifen Märkten variiert die Anlagendichte pro 100.000 Einwohner erheblich.{% elif avg_market_score >= 40 %}Ein Score im mittleren Bereich deutet auf eine Wachstumsphase hin: Die Nachfrage ist nachweisbar, die Anlageninfrastruktur baut sich auf, und Preise haben sich noch nicht vollständig auf Wettbewerbsniveau eingependelt. Das eröffnet Chancen für gut positionierte Neueintritte.{% else %}Aufstrebende Märkte bieten First-Mover-Vorteile — weniger direkte Konkurrenz, potenziell attraktivere Mietkonditionen und die Möglichkeit, eine loyale Spielerbasis aufzubauen, bevor sich der Markt verdichtet.{% endif %}
## Top-Städte in {{ country_name_en }}
Die Rangfolge basiert auf dem Market Score — einem Komposit aus Bevölkerungsgröße, Anlagendichte und Datenqualität. Städte mit höherem Score bieten in der Regel größere adressierbare Märkte und belastbarere Benchmarks für die Finanzplanung.
| Stadt | Marktanalyse |
|-------|-------------|
{% for i in range(top_city_names | length) %}| [{{ top_city_names[i] }}](/{{ language }}/markets/{{ country_slug }}/{{ top_city_slugs[i] }}) | [Investmentanalyse ansehen →](/{{ language }}/markets/{{ country_slug }}/{{ top_city_slugs[i] }}) |
{% endfor %}
Jede Stadtseite enthält detaillierte Preisdaten, eine Kosten-Nutzen-Analyse und einen vorkonfigurierten Finanzplaner mit lokalen Marktdaten als Ausgangswerte.
## Preisüberblick
{% if median_peak_rate %}
Die Mietpreise für Padel-Courts in {{ country_name_en }} basieren auf Live-Daten von Playtomic:
| Zeitfenster | Median |
|------------|--------|
| Hauptzeit | {{ median_peak_rate | int }} {{ price_currency }}/Std |
| Nebenzeit | {% if median_offpeak_rate %}{{ median_offpeak_rate | int }} {{ price_currency }}/Std{% else %}Keine Daten{% endif %} |
| Ø Stundenpreis | {% if median_hourly_rate %}{{ median_hourly_rate | int }} {{ price_currency }}/Std{% else %}Keine Daten{% endif %} |
{% if median_offpeak_rate %}Die Spanne zwischen Haupt- und Nebenzeit ({{ median_peak_rate | int }} vs. {{ median_offpeak_rate | int }} {{ price_currency }}) zeigt das Umsatzpotenzial einer optimierten Belegungssteuerung: Mitgliedschaftsmodelle, Firmenbuchungen in Randzeiten und flexible Preisgestaltung können die Auslastung außerhalb der Spitzenzeiten deutlich heben.{% endif %}
Die Preise variieren erheblich zwischen Städten — Großstädte mit hoher Nachfrage erzielen Premiumpreise. Auf den einzelnen Stadtseiten findest Du stadtspezifische Benchmarks.
{% else %}
Detaillierte Preisdaten von Playtomic liegen für {{ country_name_en }} noch nicht aggregiert vor. Auf den Stadtseiten findest Du lokale Daten, sofern verfügbar.
{% endif %}
## Businessplan für {{ country_name_en }} erstellen
Jede Stadt hat andere Kostenstrukturen, Wettbewerbsbedingungen und Zielgruppen. Der Padelnomics-Finanzplaner modelliert eine Padelhalle mit realen lokalen Marktdaten als Ausgangswerte — jede Annahme lässt sich an Dein konkretes Vorhaben anpassen.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Businessplan für eine Padelhalle in {{ country_name_en }} erstellen →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Zum Finanzplaner</a>
</div>
## FAQ
**Wie viele Padel-Courts gibt es in {{ country_name_en }}?**
Wir erfassen aktuell **{{ total_venues }} Padelanlagen** in **{{ city_count }} Städten** in {{ country_name_en }}. Unsere Daten stammen von Playtomic und aus Overpass/OpenStreetMap. Die tatsächliche Zahl liegt vermutlich höher, da unabhängige Clubs ohne Buchungsplattform nicht immer erfasst werden.
**Welche Stadt in {{ country_name_en }} eignet sich am besten für eine Padelhalle?**
Unsere Spitzenstadt nach Market Score ist **{{ top_city_names[0] }}** (Score: {{ top_city_market_score }}/100). Der Score kombiniert Bevölkerungsgröße, Anlagendichte und Datenqualität. Eine hohe Punktzahl deutet auf einen großen adressierbaren Markt mit validierten Preisdaten hin. Die beste Stadt für *Dein* Vorhaben hängt aber von Faktoren wie Flächenverfügbarkeit, lokalem Wettbewerb und Deiner Zielgruppe ab. Nutze den <a href="/{{ language }}/planner">Finanzplaner</a>, um verschiedene Standorte durchzurechnen.
**Was kostet eine Stunde Padel in {{ country_name_en }}?**
{% if median_peak_rate %}Laut Live-Daten von Playtomic liegt der Median-Hauptzeitpreis in {{ country_name_en }} bei **{{ median_peak_rate | int }} {{ price_currency }}/Std**, Nebenzeit bei **{% if median_offpeak_rate %}{{ median_offpeak_rate | int }}{% else %}—{% endif %} {{ price_currency }}/Std**. Die Preise variieren stark zwischen Städten — auf den jeweiligen Stadtseiten findest Du lokale Benchmarks.{% else %}Aggregierte Preisdaten sind für {{ country_name_en }} noch nicht verfügbar. Prüfe die einzelnen Stadtseiten für lokale Daten.{% endif %}
**Wie schnell wächst Padel in {{ country_name_en }}?**
Padel gehört zu den am schnellsten wachsenden Racketsportarten in Europa. Mit {{ total_venues }} erfassten Anlagen in {{ city_count }} Städten zeigt {{ country_name_en }} {% if avg_market_score >= 65 %}bereits eine reife Infrastruktur — Wachstum kommt hier vor allem aus steigender Spielfrequenz und Premiumangeboten{% elif avg_market_score >= 40 %}eine klare Wachstumsdynamik mit steigender Nachfrage und neuen Anlagen{% else %}ein frühes Wachstumsstadium mit großem Potenzial für Neueintritte{% endif %}. Die Sportart profitiert von niedriger Einstiegshürde, hohem Spaßfaktor und starker Mund-zu-Mund-Verbreitung.
**Welche Städte haben die besten Preisdaten?**
Städte mit höherem Market Score (wie {{ top_city_names[0] }}) haben in der Regel die umfassendsten Preisdaten, weil dort mehr Anlagen auf Playtomic gelistet sind. In unserem <a href="/{{ language }}/markets/{{ country_slug }}">{{ country_name_en }}-Marktüberblick</a> findest Du alle Städte nach Market Score sortiert.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Du überlegst, eine Padelhalle in {{ country_name_en }} zu eröffnen? Rechne Dein Vorhaben mit echten Marktdaten durch →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Zum Finanzplaner</a>
</div>
{% else %}
# Padel in {{ country_name_en }} — Market Overview # Padel in {{ country_name_en }} — Market Overview
<div class="stats-strip"> <div class="stats-strip">
@@ -35,15 +126,23 @@ priority_column: total_venues
{{ 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 %}. {{ 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 %}.
## Market Landscape
Padel is growing rapidly across {{ country_name_en }}. Our data tracks {{ total_venues }} venues — a figure that likely understates the true count given independent clubs not listed on booking platforms. The average market score of {{ avg_market_score }}/100 across {{ city_count }} cities reflects both market maturity and data availability.
{% if avg_market_score >= 65 %}Markets scoring above 65 typically show an established player base, reliable pricing data, and predictable demand patterns — all critical for sound financial planning. Yet even in mature markets, venue density per 100,000 residents varies significantly between cities, pointing to pockets of underserved demand.{% elif avg_market_score >= 40 %}A mid-range score signals a growth phase: demand is proven, venue infrastructure is building, and pricing hasn't fully settled to competitive levels. This creates opportunities for well-positioned new entrants who can secure good locations before the market matures.{% else %}Emerging markets offer first-mover advantages — less direct competition, potentially better lease terms, and the opportunity to build a loyal player base before the market fills out. The trade-off is less pricing data and more uncertainty in demand projections.{% endif %}
## Top Cities in {{ country_name_en }} ## Top Cities in {{ country_name_en }}
The cities below are ranked by market score — a composite of population size, venue density, and data quality. Cities are ranked by market score — a composite of population size, venue density, and data quality. Higher-scoring cities generally offer larger addressable markets and more reliable benchmarks for financial planning.
| City | Market Analysis | | 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] }}) | {% for i in range(top_city_names | length) %}| [{{ top_city_names[i] }}](/{{ language }}/markets/{{ country_slug }}/{{ top_city_slugs[i] }}) | [View investment analysis →](/{{ language }}/markets/{{ country_slug }}/{{ top_city_slugs[i] }}) |
{% endfor %} {% endfor %}
Each city page includes detailed pricing data, a cost-benefit analysis, and a pre-configured financial planner seeded with local market data.
## Pricing Overview ## Pricing Overview
{% if median_peak_rate %} {% if median_peak_rate %}
@@ -55,6 +154,8 @@ Court rental rates across {{ country_name_en }} cities (median from Playtomic li
| Off-peak hours | {% if median_offpeak_rate %}{{ median_offpeak_rate | int }} {{ price_currency }}/hr{% else %}No data{% endif %} | | 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 %} | | Average hourly | {% if median_hourly_rate %}{{ median_hourly_rate | int }} {{ price_currency }}/hr{% else %}No data{% endif %} |
{% if median_offpeak_rate %}The spread between peak and off-peak rates ({{ median_peak_rate | int }} vs. {{ median_offpeak_rate | int }} {{ price_currency }}) reveals the revenue upside of smart utilization management: membership models, corporate bookings during shoulder hours, and dynamic pricing can meaningfully lift off-peak occupancy.{% endif %}
Prices vary significantly by city — larger cities with higher demand command premium rates. See individual city pages for city-specific benchmarks. Prices vary significantly by city — larger cities with higher demand command premium rates. See individual city pages for city-specific benchmarks.
{% else %} {% 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. 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.
@@ -62,11 +163,11 @@ Detailed pricing data from Playtomic is not yet available for {{ country_name_en
## Build Your Business Plan for {{ country_name_en }} ## 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. 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. From construction costs and court count to revenue projections and payback period, get a data-driven view of your investment before committing capital.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;"> <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 → 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> <a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Open the Planner</a>
</div> </div>
## FAQ ## FAQ
@@ -75,7 +176,20 @@ Every city has a different cost structure, competitive landscape, and customer b
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. 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?** **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. 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. Use the <a href="/{{ language }}/planner">financial planner</a> to model different locations side by side.
**What are typical padel court prices in {{ country_name_en }}?** **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 %} {% 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 %}
**How fast is padel growing in {{ country_name_en }}?**
Padel is one of the fastest-growing racquet sports in Europe. With {{ total_venues }} venues tracked across {{ city_count }} cities, {{ country_name_en }} shows {% if avg_market_score >= 65 %}a mature infrastructure — growth here comes mainly from increasing play frequency and premium offerings{% elif avg_market_score >= 40 %}clear growth momentum with rising demand and new venues opening{% else %}early-stage growth with significant potential for new entrants{% endif %}. The sport benefits from a low barrier to entry, high enjoyment factor, and strong word-of-mouth growth among players.
**Which cities have the best pricing data?**
Cities with higher market scores (like {{ top_city_names[0] }}) typically have the most comprehensive pricing data, because more venues are listed on Playtomic. Browse our <a href="/{{ language }}/markets/{{ country_slug }}">{{ country_name_en }} market overview</a> to see all cities ranked by market score.
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:12px;padding:1rem 1.25rem;margin:1.5rem 0;">
Considering a padel center in {{ country_name_en }}? Model your investment with real market data →
<a href="/{{ language }}/planner" style="font-weight:600;color:#1D4ED8;margin-left:0.25rem;">Open the Planner</a>
</div>
{% endif %}

View File

@@ -322,8 +322,9 @@ class TestReservedPaths:
def test_planner_reserved(self): def test_planner_reserved(self):
assert is_reserved_path("/planner/") is True assert is_reserved_path("/planner/") is True
def test_markets_reserved(self): def test_markets_not_reserved(self):
assert is_reserved_path("/markets") is True # /markets sub-paths are article URLs; explicit /markets route takes priority
assert is_reserved_path("/markets/germany/berlin") is False
def test_custom_path_allowed(self): def test_custom_path_allowed(self):
assert is_reserved_path("/padel-court-cost-miami") is False assert is_reserved_path("/padel-court-cost-miami") is False
@@ -456,7 +457,7 @@ class TestGenerationPipeline:
miami = await fetch_one("SELECT * FROM articles WHERE slug = 'test-city-en-miami'") miami = await fetch_one("SELECT * FROM articles WHERE slug = 'test-city-en-miami'")
assert miami is not None assert miami is not None
assert miami["url_path"] == "/en/markets/us/miami" assert miami["url_path"] == "/markets/us/miami"
assert miami["title"] == "Padel in Miami" assert miami["title"] == "Padel in Miami"
assert miami["template_slug"] == "test-city" assert miami["template_slug"] == "test-city"
assert miami["language"] == "en" assert miami["language"] == "en"
@@ -761,7 +762,7 @@ class TestPreviewArticle:
from padelnomics.content import preview_article from padelnomics.content import preview_article
result = await preview_article("test-city", "miami") result = await preview_article("test-city", "miami")
assert result["title"] == "Padel in Miami" assert result["title"] == "Padel in Miami"
assert result["url_path"] == "/en/markets/us/miami" assert result["url_path"] == "/markets/us/miami"
assert result["meta_description"] == "Padel costs in Miami" assert result["meta_description"] == "Padel costs in Miami"
assert "<h1>" in result["html"] assert "<h1>" in result["html"]
@@ -773,7 +774,7 @@ class TestPreviewArticle:
async def test_preview_with_language(self, db, pseo_env): async def test_preview_with_language(self, db, pseo_env):
from padelnomics.content import preview_article from padelnomics.content import preview_article
result = await preview_article("test-city", "miami", lang="de") result = await preview_article("test-city", "miami", lang="de")
assert result["url_path"] == "/de/markets/us/miami" assert result["url_path"] == "/markets/us/miami"
async def test_preview_unknown_template_raises(self, db, pseo_env): async def test_preview_unknown_template_raises(self, db, pseo_env):
from padelnomics.content import preview_article from padelnomics.content import preview_article