diff --git a/CHANGELOG.md b/CHANGELOG.md index f29fd33..1ab1f25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Changed - Auto-create Resend audiences per blueprint: `capture_waitlist_email()` now derives the audience name from `request.blueprints[0]` (e.g., `waitlist-auth`, `waitlist-suppliers`) and lazily creates audiences via the Resend API on first use, caching IDs in a new `resend_audiences` table; removes `RESEND_AUDIENCE_WAITLIST` env var — only `RESEND_API_KEY` needed +### Added +- Waitlist mode (lean startup smoke test): `WAITLIST_MODE` config flag intercepts `/auth/signup`, `/suppliers/signup`, and `/planner/export` to capture emails or show "coming soon" messaging before Paddle billing is ready; confirmation emails sent via Resend; optional `RESEND_AUDIENCE_WAITLIST` for bulk launch blast; flip flag to `false` and all flows revert to normal + +### Changed +- Redesign padel racket SVG logo/favicon: filled dark silhouette with white punched-through holes (3×3 grid), proper throat tapering to handle at bottom, grip tape lines — replaces outline-only stroke approach; bump favicon cache to v4 + ### Added - Simple A/B testing with `@ab_test` decorator and Umami `data-tag` integration - SEO defaults in `base.html`: canonical, og:url, og:type, og:image (logo fallback), og:title, og:description, twitter:card — every page gets these automatically, child templates override as needed diff --git a/padelnomics/src/padelnomics/static/images/favicon.svg b/padelnomics/src/padelnomics/static/images/favicon.svg index a6b4eeb..47a815d 100644 --- a/padelnomics/src/padelnomics/static/images/favicon.svg +++ b/padelnomics/src/padelnomics/static/images/favicon.svg @@ -1,13 +1,22 @@ - - - - - - - - - - + + + + + - + + + + + + + + + + + + + + + diff --git a/padelnomics/src/padelnomics/templates/base.html b/padelnomics/src/padelnomics/templates/base.html index d825ad7..9ffb4c9 100644 --- a/padelnomics/src/padelnomics/templates/base.html +++ b/padelnomics/src/padelnomics/templates/base.html @@ -6,10 +6,10 @@ {% block title %}{{ config.APP_NAME }}{% endblock %} - padelnomics @@ -146,13 +153,22 @@
- padelnomics
diff --git a/scratch/design_prototype.html b/scratch/design_prototype.html new file mode 100644 index 0000000..4141de6 --- /dev/null +++ b/scratch/design_prototype.html @@ -0,0 +1,1078 @@ + + + + + + Padelnomics – Design Prototype + + + + + + + + + + + + +
+
+
+
+
🎾 Padel court financial planner
+

+ Plan Your Padel
+ Business in Minutes,
+ Not Months +

+

+ Model your padel court investment with 60+ variables, sensitivity analysis, + and professional-grade projections. Then get matched with verified suppliers. +

+ +
+ No signup required + 60+ variables + Unlimited scenarios +
+
+ +
+
Quick ROI Estimate
+
Drag the sliders to see your projection
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
Investment
+
€330K
+
+
+
Monthly Cash Flow
+
€7K
+
+
+
Payback Period
+
3.9 yr
+
+
+
Annual ROI
+
26%
+
+
+

Assumes indoor rent model, €8/m² rent, staff costs, 5% interest, 10-yr loan.

+ Open Full Planner → +
+
+
+
+ + +
+ + + +
+

Your Journey

+
+
+
01
+

Explore Soon

+

Market demand analysis, whitespace mapping, location scoring.

+
+
+
02
+

Plan

+

Model your investment with 60+ variables, charts, and sensitivity analysis.

+
+
+
03
+

Finance Soon

+

Connect with banks and investors. Your planner becomes your business case.

+
+
+
04
+

Build

+

Browse 120+ court suppliers across 24 countries. Get matched to your specs.

+
+
+
05
+

Grow Soon

+

Launch playbook, performance benchmarks, and expansion analytics.

+
+
+
+ + + + +
+

Built for Serious Padel Entrepreneurs

+
+
+

🔧 60+ Variables

+

Every assumption is adjustable. Court costs, rent, pricing, utilization, financing terms, exit scenarios. Nothing is hard-coded.

+
+
+

📋 6 Analysis Tabs

+

Assumptions, Investment (CAPEX), Operating Model, Cash Flow, Returns & Exit, and Key Metrics. Each with interactive charts.

+
+
+

☀️ Indoor & Outdoor

+

Model indoor halls (rent or build) and outdoor courts with seasonality. Compare scenarios side by side.

+
+
+

📉 Sensitivity Analysis

+

See how your returns change with different utilization rates and pricing. Find your break-even point instantly.

+
+
+

🎯 Professional Metrics

+

IRR, MOIC, DSCR, cash-on-cash yield, break-even utilization, RevPAH, debt yield. The metrics banks and investors want.

+
+
+

💾 Save & Compare

+

Save unlimited scenarios. Test different locations, court counts, financing structures. Find the optimal plan.

+
+
+
+ + + + +
+

Find the Right Suppliers for Your Project

+

120+ verified suppliers across 24 countries. Manufacturers, builders, turf, lighting, and more.

+
+
+
1
+

Plan Your Venue

+

Use the financial planner to model your courts, budget, and timeline.

+
+
+
2
+

Get Quotes

+

Request quotes and we match you with suppliers based on your project specs.

+
+
+
3
+

Compare & Build

+

Receive proposals from matched suppliers. No cold outreach needed.

+
+
+
+ + + + +
+

Frequently Asked Questions

+
+
+ What does the planner calculate? +

The planner produces a complete financial model: CAPEX breakdown, monthly operating costs, cash flow projections, debt service, IRR, MOIC, DSCR, payback period, break-even utilization, and sensitivity analysis.

+
+
+ Do I need to sign up? +

No. The planner works instantly with no signup. Create an account to save scenarios, compare configurations, and export PDF reports.

+
+
+ How does supplier matching work? +

When you request quotes through the planner, we share your project details with relevant suppliers from our directory. They contact you directly with proposals.

+
+
+ How accurate are the financial projections? +

The model uses real-world defaults based on European market data. Every assumption is adjustable so you can match your local conditions. The sensitivity analysis shows how results change across scenarios.

+
+
+
+ + + + +
+

Padel Court Investment Planning

+

+ Padel is the fastest-growing sport in Europe, with demand for courts far outstripping supply in Germany, the UK, Scandinavia, and beyond. Opening a padel hall can be a lucrative investment, but the numbers need to work. A typical indoor padel venue with 6-8 courts requires between €300K and €2-3M, with payback periods of 3-5 years for well-located venues. +

+

+ The key variables that determine success are location, construction costs, rent, and pricing strategy. Our financial planner lets you model all of these interactively, seeing the impact on your IRR, MOIC, cash flow, and debt service coverage ratio in real time. +

+
+ + + + +
+
+

Start Planning Today

+

Model your investment, then get matched with verified court suppliers across 24 countries.

+ Plan Your Padel Business → +
+
+ +
+ + + + + + + + + + + diff --git a/scratch/design_supplier_basic.html b/scratch/design_supplier_basic.html new file mode 100644 index 0000000..8c3beeb --- /dev/null +++ b/scratch/design_supplier_basic.html @@ -0,0 +1,709 @@ + + + + + + + CourtCraft GmbH — Padel Court Manufacturer · padelnomics + + + + + + + + + + +
+
+
+
+ + +
+
+ + Manufacturer + + + + Verified + +
+ +

CourtCraft GmbH

+
+ + Munich + + Germany + + + Est. 2009 +
+
+
+ +

"Engineering courts that last a generation — precision manufacturing for professional padel."

+
+ + +
+
+ + +
+
+ + +
+ + +
+
About
+ +

+ CourtCraft GmbH designs and manufactures professional padel courts at our 12,000 m² production facility in Munich, Germany. Founded in 2009 by former professional players, we combine German engineering precision with deep understanding of the game's technical demands. +

+

+ Our courts are installed across 34 countries, from private clubs and hotels to national federation training centres. Every CourtCraft court ships with a 15-year structural warranty and full documentation for planning authorities. We handle logistics and installation coordination in all major European markets. +

+
+ + Manufacturer + Installer + Turnkey + Indoor + Outdoor + Panoramic +
+
+ + +
+
Services Offered
+
+ +
+ + + + Court design & layout planning +
+
+ + + + Manufacturing & supply +
+
+ + + + Installation & commissioning +
+
+ + + + Lighting systems +
+
+ + + + Flooring & surfaces +
+
+ + + + After-sales & warranty +
+
+ + + + Permitting documentation +
+
+ + + + Project management +
+
+
+ + +
+
Service Area
+
+ + 🇩🇪 Germany + 🇦🇹 Austria + 🇨🇭 Switzerland + 🇳🇱 Netherlands + 🇧🇪 Belgium + 🇩🇰 Denmark + 🇸🇪 Sweden + 🇳🇴 Norway + 🇫🇮 Finland + 🇵🇱 Poland + 🇨🇿 Czech Republic + 🇸🇮 Slovenia +
+
+ +
+ + +
+ +
+ +
+ + +
+
+
Send an Enquiry
+ +
+ +

+ Questions about this supplier? Send a message via padelnomics and we'll relay it directly to CourtCraft GmbH. Your contact details will only be shared with this supplier. +

+
+
+ + +
+
+ + +
+
+
+ + +
+

+ Your message is relayed by padelnomics to this supplier. We do not sell your data. By submitting you agree to our + Privacy Policy and Terms of Use. +

+ +
+
+
+ + + +
+
+ + + + +
Ready to grow?
+
Start receiving project leads
+
Upgrade to Growth — get matched with buyers actively requesting quotes in your region.
+
+ + + + See Growth Plans → +
+ +
+ + + diff --git a/scratch/padelnomics-demand-side (1).jsx b/scratch/padelnomics-demand-side (1).jsx new file mode 100644 index 0000000..80da6ae --- /dev/null +++ b/scratch/padelnomics-demand-side (1).jsx @@ -0,0 +1,256 @@ +import { useState, useEffect } from "react"; + +const COURT_TYPES = ["Indoor", "Outdoor", "Both indoor & outdoor"]; +const SURFACES = ["Artificial turf", "Panoramic glass", "Standard glass", "No preference yet"]; +const LIGHTING = ["LED competition", "LED standard", "Natural light only", "Not sure yet"]; +const TIMELINES = ["ASAP (< 3 months)", "3–6 months", "6–12 months", "12+ months / exploring"]; +const BUDGETS = ["< €100K", "€100K – €250K", "€250K – €500K", "€500K – €1M", "> €1M", "Not sure yet"]; +const SERVICES = ["Court construction (turnkey)", "Court surfaces only", "Steel structures / canopy", "Glass walls", "Lighting systems", "Flooring / foundation", "Architecture & planning", "Financing / investment", "Consulting / feasibility"]; + +const CALC = { courts: 6, type: "Indoor (rented hall)", totalInvestment: "€285,000", monthlyRevenue: "€18,750", monthlyCosts: "€12,400", monthlyCashFlow: "€6,350", paybackYears: "3.7", irr: "22.4%", cashOnCash: "26.8%" }; + +export default function App() { + const [view, setView] = useState("results"); + const [bStep, setBStep] = useState(1); + const [anim, setAnim] = useState(true); + const [brief, setBrief] = useState({ courtType: "", courts: 6, surface: "", lighting: "", location: "", country: "Germany", timeline: "", budget: "", services: [], info: "", name: "", email: "", phone: "", company: "" }); + + useEffect(() => { setAnim(false); const t = setTimeout(() => setAnim(true), 50); return () => clearTimeout(t); }, [view, bStep]); + + const $ = { + bg: "#FFFFFF", soft: "#F8FAFC", muted: "#F1F5F9", + border: "#E2E8F0", borderDark: "#CBD5E1", + text: "#0F172A", sub: "#334155", dim: "#64748B", faint: "#94A3B8", + blue: "#1D4ED8", blueLight: "#3B82F6", bluePale: "#DBEAFE", blueGhost: "#EFF6FF", blueDark: "#1E40AF", + green: "#16A34A", greenPale: "#DCFCE7", + gold: "#D97706", goldPale: "#FEF3C7", + }; + const font = "'Inter', -apple-system, BlinkMacSystemFont, sans-serif"; + const mono = "'JetBrains Mono', 'SF Mono', monospace"; + + const Pill = ({ options, value, onChange, multi }) => ( +
+ {options.map(o => { + const a = multi ? value.includes(o) : value === o; + return ; + })} +
+ ); + + const Stat = ({ label, value, highlight, sub }) => ( +
+
{label}
+
{value}
+ {sub &&
{sub}
} +
+ ); + + return ( +
+ +
+ + {/* Header */} +
+
+
P
+ padelnomics +
+ {view !== "results" && } +
+ +
+ + {/* ─── RESULTS ─── */} + {view === "results" && (
+
+
Your Projection
+

{CALC.courts}-Court Indoor Padel Hall

+

Based on your inputs — {CALC.type}

+
+
+ + + +
+
+ + + +
+ + {/* CTA */} +
+
+
Next Step
+

Get quotes from verified court suppliers

+

Share your project specs and we'll connect you with pre-vetted suppliers who match your requirements. They'll reach out directly with tailored proposals — typically within 48 hours.

+
+ {["2–5 matched suppliers", "Direct contact, no middleman", "Free, no commitment", "Your data stays private"].map(t => ( +
{t}
+ ))} +
+
+ + Takes ~2 minutes +
+
+
+ +
+ {[["540+", "projects matched"], ["48h", "avg. response"], ["35+", "verified suppliers"]].map(([n, l]) => ( +
{n}
{l}
+ ))} +
+
)} + + {/* ─── BRIEF ─── */} + {view === "brief" && (
+
+ {["Project", "Details", "Contact"].map((l, i) => { + const n = i + 1, on = bStep === n, done = bStep > n; + return (
{l}
); + })} +
+ + {/* Brief 1 */} + {bStep === 1 && (
+

Tell us about your project

+

This helps us match you with the right suppliers. All fields optional.

+
+
setBrief(p => ({ ...p, courtType: v }))} />
+
+
setBrief(p => ({ ...p, courts: +e.target.value }))} style={{ flex: 1, accentColor: $.blue }} />
{brief.courts}
+
+
setBrief(p => ({ ...p, surface: v }))} />
+
setBrief(p => ({ ...p, lighting: v }))} />
+
+
+ +
+
)} + + {/* Brief 2 */} + {bStep === 2 && (
+

Project details

+

Help suppliers understand your timeline and scope.

+
+
+
setBrief(p => ({ ...p, location: e.target.value }))} style={{ width: "100%", background: $.bg, border: `1.5px solid ${$.border}`, borderRadius: "10px", padding: "11px 14px", fontSize: "14px", color: $.text, fontFamily: font, outline: "none", boxSizing: "border-box" }} onFocus={e => e.target.style.borderColor = $.blue} onBlur={e => e.target.style.borderColor = $.border} />
+
+
+
setBrief(p => ({ ...p, timeline: v }))} />
+
setBrief(p => ({ ...p, budget: v }))} />
+
setBrief(p => ({ ...p, services: p.services.includes(s) ? p.services.filter(x => x !== s) : [...p.services, s] }))} multi />
+