# Worked Example: Smoobu (SaaS B2B)

> Property management SaaS for short-term rental hosts.
> Demonstrates the full Kimball modelling procedure for a SaaS B2B business.

---

## Business Context Brief

| Field | Value |
|---|---|
| Company | Smoobu GmbH |
| Website | smoobu.com |
| Business type | SaaS B2B |
| Founded | 2014 |
| Headquarters | Berlin, Germany |
| Scale | 50,000 active accommodations, 200,000 active listings, 400,000 bookings/month |

**Business model:** Subscription SaaS priced per bookable property unit. Hosts pay monthly or annually to manage their short-term rental properties across multiple booking channels (Airbnb, Booking.com, Expedia, etc.) from a single platform.

**Pricing structure:**
| Plan | First unit | Additional unit | Commission | Notes |
|---|---|---|---|---|
| Professional Prepaid | €35/month | €12/month | 0% | Most popular |
| Professional Flex | €29/month | €12/month | 0.9% of bookings | Pay-as-you-go |
| Teams Pro+ | €55/month | €12/month | 0% | Includes dynamic pricing, e-invoicing |
| Dynamic Pricing add-on | +€12.99/month | per property | — | Optional add-on |

---

## Value Chain

```
Lead Acquisition → Trial (14 days free) → Subscription → Channel Connection → Feature Usage → Guest Communication → Renewal / Expansion → Churn
```

| Stage | Candidate fact table | Key events |
|---|---|---|
| Lead Acquisition | Marketing spend | Ad click, landing page visit, sign-up |
| Trial | Trial conversion (accumulating snapshot) | Trial start, feature first used, trial end |
| Subscription | Subscription revenue (periodic snapshot) | Invoice, payment, plan change |
| Channel Connection | (attribute of property dim) | Airbnb/Booking.com connected |
| Feature Usage | Feature usage (transaction) | Calendar sync, message sent, price updated |
| Renewal / Expansion | Subscription revenue | Renewal, upgrade, property added |
| Churn | Subscription revenue / churn event | Cancellation |

---

## Bus Matrix

| Business Process | Date | Account | Subscription Plan | Property | Channel | Feature | Support Ticket | Sales Rep / CSM |
|---|---|---|---|---|---|---|---|---|
| Trial Conversion | ✓ | ✓ | ✓ | | | | | ✓ |
| Subscription Revenue | ✓ | ✓ | ✓ | ✓ | | | | ✓ |
| Feature Usage | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | |
| Support Interactions | ✓ | ✓ | ✓ | ✓ | | | ✓ | |
| Renewal / Churn | ✓ | ✓ | ✓ | ✓ | | | | ✓ |

**Conformed dimensions:** Date, Account, Subscription Plan (appear in 2+ fact tables — must be built once and shared)

---

## Grain Statements

| Fact Table | Grain Statement | Type |
|---|---|---|
| Trial Conversion | One row per account — updated as it passes through trial stages (start → first feature use → converted or abandoned) | Accumulating Snapshot |
| Subscription Revenue | One row per MRR event (new / expansion / contraction / churn) per account per month | Periodic Snapshot |
| Feature Usage | One row per feature interaction by one account on one property on one date | Transaction |
| Support Interactions | One row per support ticket opened by one account | Transaction |

---

## Dimension Attribute Lists

### Account
| Attribute | Business label | SCD Type | Notes |
|---|---|---|---|
| account_id | Account ID | — | Surrogate key |
| company_name | Company name | 1 | Correction only |
| industry | Industry | 2 | Hospitality, property mgmt, boutique hotel |
| country | Country | 2 | History needed if account relocates |
| account_tier | Account tier | 2 | SMB / Mid-Market / Enterprise |
| acquisition_channel | Acquisition channel | 1 | Paid search, organic, referral |
| csm_owner | CSM name | 2 | History needed for churn attribution |
| contract_start_date | First paid date | 1 | Set once |
| properties_at_signup | Properties at signup | 1 | Snapshot at acquisition |
| is_trial_flag | In trial? | 1 | Current status |

### Subscription Plan
| Attribute | Business label | SCD Type | Notes |
|---|---|---|---|
| plan_id | Plan ID | — | Surrogate key |
| plan_name | Plan name | 1 | Professional Prepaid, Flex, Teams Pro+ |
| billing_frequency | Billing frequency | 1 | Monthly / Annual / Biannual |
| base_price_eur | Base price (€) | 2 | History needed if pricing changes |
| additional_unit_price_eur | Per-unit price (€) | 2 | |
| commission_rate | Commission rate | 2 | 0% or 0.9% |
| feature_tier | Feature tier | 1 | Standard / Teams |
| is_trial_flag | Trial plan? | 1 | |

### Property
| Attribute | Business label | SCD Type | Notes |
|---|---|---|---|
| property_id | Property ID | — | Surrogate key |
| account_id | Account (FK) | 1 | |
| property_type | Property type | 2 | Apartment, villa, entire home, room |
| city | City | 2 | |
| country | Country | 2 | |
| bedrooms | Bedrooms | 1 | |
| date_connected | Date connected | 1 | When first added to Smoobu |
| is_active_flag | Active? | 1 | Synced at least one channel in last 30 days |

### Channel
| Attribute | Business label | SCD Type | Notes |
|---|---|---|---|
| channel_id | Channel ID | — | |
| channel_name | Channel name | 1 | Airbnb, Booking.com, Expedia, Vrbo, Agoda, Direct |
| channel_type | Channel type | 1 | OTA / Direct |
| commission_rate | Platform commission | 2 | For context — paid by the host, not Smoobu |

### Feature
| Attribute | Business label | SCD Type | Notes |
|---|---|---|---|
| feature_id | Feature ID | — | |
| feature_name | Feature name | 1 | Calendar Sync, Dynamic Pricing, Multi-channel Inbox |
| feature_category | Category | 1 | Core / Premium / Add-on |
| is_premium_flag | Premium feature? | 1 | |
| release_date | Release date | 1 | |

---

## Fact Candidate Tables

### Subscription Revenue (Periodic Snapshot — monthly MRR events)

| Fact | Label | Calculation | Additive? | Source |
|---|---|---|---|---|
| mrr_amount | MRR (€) | Subscription value normalised to monthly | Semi-additive (not across time) | Stripe |
| event_type | MRR event type | new / expansion / contraction / churn | — (dimension attribute) | Stripe |
| invoice_amount | Invoice amount (€) | Raw invoice value | Fully additive | Stripe |
| discount_amount | Discount (€) | Discount applied | Fully additive | Stripe |
| properties_billed | Properties billed | Count of units on this invoice | Fully additive | Stripe |
| commission_amount | Booking commission (€) | 0.9% × booking value (Flex plan only) | Fully additive | Stripe |

### Feature Usage (Transaction)

| Fact | Label | Calculation | Additive? | Source |
|---|---|---|---|---|
| event_count | Feature events | Count of interactions | Fully additive | Product DB |
| session_duration_sec | Session duration (s) | Time in feature per session | Additive (sum); Non-additive (avg) | Product DB |

### Support Interactions (Transaction)

| Fact | Label | Calculation | Additive? | Source |
|---|---|---|---|---|
| ticket_count | Tickets | 1 per ticket | Fully additive | Intercom / Zendesk |
| first_response_hours | First response time (hrs) | Hours to first agent response | Non-additive (average) | Intercom |
| resolution_days | Days to resolution | Days from open to closed | Non-additive (average) | Intercom |
| is_escalated_flag | Escalated? | 1 if escalated | Store count, not average | Intercom |

---

## Glossary (key terms)

| Term | Agreed definition | Conflict |
|---|---|---|
| Account | A company or individual with an active or trial subscription, identified at the billing entity level | Finance calls this "Customer"; needs alignment |
| MRR | Monthly recurring revenue normalised from all billing frequencies: annual ÷ 12, biannual ÷ 24 | Sales sometimes counts full annual value upfront — resolve before model build |
| Active Property | A property that has synced with at least one channel in the last 30 days | Support uses "connected" regardless of recent activity |
| Churn | An account that did not renew within 30 days of contract end | Product team uses a 60-day window |
| Expansion MRR | MRR added from an existing account (upgrade or additional properties) | Some teams include trial-to-paid conversion here — it should be New MRR |

---

## Reporting Validation

| Report | Supported? | Notes |
|---|---|---|
| MRR waterfall | ✓ | Subscription revenue fact with event_type supports new/expansion/contraction/churn |
| NRR by cohort | ✓ | Requires account cohort date on Account dim (contract_start_date) |
| Trial-to-paid conversion | ✓ | Trial accumulating snapshot fact |
| Churn by plan / CSM | ✓ | Subscription fact + Plan dim + Account dim (CSM owner, SCD Type 2) |
| Feature adoption by plan | ✓ | Feature usage fact + Feature dim + Plan dim (conformed) |
| LTV / CAC by channel | ⚠ Partial | Requires marketing spend fact — not yet modelled |
| ARR bridge | ✓ | Derived from MRR waterfall × 12 |
