title: description: published: true date: 2026-02-24T16:56:07.887Z tags: editor: markdown dateCreated: 2026-02-23T15:24:29.506Z
Vision and Goals
Business Objectives
Primary Objective
Build a commercially viable SaaS platform that becomes the leading European solution for sports club and fitness studio management, generating recurring subscription revenue through a modular pricing model.
Revenue Model
| Tier | Target Segment | Included Features | Pricing |
|---|---|---|---|
| Starter | Micro-clubs (<20 members) | Core member management, billing, SEPA, mobile app, basic auth, email notifications, CSV import | EUR 0.99/month (EUR 9.99/year) -- low-barrier entry |
| Team | Small clubs and studios (<200 members) | Full MEMBER package, courses, events/tournaments, basic CRM, basic support/ticketing, basic accounting/DATEV, resources, club dashboards, shop | EUR 29/month (EUR 299/year) -- competitive with easyVerein, ClubDesk |
| Professional | Mid-size organizations (200--2,000 members) | All modules incl. hardware access control, full CRM/Support/Accounting, all dashboards, all integrations, homepage builder | EUR 99/month (EUR 999/year) |
| Enterprise | Chains, franchises, municipal (2,000+ members) | All modules + white-label, franchise management, SSO/LDAP/Keycloak, AI features, consulting, dedicated support | Custom pricing, annual contracts |
All prices net (plus applicable VAT).
No zero-euro strategy -- every user must have a billable account to ensure reachability and commitment. Even the Starter tier at EUR 0.99/month validates payment credentials, ensures the user has a real identity, and creates a commercial relationship from day one.
Trial Studio
Interested parties can create a Trial Studio to experiment with the platform before committing to a paid plan. The Trial Studio provides a risk-free evaluation environment with the following constraints:
- No payment method required -- trial creation requires only an email address and organization name
- Full feature access -- all features of the Professional tier are available for evaluation, including dashboards, member management, billing configuration, and resource booking
- No outbound messaging -- Trial Studios cannot send messages (email, push notifications, SMS). This prevents abuse (spam), protects the platform's sender reputation, and ensures only paying customers use communication infrastructure
- Automatic deletion after 30 days -- Trial Studios and all associated data are permanently deleted after 30 days with no option to extend. Users receive reminder notifications at day 20 and day 27
- Conversion path -- at any point during the trial, the user can convert to a Starter plan (EUR 0.99/month) by adding a payment method. All data is preserved on conversion
- Sample data included -- Trial Studios are pre-populated with realistic sample data (10 demo members, 2 membership plans, sample transactions) so users can explore immediately without manual setup
- Watermark -- all screens display a subtle "Trial Studio -- X days remaining" banner to maintain awareness of the trial status
The Trial Studio replaces the traditional freemium model. Instead of a permanently free tier that attracts non-serious users and creates support burden, the Trial Studio offers a time-limited, full-featured evaluation that drives conversion to the Starter plan.
Growth Targets
- Year 1: 100 paying clients (Phase 1 validation), product-market fit confirmed, aggressive global outreach via marketing automation (email sequences, content marketing, trade show pipeline) with DACH as initial focus
- Year 2: 500+ clients across Europe, positive unit economics, automated lead nurturing driving 60%+ of new sign-ups
- Year 3: 2,000+ clients, expansion into Benelux, Nordics, Southern Europe, first non-EU markets
- Year 5: 10,000+ clients, marketplace revenue, partner ecosystem established
Marketing automation is the primary acquisition engine -- globally, with DACH as initial focus. Automated drip campaigns, SEO-optimized content in 24 EU languages, and self-service Trial Studio sign-up must drive the majority of leads by Year 2. The accessible pricing (Starter at EUR 0.99/month) keeps the cost barrier low and shifts the conversion bottleneck to product experience, not price negotiation. While DACH provides the initial customer base and product-market fit validation, the platform's multilingual architecture enables global reach from day one.
Distribution Channels
- Direct sales -- Outbound to clubs and studios in the DACH region
- Partner network -- Resellers, consultants, sports associations
- White-label -- OEM licensing to franchise networks and industry partners
- Marketplace -- Self-service sign-up via website with Trial Studio onboarding
- Referral program -- Existing clients incentivized to recommend the platform
- Trade shows -- FIBO, IHRSA Europe, national sports association conferences
Technical Goals
Cross-Platform Delivery
The platform must be accessible on every device a sports organization uses, from the front desk PC to a trainer's smartphone on the gym floor.
| Channel | Technology | Priority |
|---|---|---|
| Web application (desktop) | Responsive SPA (Flutter Web or dedicated) | v1.0 |
| iOS app | Flutter (single codebase) | v1.0 |
| Android app | Flutter (single codebase) | v1.0 |
| Tablet (check-in kiosk) | Flutter with kiosk mode | v2.0 |
| API / Headless | REST + GraphQL + Webhooks | v1.0 |
| Offline mode | Local storage with sync queue | v2.0 |
Internationalization (I18N) -- EU Multilingual from Day One
The platform supports all 24 official languages of the European Union from the initial release. This is a strategic decision: sports clubs and fitness studios operate across the EU single market, and members expect to interact with the platform in their native language. Rather than launching with a handful of languages and retrofitting later (which always results in inconsistent coverage), Membership treats full EU language support as a baseline requirement.
Supported Languages (24 EU Official Languages)
| Code | Language | Code | Language | Code | Language |
|---|---|---|---|---|---|
bg |
Bulgarian | fr |
French | mt |
Maltese |
hr |
Croatian | de |
German | pl |
Polish |
cs |
Czech | el |
Greek | pt |
Portuguese |
da |
Danish | hu |
Hungarian | ro |
Romanian |
nl |
Dutch | ga |
Irish | sk |
Slovak |
en |
English | it |
Italian | sl |
Slovenian |
et |
Estonian | lv |
Latvian | es |
Spanish |
fi |
Finnish | lt |
Lithuanian | sv |
Swedish |
Base Language
English (en) is the base language for all translation files. All translation keys are authored in English first, and all other 23 languages are translated from the English source. The English version serves as the fallback when a translation is missing in any other language.
Translation File Strategy
| Layer | Format | Location | Tooling |
|---|---|---|---|
| Flutter frontend | ARB (Application Resource Bundle) | frontend/membership_app/lib/l10n/app_<locale>.arb |
Flutter gen-l10n, intl package |
| Spring Boot backend | Java properties | src/main/resources/messages_<locale>.properties |
Spring MessageSource, ReloadableResourceBundleMessageSource |
| Email templates | Thymeleaf with i18n | templates/email/<template>_<locale>.html |
Thymeleaf #{...} expressions |
| PDF templates | Thymeleaf with i18n | templates/pdf/<template>_<locale>.html |
Thymeleaf #{...} expressions |
The ARB files for Flutter follow this naming convention:
- app_en.arb -- English (base, contains descriptions and placeholders)
- app_de.arb -- German
- app_fr.arb -- French
- ... one file per supported locale
The Spring Boot properties files follow:
- messages.properties -- English (default fallback)
- messages_de.properties -- German
- messages_fr.properties -- French
- ... one file per supported locale
Translation Management
A dedicated translation management workflow ensures consistent quality:
- Key creation: Developers add new keys to
app_en.arb(frontend) ormessages.properties(backend) with descriptive names following the convention<feature>.<screen>.<element>(e.g.,member.form.firstNameLabel,payment.status.settled) - Translation export: ARB and properties files are exported to a translation management system (TMS) such as Crowdin, Lokalise, or Phrase
- Professional translation: All 23 non-English languages are translated by professional translators with sports/fitness domain knowledge
- Review: Native speaker reviewers validate translations in context (screenshots provided)
- Import: Translated files are imported back into the codebase via CI/CD pipeline
- Validation: Automated checks verify all keys exist in all 24 language files, no placeholders are missing, and pluralization rules are correct
Locale Negotiation
Locale is determined through a cascade:
- User preference (stored in user profile, highest priority)
- Browser/device locale (detected from
Accept-Languageheader orPlatform.localeName) - Entity default locale (configured per organization)
- Fallback: English (
en)
On the frontend, the Localizations.localeOf(context) resolves the active locale. On the backend, LocaleContextHolder.getLocale() provides the request-scoped locale, set by a LocaleChangeInterceptor that reads the Accept-Language header or a lang query parameter.
Non-EU Languages for EU Residents
Large non-EU citizen populations living in EU countries require their native languages for member-facing content. These are not hypothetical future markets -- they are real members walking into studios and clubs today. For example, approximately 3 million Turkish speakers live in Germany, ~1.5 million Arabic speakers reside across the EU, and significant Russian, Ukrainian, Serbian, and Albanian communities exist throughout Western Europe. Providing these languages for member-facing screens (profile, booking, check-in, payment history) is essential for inclusivity and market reach.
Priority non-EU languages (Phase 2):
| Code | Language | Primary EU Resident Population | Script Direction |
|---|---|---|---|
tr |
Turkish | ~3M in Germany, ~500K in Netherlands, ~300K in Austria | LTR |
ar |
Arabic | ~1.5M across EU (Germany, France, Sweden, Netherlands) | RTL |
ru |
Russian | ~1M in Germany, ~500K in Baltic states, ~300K in Finland | LTR |
uk |
Ukrainian | ~1.5M across EU (post-2022 refugee wave, Germany, Poland, Czech Republic) | LTR |
sr |
Serbian | ~500K in Germany, Austria, Switzerland | LTR (Latin script) |
sq |
Albanian | ~500K in Germany, Switzerland, Italy, Greece | LTR |
zh |
Chinese (Simplified) | ~300K across EU (UK, Germany, France, Italy) | LTR |
he |
Hebrew | ~100K across EU (Germany, France, UK) | RTL |
These languages are added to the frontend ARB files and backend message bundles alongside the 24 EU languages, bringing the total to 32 supported languages.
RTL Support
Required -- Arabic and other RTL languages are needed for non-EU resident populations in the EU, even without expansion into RTL-dominant countries. The frontend must support bidirectional text (BiDi) from v1.0.
The Flutter framework provides built-in RTL support via the Directionality widget. All layouts must be tested in both LTR and RTL modes. Specific requirements:
- Mirrored layouts: Navigation rails, drawers, and action buttons must mirror for RTL locales
- Text alignment: Form labels, input fields, and body text must respect text direction
- Icon placement: Directional icons (arrows, chevrons) must flip for RTL
- Mixed content: BiDi text handling for screens displaying both LTR and RTL content (e.g., an Arabic member name alongside a German address)
- Testing: RTL layout testing is included in the QA checklist for every screen
Supported Currencies (16)
The platform supports 16 currencies covering the EU economic area, key global currencies, and currencies matching the supported non-EU languages. Currency support parallels the language strategy: just as every EU official language is supported from v1.0, every EU currency is supported from v1.0 alongside the currencies needed for non-EU resident populations.
EU Currencies (8):
| Code | Currency | Countries | Symbol |
|---|---|---|---|
| EUR | Euro | 20 Eurozone countries (DE, FR, IT, ES, NL, BE, AT, IE, FI, PT, EL, SK, SI, EE, LV, LT, MT, CY, LU, HR) | € |
| BGN | Bulgarian Lev | Bulgaria | лв |
| CZK | Czech Koruna | Czech Republic | Kč |
| DKK | Danish Krone | Denmark | kr |
| HUF | Hungarian Forint | Hungary | Ft |
| PLN | Polish Zloty | Poland | zł |
| RON | Romanian Leu | Romania | lei |
| SEK | Swedish Krona | Sweden | kr |
Non-EU Currencies (8):
| Code | Currency | Reason | Symbol |
|---|---|---|---|
| CHF | Swiss Franc | Switzerland (DACH market, not EU but key target) | Fr |
| USD | US Dollar | Global reference currency, used in non-US markets | $ |
| GBP | British Pound | United Kingdom (post-Brexit, significant market) | £ |
| TRY | Turkish Lira | Turkish-speaking EU residents (~3M in DE) | ₺ |
| RUB | Russian Ruble | Russian-speaking EU residents | ₽ |
| UAH | Ukrainian Hryvnia | Ukrainian-speaking EU residents | ₴ |
| RSD | Serbian Dinar | Serbian-speaking EU residents | din |
| CNY | Chinese Yuan Renminbi | Chinese-speaking EU residents | ¥ |
Base currency: EUR is the platform's base currency. All subscription prices are quoted in EUR. Non-EUR currencies use daily ECB reference rates for display. Billing is always in the entity's configured currency. Multi-currency billing (invoicing in a member's preferred currency) is a v2.0 feature for Professional+ tiers.
Date, Number, and Currency Formatting
All date, number, and currency values are formatted according to the active locale using the intl package (Flutter) and java.text / java.time formatters (Spring Boot):
| Data Type | Example (de) | Example (en) | Example (fr) | Package |
|---|---|---|---|---|
| Date | 22.02.2026 | 02/22/2026 | 22/02/2026 | DateFormat |
| Time | 14:30 | 2:30 PM | 14:30 | DateFormat |
| Number | 1.234,56 | 1,234.56 | 1 234,56 | NumberFormat |
| Currency | 1.234,56 EUR | EUR 1,234.56 | 1 234,56 EUR | NumberFormat.currency() |
| Percentage | 19,00 % | 19.00% | 19,00 % | NumberFormat.percentPattern() |
Important: Monetary values are always stored and transmitted in a locale-independent format (plain decimal numbers). Locale-specific formatting is applied only at the presentation layer (UI, PDF, email).
Address Formatting
Address formats vary significantly across EU countries. The platform uses a per-country address template:
| Country | Format |
|---|---|
| Germany | {street}\n{postCode} {city} |
| France | {street}\n{postCode} {city} |
| United Kingdom | {street}\n{city}\n{postCode} |
| Netherlands | {street}\n{postCode} {city} |
| Italy | {street}\n{postCode} {city} ({province}) |
Templates are stored in configuration and can be overridden per entity.
Translation Key Conventions
Keys follow a hierarchical dot notation:
# Pattern: <module>.<screen|component>.<element>
member.list.title = Members
member.list.searchPlaceholder = Search by name, email, or member number...
member.form.firstNameLabel = First Name
member.form.firstNameRequired = First name is required
member.detail.contractSection = Active Membership
payment.status.new = Not yet processed
payment.status.paid = Paid
payment.status.settled = Settled
common.action.save = Save
common.action.cancel = Cancel
common.action.delete = Delete
common.validation.required = This field is required
common.validation.invalidEmail = Please enter a valid email address
Pluralization uses ICU message format:
member.list.resultCount = {count, plural, =0{No members found} =1{1 member found} other{{count} members found}}
Compliance and Security
| Requirement | Standard | Implementation |
|---|---|---|
| Data protection | GDPR (EU 2016/679) | Data minimization, consent management, right to erasure, DPO tooling |
| Electronic signatures | eIDAS (EU 910/2014) | Qualified electronic signatures for contracts, compliant audit trail |
| Payment security | PCI DSS Level 4 | Tokenized card storage, no raw card data in platform |
| Authentication | OWASP ASVS Level 2 | MFA, session management, brute-force protection |
| Data residency | Per-country requirements | EU-hosted infrastructure, configurable data location |
| Accessibility | WCAG 2.1 AA | Screen reader support, keyboard navigation, contrast ratios |
Multi-Tenant Architecture
Every aspect of the platform operates in a multi-tenant model where a single deployment serves all clients with complete data isolation:
- Database isolation: Schema-per-tenant or row-level security (configurable per deployment size)
- Configuration isolation: Each tenant has independent settings, branding, payment configuration, and workflow rules
- White-label support: Custom domain, logo, color scheme, email sender identity, app store listing (for enterprise tier)
Modular Architecture
The platform is composed of independently deployable packages that can be activated per tenant:
- Each package can be enabled/disabled per tenant without redeployment
- Inter-package communication via internal event bus (not direct coupling)
- Package-level feature flags for granular control during rollout
API-First Design
Every feature in the platform is accessible through a public API before any UI is built:
| Protocol | Use Case | Priority |
|---|---|---|
| REST (OpenAPI 3.1) | Primary CRUD and business operations | v1.0 |
| GraphQL | Flexible querying for dashboards and reports | v2.0 |
| Webhooks | Real-time event notifications to external systems | v1.0 |
| MCP (Model Context Protocol) | AI agent integration for chatbots and automation | v3.0 |
| WebSocket | Live updates (check-in feed, chat, notifications) | v2.0 |
Microservice Readiness
The initial deployment is a modular monolith for simplicity with a 4-person team, but the architecture is designed for extraction into microservices as scale demands:
- Domain boundaries align with the 8 packages
- Asynchronous messaging (RabbitMQ/Kafka) between domains from day one
- No shared database tables across domain boundaries
- Each domain owns its data and exposes it only through APIs
Cloud and CDN
- Primary hosting: Hetzner Cloud (Nuremberg, nbg1) -- committed provider, EU-based, GDPR-compliant, cost-effective
- CDN: Static assets, media files, and generated documents served via edge network
- Offline mode: Service worker caching for critical workflows (check-in, attendance, basic member lookup)
- Auto-scaling: Horizontal scaling based on tenant activity patterns (peak hours at studios)
Non-Functional Requirements
Scalability
| Metric | Target (v1.0) | Target (Year 3) |
|---|---|---|
| Concurrent users | 500 | 50,000 |
| Total members across tenants | 50,000 | 5,000,000 |
| API requests/second | 100 | 10,000 |
| File storage | 100 GB | 50 TB |
| Response time (p95) | <500ms | <200ms |
| Uptime SLA | 99.5% | 99.9% |
Offline Mode
Sports facilities often have poor connectivity (basements, rural areas, outdoor fields). Critical workflows must function without internet:
- Check-in/attendance: Local cache of member list, sync when online
- Payment recording: Queue transactions offline, process when connected
- Course attendance: Mark attendance locally, sync to server
- Member lookup: Basic profile data cached for authorized staff
Accessibility
- WCAG 2.1 AA compliance for all web interfaces
- Screen reader compatibility (ARIA labels, semantic HTML)
- Keyboard-only navigation for all workflows
- Minimum contrast ratio 4.5:1 for text, 3:1 for large text
- Touch targets minimum 44x44 pixels on mobile
- No information conveyed by color alone
Performance
- First contentful paint: target < 0.2 seconds, absolute maximum < 1.5 seconds (any page exceeding 1.5s is a blocking bug)
- Time to interactive: target < 0.5 seconds, absolute maximum < 2.0 seconds
- Lighthouse score > 90 (Performance, Accessibility, Best Practices)
- Bundle size < 500 KB (initial load), code splitting for feature packages
- Flutter Web compiled to WASM for near-native execution speed
Design Philosophy: "Effortless UX"
The primary users of Membership are not software professionals. They are volunteer club administrators who log in twice a month, studio managers juggling multiple tasks between client sessions, trainers checking their phone between sets, and members who just want to book a class. The design philosophy is ruthlessly focused on reducing cognitive load.
Principles
1. Goal and Task Orientation
Every screen answers one question: "What is the user trying to accomplish right now?" Navigation, layout, and information hierarchy are organized around tasks (e.g., "Add a new member", "Export SEPA file"), not around data structures (e.g., "Consumer entity list").
2. Guided Workflows
Multi-step processes use wizard-style flows with clear progress indicators, contextual validation, and sensible defaults. A club admin creating their first membership plan should be able to complete it in under 3 minutes without reading documentation.
3. Simple Language
No technical jargon in the UI. "Members" not "Consumers", "Payment" not "Transaction", "Export bank file" not "Generate SEPA XML". Error messages explain what happened and what to do next, in plain language.
4. Contextual Help
Every complex screen includes inline help text, tooltips on non-obvious fields, and links to relevant documentation. First-time users see onboarding tooltips that experienced users can dismiss permanently.
5. Role-Based Simplification
Each role sees only what they need:
| Role | Visible Features | Complexity Level |
|---|---|---|
| Member | Profile, bookings, payments, schedule | Minimal (consumer app) |
| Trainer / Coach | Attendance, course management, member notes | Low (field use) |
| Club / Studio Admin | Full member, financial, and operational management | Medium (daily use) |
| Group Admin | Multi-location dashboards, consolidated reports | Medium-High |
| Franchisor Admin | Brand management, franchise analytics, pricing | High (strategic) |
| System Admin | Tenant management, system configuration, integrations | Full (technical) |
6. Error-Friendliness
- Undo for destructive actions (with grace period)
- Confirmation dialogs only for truly irreversible operations
- Auto-save for forms and drafts
- Clear recovery paths when something goes wrong
7. Automation and Smart Suggestions
The system should anticipate user needs:
- Auto-suggest membership plans based on member age and preferences
- Pre-fill bank account details from IBAN validation
- Suggest payment reminders when invoices are overdue
- Recommend course times based on historical attendance patterns
- Flag potential data quality issues (duplicate members, expired contracts)
8. Vibe Design
The visual design evokes energy, community, and professionalism:
- Clean, modern aesthetic with generous whitespace
- Sport-inspired accent colors (configurable per tenant brand)
- Motion design that feels responsive without being distracting
- Dark mode support for evening/gym-floor use
- Consistent component library ensuring visual coherence across all packages
Success Metrics
Commercial Metrics
| Metric | Definition | Target (Year 1) |
|---|---|---|
| Monthly Recurring Revenue (MRR) | Sum of all active subscriptions | Positive (any amount) |
| Client Acquisition Cost (CAC) | Total sales+marketing spend / new clients | < 6-month LTV |
| Churn Rate | Clients lost per month / total clients | < 5% monthly |
| Net Promoter Score (NPS) | User satisfaction survey | > 40 |
| Time to Value | Days from signup to first meaningful use | < 1 day |
| Feature Adoption | % of clients using each package | > 60% for MEMBER |
Technical Metrics
| Metric | Definition | Target |
|---|---|---|
| Deployment frequency | Production releases per week | >= 1 |
| Lead time for changes | Commit to production | < 1 day |
| Mean time to recovery (MTTR) | Incident to resolution | < 1 hour |
| Change failure rate | Deployments causing incidents | < 5% |
| API availability | Successful requests / total requests | > 99.9% |
| Test coverage | Line coverage across all modules | > 80% |
| Lighthouse score | Average across key pages | > 90 |
User Experience Metrics
| Metric | Definition | Target |
|---|---|---|
| Task completion rate | Users completing key workflows | > 95% |
| Time on task (new member creation) | From start to saved member | < 2 minutes |
| Support ticket volume | Tickets per 100 active users/month | < 5 |
| Onboarding completion | Users finishing setup wizard | > 80% |
| Mobile app rating | App Store / Play Store | > 4.5 stars |