Tenant Zero Configuration
Purpose
Membership One GmbH operates as "Tenant Zero" on its own platform. This is a deliberate dogfooding strategy: the company uses the same production instance as its customers for CRM, support, accounting, billing, and communication. This approach ensures that the team experiences the product from the customer's perspective, catches usability issues early, and validates new features before release.
Tenant Zero is the root entity (entity_id = 1) with no parent organization, type VENDOR, and tier ENTERPRISE. It is inserted via Flyway migration V1200__tenant_zero_config.sql.
Organization Configuration
| Field | Value |
|---|---|
| Name | Membership One GmbH |
| Slug | membership-one |
| Type | VENDOR |
| Tier | ENTERPRISE |
| Status | ACTIVE |
| Currency | EUR |
| Locale | de_DE |
| Timezone | Europe/Berlin |
| Country | DE (Germany) |
| Billing Day | 1 (first of month) |
| Contact Email | info@membership-one.com |
| Website | https://www.membership-one.com |
Settings (JSONB)
The settings column stores company-specific metadata not covered by standard columns:
companyHrb— Handelsregister number (HRB XXXXX, to be filled after GmbH registration)companyUstIdNr— VAT ID (DE XXXXXXXXX, to be filled after tax office assignment)managingDirector— Name of the GeschaeftsfuehrersupportEmail— support@membership-one.combillingEmail— billing@membership-one.comdatenschutzEmail— datenschutz@membership-one.comslaTarget— 99.5 (percent availability target)maintenanceWindow— 02:00-06:00 CETdogfooding— true (marker flag for Tenant Zero)
CRM Pipeline
The CRM pipeline for Membership One's sales team consists of 9 stages, configured via the default pipeline inserted in migration V800__create_crm.sql:
| Stage | Description | Auto-Actions |
|---|---|---|
| NEW | Lead created (inbound/outbound) | Auto-assign to sales manager, send welcome email |
| CONTACTED | First outreach completed | - |
| DEMO_SCHEDULED | Demo meeting arranged | Send calendar invite |
| DEMO_COMPLETED | Demo delivered | Create follow-up task (48h) |
| TRIAL | Trial tenant provisioned | Provision trial tenant, start drip sequence |
| PROPOSAL_SENT | Pricing proposal shared | Create follow-up task (7d) |
| NEGOTIATION | Active negotiation | - |
| WON | Deal closed successfully | Convert to member, create contract |
| LOST | Deal lost | Record reason, schedule win-back (90d) |
Lead sources: WEBSITE, REFERRAL, EVENT, LINKEDIN, COLD_OUTREACH, PARTNER.
Support Categories
Support tickets for Membership One's own customers use the categories defined in the ticket table CHECK constraint (V801):
| Category | SLA (Enterprise) | Description |
|---|---|---|
| BUG_REPORT | P1: 1h, P2: 4h | Software defects and errors |
| FEATURE_REQUEST | P3: 48h | Enhancement requests |
| BILLING_QUESTION | P2: 4h | Invoice, payment, SEPA questions |
| ONBOARDING_HELP | P2: 4h | Setup assistance, data import |
| GENERAL | P3: 48h | General inquiries |
| ACCESS_ISSUE | P1: 1h | Login problems, access control issues |
Accounting
Chart of Accounts
Membership One uses a subset of SKR03 (German standard chart of accounts), seeded in V001__seed_data.sql with approximately 30 accounts covering:
- Assets (1000-1800): Cash, bank, receivables (membership fees, courses, shop, SEPA chargebacks), VAT input
- Liabilities (1600-1790): Payables, third-party funds (Fremdbetraege), VAT output
- Revenue (4400-4440): Membership fees, courses/events, shop/merchandise, setup fees, day passes, personal training, adjustments (storno/credit notes), pass-through amounts
- Expenses (6300-7000): Hosting/cloud, software licenses, insurance, postage, payment provider fees, SEPA chargeback costs, bank fees, personnel
Cost Centers
Five cost centers are configured for Membership One (inserted in V802):
| Code | Name | Description |
|---|---|---|
| KST-100 | Development | Software development and engineering |
| KST-200 | Infrastructure | IT infrastructure, servers, hosting |
| KST-300 | Marketing | Marketing, advertising, campaigns |
| KST-400 | Sales | Sales team, business development |
| KST-500 | Administration | General administration, office |
DATEV Export
Monthly accounting entries are exported via the DATEV CSV Buchungsstapel format (EXTF v700) for the external tax advisor. The export is triggered via AccountingController.exportDatev().
Communication: Lifecycle Email Templates
Six lifecycle email templates automate customer onboarding and retention. All templates use the Membership One branding (primary color #2CC5CE) and are stored in the communication_template table with type_cd prefix LIFECYCLE_*.
| Template | Type Code | Trigger | Purpose |
|---|---|---|---|
| Welcome | LIFECYCLE_WELCOME | Tenant provisioning (day 0) | Dashboard link, getting started |
| Day 3 Tips | LIFECYCLE_DAY3 | 3 days after signup | Add member, set up billing, customize branding |
| Day 7 Features | LIFECYCLE_DAY7 | 7 days after signup | QR check-in, courses, resources, events, documents |
| Day 14 Trial | LIFECYCLE_DAY14 | 14 days after signup | Trial expiry warning, upgrade CTA |
| Day 30 Check-in | LIFECYCLE_DAY30 | 30 days after signup | NPS feedback request |
| Churn Warning | LIFECYCLE_CHURN | 14+ days inactive | Re-engagement, support link |
Sales Outreach Templates
Three outreach templates support the CRM pipeline:
| Template | Type Code | Channel | Use Case |
|---|---|---|---|
| Cold Email | OUTREACH_COLD | Initial outreach to new leads | |
| Demo Follow-up | OUTREACH_FOLLOWUP | Post-demo summary and trial link | |
| LinkedIn Message | OUTREACH_LINKEDIN | NOTE | LinkedIn connection request text |
SaaS Billing
Membership One's customers are managed as consumers in the My-Factura billing system:
- Payment method: SEPA Lastschrift (direct debit) via My-Factura / CashControl
- Billing cycle: Monthly or annual, invoiced in advance on billing day 1
- Revenue tracking: MRR (Monthly Recurring Revenue) and ARR (Annual Recurring Revenue) via accounting entries
- Storno: Full and partial invoice cancellation with automatic credit note generation
Legal Documents
Contract-related legal documents are auto-generated as PDFs using Thymeleaf templates stored in templates/legal/:
| Document | Template | Auto-Generated | Version Tracked |
|---|---|---|---|
| Terms of Service (AGB) | agb.html | Per contract | Yes |
| Data Processing Agreement (AVV) | avv.html | Per customer | Yes |
| Privacy Policy (Datenschutz) | datenschutz.html | Per organization | Yes |
| Legal Notice (Impressum) | impressum.html | Static | Yes |
| Cookie Policy | cookie-policy.html | Static | Yes |
Each document is rendered with organization-specific variables (name, address, tier, pricing) and stored as a versioned PDF in the document management system.
Zero External SaaS Dependencies
Membership One minimizes external SaaS dependencies by using its own platform and self-hosted tools:
| Function | Solution | External? | Notes |
|---|---|---|---|
| CRM | Own platform (membership-crm) | No | Lead, deal, pipeline management |
| Support / Ticketing | Own platform (membership-support) | No | Tickets, knowledge base, SLA |
| Accounting | Own platform + DATEV | Partial | General ledger in-app, DATEV export for tax advisor |
| Billing / Invoicing | Own platform + My-Factura | Yes | My-Factura for invoice generation and SEPA |
| Communication | Own platform + SMTP relay | Partial | Template engine in-app, external SMTP for delivery |
| Document Management | Own platform (membership-document) | No | S3-compatible storage (MinIO) |
| Monitoring | Self-hosted (Prometheus, Grafana, Icinga) | No | On Hetzner infrastructure |
| CI/CD | GitLab Free (self-managed or SaaS) | Partial | Free tier sufficient for team size |
| Credential Management | Vaultwarden (self-hosted) | No | Bitwarden-compatible, on Hetzner |
| Certificate Management | Dehydrated (ACME) | No | Let's Encrypt via DNS-01 |
| Infrastructure | Hetzner Cloud | Yes | ~EUR 100/month for production |