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 Geschaeftsfuehrer
  • supportEmail — support@membership-one.com
  • billingEmail — billing@membership-one.com
  • datenschutzEmail — datenschutz@membership-one.com
  • slaTarget — 99.5 (percent availability target)
  • maintenanceWindow — 02:00-06:00 CET
  • dogfooding — 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 EMAIL Initial outreach to new leads
Demo Follow-up OUTREACH_FOLLOWUP EMAIL 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

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