Step 14 Management Bundles
Purpose (Product)
Allow landlords to choose their preferred level of property management support, determining the services they'll receive and the pricing structure.
Three tiers available: Manual (free), Co-managed (monthly fee), and Pro (monthly fee + 5% rental income).
Pro tier selection triggers onboarding pause and requires a call with the team for verification and setup.
UX Flow (What the user sees)
Three horizontally arranged plan cards with property images, tier names, pricing, and feature lists.
Each card shows: image, tier name, price, description, and bulleted feature list.
Pro tier has a "Top Choice" badge. Cards have hover effects and selection states.
Selecting a plan highlights the card and updates the form. Validation requires plan selection before proceeding.
![[Service Bundles.png]]
System Flow (How it works)
sequenceDiagram
actor Landlord
participant Frontend as Web App (Next.js)
participant Backend as API (NestJS)
participant DB as Database
%% Load management tiers
Frontend->>Backend: GET /api/management-tiers
Backend-->>Frontend: Management tier data with pricing
%% Plan selection
Landlord->>Frontend: Click plan card
Frontend->>Frontend: Update selectedPlan state
Frontend->>Frontend: Set form values (plan, isOnboardingPaused)
%% Submit plan selection
Landlord->>Frontend: Click "Next"
Frontend->>Frontend: Validate form (plan required)
Frontend->>Backend: PATCH /api/properties/{id} { managementTierId }
Backend->>DB: Update properties.managementTierId
Frontend->>Backend: PATCH /api/users/{id} { isOnboardingPaused }
Backend->>DB: Update users.isOnboardingPaused
Backend-->>Frontend: 200 OK (updated property and user)
Frontend->>Frontend: Update local user context
Frontend->>Frontend: Advance to next stepData Touched
Properties table:
managementTierId(string, required): References management tier
Users table:
isOnboardingPaused(boolean): Set to true for Pro tier if user hasn't had onboarding call
Management Tiers table:
id,name,displayName,description,basePrice(read-only)
Validation rules:
Plan selection is required
Pro tier automatically sets isOnboardingPaused = true (unless user had onboarding call)
APIs Called
GET /api/management-tiers
Method: GET
Response: Array of management tier objects
Used to populate plan options and pricing
PATCH /api/properties/{id}
Method: PATCH
Payload:
{ managementTierId: string }Response: Updated property object
Idempotent: Yes
PATCH /api/users/{id}
Method: PATCH
Payload:
{ isOnboardingPaused: boolean }Response: Updated user object
Idempotent: Yes
QA Checklist
Basic functionality:
Plan selection:
Data persistence:
Error handling:
UX/UI: