EP-019: Platform Administration (SaaS)
| Field | Value |
|---|---|
| Epic ID | EP-019 |
| Epic Name | Platform Administration (SaaS) |
| Owner | Platform Engineering Lead |
| Created | 2026-03-05 |
| Last Updated | 2026-03-05 |
| Status | In Progress |
| Priority | P1 - High |
1. Business Objective
Manage HMP as a multi-tenant SaaS platform with automated billing, tenant lifecycle management, and platform health monitoring. Currently, tenant onboarding requires developer intervention for database provisioning, configuration, and initial setup -- taking 2-3 days per new tenant. Billing is disconnected from the platform, with invoices managed manually in spreadsheets. As HMP scales beyond 50 tenants, automated SaaS operations become critical. Target: reduce tenant onboarding from 3 days to 30 minutes, automate billing via Razorpay Subscriptions (INR), and provide real-time platform health visibility. For the Indian SaaS market, plans range from INR 4,999/month (Budget) to INR 49,999/month (Chain), with MRR tracking and churn analysis essential for business sustainability.
2. Audience
| Role | Interaction |
|---|---|
| Super Admin | Full platform management: tenant CRUD, billing, feature flags, health monitoring, data export |
3. Scope
3.1 In Scope
- Super admin dashboard (platform-level overview, not tenant-level)
- Tenant management: create, read, update, suspend, reactivate, delete
- SaaS billing via Razorpay Subscriptions (INR plans, auto-debit, invoicing)
- Feature flags per tenant (enable/disable modules per subscription tier)
- Usage metering (API calls, storage, active users per tenant)
- Tenant onboarding automation (database provisioning, initial config, admin user creation)
- Platform health monitoring (service status, error rates, latency, uptime)
- MRR/ARR tracking with churn and expansion revenue analytics
- Tenant data export (compliance with data portability regulations)
- White-labeling (custom branding per tenant: logo, colors, domain)
3.2 Out of Scope
- Individual tenant hotel operations (managed within each tenant's scope)
- Infrastructure provisioning (Kubernetes, cloud resources -- covered in EP-020)
- Customer support / ticketing system (use external tool like Freshdesk)
- Marketplace / third-party app integrations
4. Current Implementation Status
4.1 Backend (01-hmp-backend)
| Component | Status | Notes |
|---|---|---|
| Tenant CRUD API | Built | Create, read, update with status management |
| Tenant Suspend/Reactivate | Built | Status toggle with cascade to auth service |
| Billing Controller | Partial | Endpoints defined, Razorpay integration not complete |
| Feature Flag API | Built | Per-tenant flag CRUD with module-level granularity |
| Usage Metering | Not Started | Schema defined, data collection not implemented |
| Tenant Onboarding Automation | Not Started | Manual process: DB, config, admin user |
| Platform Health API | Partial | Basic health endpoint per service, no aggregation |
| MRR/ARR Calculation | Not Started | No financial analytics pipeline |
| Data Export API | Not Started | No tenant data export endpoint |
4.2 Dashboard (02-hmp-web-dashboard)
| Component | Status | Notes |
|---|---|---|
| Super Admin Tenant List | Built | Tenant grid with status, plan, created date |
| Tenant Detail View | Built | Tenant info, status, feature flags |
| Billing Page | Partial | Plan display, invoice list (mock data) |
| Feature Flag Toggle UI | Built | Toggle switches per module per tenant |
| Usage Metering Dashboard | Not Started | No usage data visualization |
| Onboarding Wizard | Not Started | No self-service tenant onboarding |
| Platform Health Dashboard | Partial | Basic service status indicators |
| MRR/ARR Analytics | Not Started | No financial dashboards |
| Data Export UI | Not Started | No export interface |
| White-Label Config | Not Started | No branding customization interface |
5. Gap Analysis
| # | Gap | Impact | Effort | Priority |
|---|---|---|---|---|
| 1 | Razorpay Subscriptions not connected | Critical - billing is entirely manual | L | P0 |
| 2 | Usage metering not implemented | High - cannot enforce plan limits or bill overages | L | P1 |
| 3 | Tenant onboarding is manual | High - 2-3 day onboarding blocks growth | L | P1 |
| 4 | MRR/ARR not automated | High - business metrics tracked in spreadsheets | M | P1 |
| 5 | Data export not built | Medium - compliance risk for data portability | M | P2 |
| 6 | White-labeling not implemented | Medium - limits enterprise/chain sales | L | P3 |
| 7 | Platform health monitoring basic | Medium - issues detected reactively | M | P2 |
6. User Stories Summary
| Story ID | Title | Priority | Points | Sprint | Status |
|---|---|---|---|---|---|
| US-019-01 | Tenant CRUD Management | P0 | 5 | 1 | Built |
| US-019-02 | Tenant Suspension & Reactivation | P0 | 5 | 1 | Built |
| US-019-03 | SaaS Billing (Razorpay) | P0 | 13 | 2 | Partial |
| US-019-04 | Feature Flag Management | P1 | 5 | 1 | Built |
| US-019-05 | Tenant Onboarding Automation | P1 | 13 | 3 | Not Started |
| US-019-06 | Usage Metering & Limits | P1 | 13 | 3 | Not Started |
| US-019-07 | Platform Health Monitoring | P2 | 8 | 4 | Partial |
| US-019-08 | MRR/ARR & SaaS Analytics | P1 | 8 | 4 | Not Started |
| US-019-09 | Tenant Data Export | P2 | 8 | 5 | Not Started |
| US-019-10 | White-Labeling | P3 | 13 | 6 | Not Started |
| US-019-11 | Tenant Communication & Announcements | P2 | 5 | 5 | Partial |
7. Dependencies
| Dependency | Type | Epic/Service | Status |
|---|---|---|---|
| Auth service (tenant-scoped RBAC) | Upstream | EP-001 / auth | Available |
| All microservices (health endpoints) | Peer | All services | Available |
| Razorpay Subscriptions API | External | Payment provider | Not Ready |
| PostgreSQL (tenant databases) | Infra | Docker / PostgreSQL | Available |
| Kafka (tenant events) | Infra | Docker / Kafka | Available |
| Redis (usage counters) | Infra | Docker / Redis | Available |
| DNS provider (custom domains) | External | Cloud DNS | Not Ready |
| Infrastructure / DevOps | Peer | EP-020 / infra | Partial |
8. Epic-Level Acceptance Criteria
- AC-EP-019-01: A super admin can create a new tenant, and the system automatically provisions the database schema, creates the admin user, and configures default settings within 30 minutes (target: 5 minutes automated).
- AC-EP-019-02: Razorpay Subscriptions handles recurring billing in INR with plan upgrades, downgrades, and cancellations reflected in the platform within 1 hour.
- AC-EP-019-03: Feature flags control module access per tenant, and toggling a flag takes effect within 60 seconds without service restart.
- AC-EP-019-04: Usage metering tracks API calls, storage, and active users per tenant with real-time dashboard and automated limit enforcement.
- AC-EP-019-05: MRR, ARR, churn rate, and expansion revenue are calculated automatically and displayed on the SaaS analytics dashboard.
- AC-EP-019-06: A tenant can be suspended (blocking all user access) and reactivated without data loss.
9. KPIs
| KPI | Target | Measurement Method |
|---|---|---|
| Tenant onboarding time | < 30 minutes | Signup to first login timestamp |
| Billing automation rate | 100% | Auto-billed / total active tenants |
| Monthly churn rate | < 5% | Churned tenants / total at start |
| Platform uptime | > 99.9% | Uptime monitoring |
| Feature flag propagation time | < 60 seconds | Toggle to effect timestamp |
| MRR growth (month-over-month) | > 10% | Current MRR / previous MRR |
| Support tickets for billing | < 5/month | Billing-related tickets count |
10. Detailed User Stories
US-019-01: Tenant CRUD Management
As a Super Admin, I want to create, view, update, and manage tenant organizations on the platform, So that new hotels can be onboarded and existing tenant information stays current.
Priority: P0 | Points: 5 | Sprint: 1 | Status: Built
Implementation Status
Tenant CRUD API fully built. Creates tenant record with: name, legal entity, GSTIN, contact info, plan tier, status. Dashboard shows tenant list with search, filter by status/plan, and sort options. Tenant detail page shows all configuration and associated users.
Acceptance Criteria
Scenario: Create new tenant for an Indian hotel
Given the super admin is on the tenant management page
When they create a new tenant:
| Field | Value |
| Hotel Name | Hotel Sapphire, Pune |
| Legal Entity | Sapphire Hospitality Pvt Ltd |
| GSTIN | 27AADCS1234F1Z5 |
| Contact Email | admin@hotelsapphire.in |
| Contact Phone | +91 98765 43210 |
| Plan | Professional (INR 14,999/month)|
| Modules | PMS, POS, CRM, Channel Manager |
Then the tenant is created with status "ACTIVE"
And a unique tenant ID (UUID) is generated
And the tenant appears in the tenant list with all details
And a Kafka event "tenant.created" is published
Scenario: Search and filter tenants
Given 150 tenants are registered on the platform
When the super admin searches for "Sapphire"
Then matching tenants are displayed (e.g., "Hotel Sapphire, Pune", "Sapphire Resort, Goa")
And the super admin can filter by: status (Active/Suspended), plan tier, city, state
And the list shows: tenant name, plan, status, MRR, last active date
US-019-02: Tenant Suspension & Reactivation
As a Super Admin, I want to suspend a tenant (blocking all user access) and reactivate them later without data loss, So that non-paying or policy-violating tenants can be managed.
Priority: P0 | Points: 5 | Sprint: 1 | Status: Built
Implementation Status
Suspension API sets tenant status to SUSPENDED and cascades to auth service, which blocks all JWT token validation for that tenant's users. Reactivation sets status back to ACTIVE and restores access. Tenant data is preserved during suspension. Suspension reason is recorded.
Acceptance Criteria
Scenario: Suspend tenant for non-payment
Given tenant "Hotel Sapphire, Pune" has failed to pay for 2 consecutive months
When the super admin suspends the tenant with reason "Non-payment - 60 days overdue"
Then the tenant status changes to "SUSPENDED"
And all users of "Hotel Sapphire, Pune" are immediately logged out
And any login attempt shows "Your account has been suspended. Please contact support."
And the tenant's data remains intact (no deletion)
And a notification email is sent to the tenant's admin: "Your HMP subscription has been suspended due to non-payment of INR 29,998 (2 months). Contact billing@hmpcloud.com to resolve."
And a Kafka event "tenant.suspended" is published
Scenario: Reactivate suspended tenant
Given tenant "Hotel Sapphire, Pune" has cleared their outstanding balance
When the super admin reactivates the tenant
Then the tenant status changes to "ACTIVE"
And all users can log in and access the platform immediately
And data continuity is verified (no missing records during suspension period)
And a reactivation email is sent to the tenant's admin
US-019-03: SaaS Billing (Razorpay Subscriptions)
As a Super Admin, I want to manage subscription billing via Razorpay Subscriptions with automated recurring payments in INR, So that revenue collection is automated and tenants have a seamless payment experience.
Priority: P0 | Points: 13 | Sprint: 2 | Status: Partial
Implementation Status
Billing controller endpoints defined for: create subscription, cancel subscription, change plan, list invoices. Razorpay SDK imported but not connected with live API keys. Plan definitions exist in the database (Budget: INR 4,999, Professional: INR 14,999, Enterprise: INR 29,999, Chain: INR 49,999). Invoice display in dashboard uses mock data. Webhook handler for Razorpay payment events not implemented.
Acceptance Criteria
Scenario: Create subscription for new tenant
Given tenant "Hotel Sunrise, Mumbai" is being onboarded on the "Professional" plan
When the super admin creates a Razorpay subscription:
| Field | Value |
| Plan | Professional |
| Amount | INR 14,999/month |
| Billing Cycle | Monthly |
| Payment Method | Auto-debit (UPI/Card/Netbanking)|
| Start Date | 2026-03-05 |
Then a Razorpay Subscription is created via API
And the tenant receives a payment link to authorize auto-debit
And the subscription status is "CREATED" until payment authorization
And upon authorization, status changes to "ACTIVE" and first invoice is generated
Scenario: Upgrade plan from Professional to Enterprise
Given tenant "Hotel Sapphire, Pune" is on "Professional" (INR 14,999/month)
When the super admin upgrades to "Enterprise" (INR 29,999/month)
Then Razorpay proration is calculated for the remaining billing period
And the difference (pro-rated amount) is charged immediately
And the next billing cycle uses the new "Enterprise" rate
And feature flags are updated to enable Enterprise-tier modules
And the tenant admin is notified of the plan change
Scenario: Handle failed payment
Given tenant "Budget Inn, Delhi" has a monthly auto-debit on the 1st
And the March 1st payment of INR 4,999 fails (insufficient funds)
When Razorpay sends a "payment.failed" webhook
Then the platform records the failed payment attempt
And a retry is scheduled per Razorpay's retry policy (Day 3, Day 5, Day 7)
And the tenant admin receives an email: "Payment of INR 4,999 failed. Please update your payment method to avoid service disruption."
And if all retries fail after Day 7, the tenant is auto-suspended
US-019-04: Feature Flag Management
As a Super Admin, I want to enable or disable platform modules per tenant based on their subscription tier, So that tenants only access features they are paying for.
Priority: P1 | Points: 5 | Sprint: 1 | Status: Built
Implementation Status
Feature flag API supports per-tenant, per-module flags. Modules: PMS, POS, CRM, CHANNEL_MANAGER, BANQUET, BOOKING_ENGINE, AI, SPA, REPORTS, API_ACCESS. Dashboard toggle UI allows super admin to enable/disable modules with instant effect. Auth middleware checks feature flags before granting access to module endpoints.
Acceptance Criteria
Scenario: Configure feature flags by plan tier
Given the plan tiers have default module access:
| Plan | Modules Included |
| Budget | PMS, REPORTS |
| Professional | PMS, POS, CRM, REPORTS, BOOKING_ENGINE |
| Enterprise | All modules except AI |
| Chain | All modules including AI |
When the super admin creates a new tenant on "Professional" plan
Then feature flags are automatically set per the plan defaults
And the tenant's dashboard only shows menus for enabled modules
And API calls to disabled modules return 403 Forbidden
Scenario: Override feature flag for specific tenant
Given tenant "Hotel Sapphire, Pune" is on "Professional" plan (no AI module)
And the hotel wants to trial the AI module for 30 days
When the super admin enables the AI flag for this tenant
And sets an expiry date of April 5, 2026
Then the AI module becomes accessible to the tenant immediately
And after April 5, the flag auto-disables
And the override is logged with reason and expiry date
Scenario: Feature flag propagation speed
Given the super admin disables the POS module for tenant "Budget Inn"
When the flag is toggled in the dashboard
Then within 60 seconds, all active sessions for Budget Inn lose POS access
And the POS menu item disappears from their dashboard
And any in-flight POS API calls receive 403 after the propagation
US-019-05: Tenant Onboarding Automation
As a Super Admin, I want to onboard a new tenant with automated database provisioning, default configuration, and admin user creation, So that new hotels can start using HMP within minutes instead of days.
Priority: P1 | Points: 13 | Sprint: 3 | Status: Not Started
Implementation Status
Not started. Currently, onboarding a new tenant requires: (1) manual database schema creation via Prisma migrate, (2) manual insertion of default data (room types, rate plans, roles), (3) manual admin user creation, (4) manual feature flag configuration. This takes 2-3 days with developer involvement. Needs full automation pipeline.
Acceptance Criteria
Scenario: Automated tenant onboarding
Given the super admin initiates onboarding for "Hotel Sunrise, Mumbai"
When the onboarding wizard is completed with:
| Field | Value |
| Hotel Name | Hotel Sunrise |
| City | Mumbai |
| State | Maharashtra |
| GSTIN | 27AADHS5678G1Z2 |
| Admin Name | Rajesh Kumar |
| Admin Email | rajesh@hotelsunrise.in |
| Plan | Professional |
| Room Count | 80 |
Then the system automatically:
1. Creates the tenant record with unique ID
2. Provisions the database schema (Prisma migrate)
3. Seeds default data: room types, rate plans, tax slabs (GST), roles
4. Creates the admin user with temporary password
5. Configures feature flags per plan tier
6. Sends welcome email to rajesh@hotelsunrise.in with login credentials
And the entire process completes within 5 minutes
And the admin can log in and start configuring their hotel
Scenario: Onboarding with Indian hotel defaults
Given the hotel is located in Maharashtra
When the onboarding seeds default data
Then Indian-specific defaults are configured:
| Default | Value |
| Currency | INR |
| Tax Structure | GST (CGST + SGST for MH) |
| GST Rates | 12% (< 7500), 18% (>= 7500) |
| Check-in Time | 2:00 PM IST |
| Check-out Time | 12:00 PM IST |
| Date Format | DD/MM/YYYY |
| FSSAI Placeholder | (to be filled by hotel) |
| Default Roles | 9 RBAC roles pre-configured |
US-019-06: Usage Metering & Limits
As a Super Admin, I want to track resource usage per tenant (API calls, storage, active users) and enforce plan limits, So that tenants operate within their subscription boundaries and overages are billable.
Priority: P1 | Points: 13 | Sprint: 3 | Status: Not Started
Implementation Status
Not started. Usage metering requires: API gateway middleware to count requests per tenant, storage tracking per tenant (S3/filesystem), active user counting per billing period, and threshold alerting. Plan limits not defined in the database. Overage billing logic not designed.
Acceptance Criteria
Scenario: Track API usage per tenant
Given tenant "Hotel Sapphire" is on "Professional" plan with limit of 100,000 API calls/month
When the API gateway processes requests for this tenant
Then each request increments the tenant's monthly API counter (stored in Redis)
And the super admin dashboard shows:
| Tenant | API Calls (MTD) | Limit | Usage % |
| Hotel Sapphire | 65,432 | 100,000 | 65.4% |
And at 80% usage (80,000 calls), the tenant admin receives a warning email
And at 100% usage, API calls are either throttled (429 Too Many Requests) or billed as overage
Scenario: Track storage usage per tenant
Given each plan tier has a storage limit:
| Plan | Storage Limit |
| Budget | 5 GB |
| Professional | 25 GB |
| Enterprise | 100 GB |
| Chain | 500 GB |
When the tenant uploads documents, photos, and reports
Then storage usage is tracked per tenant (guest photos, invoices, reports)
And the usage dashboard shows current consumption vs limit
And at 90% storage, the tenant admin receives a notification
Scenario: Enforce active user limits
Given "Budget" plan allows 5 active users
And tenant "Budget Inn" has 5 active users
When the tenant admin tries to create a 6th user
Then the system rejects with "Active user limit reached. Upgrade to Professional for up to 25 users."
And the error includes an upgrade link
And the super admin can see which tenants are at user capacity
US-019-07: Platform Health Monitoring
As a Super Admin, I want to monitor the health of all platform services in real-time, So that I can detect and respond to outages before they impact tenants.
Priority: P2 | Points: 8 | Sprint: 4 | Status: Partial
Implementation Status
Basic health endpoint (/health) exists on each microservice returning UP/DOWN status. No aggregated platform health dashboard. No historical uptime tracking. No error rate monitoring. No latency tracking. Needs: health aggregator service, uptime calculation, error rate dashboards, alerting for degraded services.
Acceptance Criteria
Scenario: View platform health dashboard
Given 16 microservices are running
When the super admin opens the platform health dashboard
Then each service shows:
| Service | Status | Uptime (30d) | Avg Latency | Error Rate |
| API Gateway | UP | 99.95% | 45ms | 0.02% |
| Auth Service | UP | 99.99% | 30ms | 0.01% |
| Reservation | UP | 99.90% | 120ms | 0.05% |
| Frontdesk | UP | 99.92% | 85ms | 0.03% |
| Kafka | UP | 99.99% | N/A | 0.00% |
| PostgreSQL | UP | 99.99% | 15ms | 0.00% |
| Redis | UP | 99.99% | 5ms | 0.00% |
And overall platform uptime is displayed (99.93%)
And a status timeline shows incidents over the last 30 days
Scenario: Alert on service degradation
Given the Reservation service error rate exceeds 1% (threshold)
When the health monitor detects the spike
Then a critical alert is generated on the dashboard
And the super admin receives a push notification and email
And the alert includes: service name, error rate, sample error messages, and affected tenants
And a suggested action is shown (e.g., "Check Reservation service logs, possible database connection issue")
US-019-08: MRR/ARR & SaaS Analytics
As a Super Admin, I want to track Monthly Recurring Revenue (MRR), Annual Recurring Revenue (ARR), churn rate, and expansion revenue, So that I can monitor business health and make data-driven growth decisions.
Priority: P1 | Points: 8 | Sprint: 4 | Status: Not Started
Implementation Status
Not started. Financial metrics are currently tracked manually in spreadsheets. Needs: automated MRR calculation from active subscriptions, ARR projection, churn tracking (cancelled/suspended tenants), expansion revenue (plan upgrades), contraction revenue (plan downgrades), and cohort analysis.
Acceptance Criteria
Scenario: View SaaS metrics dashboard
Given 120 active tenants across all plan tiers
When the super admin opens the SaaS analytics dashboard
Then the following metrics are displayed:
| Metric | Value |
| Active Tenants | 120 |
| MRR | INR 18,50,000 |
| ARR | INR 2,22,00,000 |
| New MRR (this month) | INR 1,20,000 |
| Churned MRR (this month) | INR 45,000 |
| Expansion MRR (upgrades) | INR 60,000 |
| Net New MRR | INR 1,35,000 |
| Monthly Churn Rate | 2.4% |
| ARPU (Avg Revenue/Tenant) | INR 15,417 |
And a trend chart shows MRR over the last 12 months
And a cohort chart shows retention by signup month
Scenario: Track churn reasons
Given 3 tenants cancelled their subscriptions in February
When the churn analysis is viewed
Then each churned tenant shows:
| Tenant | Plan | MRR Lost (INR) | Reason | Duration |
| Budget Inn Delhi | Budget | 4,999 | Price too high | 3 months |
| Star Lodge | Professional | 14,999 | Switched competitor | 8 months |
| Palm Resort | Budget | 4,999 | Business closed | 2 months |
And churn reasons are categorized for aggregate analysis
And a recommendation is shown: "2 of 3 churns are price-related - consider retention offers"
Scenario: Revenue forecast
Given current MRR is INR 18,50,000 and growth rate is 8% MoM
When the super admin views the forecast
Then a 12-month projection shows:
| Month | Projected MRR (INR) |
| April | 19,98,000 |
| May | 21,58,000 |
| June | 23,30,000 |
| ... | ... |
| March'27 | 47,50,000 |
And the projection assumes constant churn rate and growth rate
And the super admin can adjust assumptions (growth rate, churn) for scenario planning
US-019-09: Tenant Data Export
As a Super Admin, I want to export all data for a specific tenant in a machine-readable format, So that the platform complies with data portability requirements and tenants can migrate if needed.
Priority: P2 | Points: 8 | Sprint: 5 | Status: Not Started
Implementation Status
Not started. Data export requires: querying all tenant-scoped tables (reservations, guests, folios, invoices, housekeeping, banquet events, etc.), packaging into structured format (JSON/CSV), handling file sizes (potentially large for long-running tenants), and providing a secure download link. Must comply with India's Digital Personal Data Protection Act (DPDPA) 2023.
Acceptance Criteria
Scenario: Export tenant data for migration
Given tenant "Hotel Sapphire, Pune" requests a full data export
When the super admin initiates the export
Then the system packages all tenant data:
| Data Category | Format | Records |
| Reservations | JSON | 15,432 |
| Guest Profiles | JSON | 8,210 |
| Folios/Invoices | JSON | 12,875 |
| Housekeeping | JSON | 45,000 |
| Banquet Events | JSON | 342 |
| Channel Mappings | JSON | 40 |
| Configuration | JSON | 1 |
And the export is compressed into a ZIP file
And a secure download link is generated (valid for 72 hours)
And the tenant admin is notified when the export is ready
And personal data is marked as per DPDPA requirements
Scenario: Scheduled periodic export for compliance
Given tenant "Luxury Chain" requires monthly data backups for regulatory compliance
When the super admin configures a monthly export schedule
Then on the 1st of each month, a full data export is generated automatically
And the export is stored in the tenant's designated S3 bucket
And an export log is maintained with file size, record counts, and checksum
US-019-10: White-Labeling
As a Super Admin, I want to configure custom branding (logo, colors, domain) per tenant, So that hotels can present HMP as their own branded system to staff and guests.
Priority: P3 | Points: 13 | Sprint: 6 | Status: Not Started
Implementation Status
Not started. White-labeling requires: per-tenant theme configuration (primary color, secondary color, logo URL, favicon), custom domain mapping (CNAME/DNS), email sender customization (from address, reply-to), and booking engine branding. The dashboard and booking engine need dynamic theme loading based on tenant context.
Acceptance Criteria
Scenario: Configure custom branding for tenant
Given tenant "The Taj Group" wants their branding on the dashboard
When the super admin configures:
| Field | Value |
| Primary Color | #C4A265 (Taj Gold) |
| Secondary Color | #1A1A2E (Taj Dark Blue) |
| Logo URL | https://cdn.tajhotels.com/logo |
| Favicon URL | https://cdn.tajhotels.com/icon |
| Dashboard Title | Taj Hotel Management System |
Then all users of "The Taj Group" tenant see the custom branding
And the login page shows the Taj logo and colors
And the dashboard header displays "Taj Hotel Management System"
And email notifications use Taj branding in the header/footer
Scenario: Configure custom domain
Given tenant "The Taj Group" wants to use pms.tajhotels.com
When the super admin adds custom domain "pms.tajhotels.com"
And The Taj Group configures a CNAME record pointing to hmpcloud.com
Then users accessing pms.tajhotels.com see the Taj-branded dashboard
And SSL certificate is automatically provisioned (Let's Encrypt)
And the booking engine at booking.tajhotels.com also reflects Taj branding
US-019-11: Tenant Communication & Announcements
As a Super Admin, I want to send platform announcements and maintenance notifications to all or selected tenants, So that tenants are informed about updates, downtime, and new features.
Priority: P2 | Points: 5 | Sprint: 5 | Status: Partial
Implementation Status
Basic announcement model exists in the database. Display in tenant dashboard as a banner/notification bell is partially implemented. Email broadcast to tenant admins not connected. No scheduling or targeting (all or selected tenants) in the UI.
Acceptance Criteria
Scenario: Send maintenance notification
Given a planned maintenance window on March 10, 2026 from 2:00 AM to 4:00 AM IST
When the super admin creates an announcement:
| Field | Value |
| Title | Scheduled Maintenance - March 10 |
| Message | HMP will be under maintenance from 2:00 AM to 4:00 AM IST on March 10. During this period, the platform will be unavailable. We apologize for the inconvenience. |
| Priority | High |
| Target | All Tenants |
| Channels | Dashboard Banner + Email |
| Schedule | Immediately + reminder 24 hours before |
Then all tenant admin users see the banner on their dashboard
And an email is sent to all tenant admin email addresses
And a reminder email is sent on March 9 at 2:00 AM IST
And the announcement is logged with delivery statistics
Scenario: Feature release announcement to specific plan tiers
Given a new AI module is being released for Enterprise and Chain plan tenants
When the super admin creates a targeted announcement:
| Field | Value |
| Title | New: AI Revenue Optimization Module |
| Target | Enterprise and Chain plan tenants only |
Then only tenants on Enterprise and Chain plans receive the announcement
And Budget and Professional tenants do not see the announcement
And the announcement includes a "Learn More" link to documentation
Document generated: 2026-03-05 | Epic Owner: Platform Engineering Lead | Review Cycle: Bi-weekly