Skip to content

Status Pages

Status pages provide a public-facing view of your service health, allowing you to communicate availability and incidents transparently to your users, customers, and stakeholders. 9n9s makes it easy to create beautiful, customizable status pages that automatically reflect the health of your monitored services.

Status pages serve multiple critical functions:

Customer Communication:

  • Proactive Transparency: Show service status before customers notice issues
  • Incident Communication: Provide real-time updates during outages
  • Historical Context: Display past incidents and resolution times
  • Maintenance Notices: Communicate planned maintenance windows

Business Benefits:

  • Reduced Support Load: Customers can self-serve status information
  • Trust Building: Transparency builds customer confidence
  • SLA Reporting: Demonstrate uptime performance to stakeholders
  • Brand Consistency: Customizable design matches your brand

Technical Integration:

  • Automated Updates: Status reflects monitor health automatically
  • Real-time Data: Live updates without manual intervention
  • Multi-Service Views: Group related services logically
  • API Access: Programmatic access to status data

Via Web Interface:

  1. Navigate to Organization Settings > Status Pages
  2. Click “Create Status Page”
  3. Configure basic settings:
    • Page Name: Internal name for management
    • Public Title: Displayed to visitors
    • Description: Brief description of your services
    • Subdomain: Choose your status.9n9s.com/[subdomain] URL
  4. Select monitors to include
  5. Customize appearance and branding
  6. Publish the page

Via CLI:

Terminal window
# Create a basic status page
9n9s-cli status-page create \
--name "ACME Service Status" \
--subdomain "acme-status" \
--description "Real-time status of ACME services" \
--monitors "mon_api,mon_website,mon_database"
# Create with custom configuration
9n9s-cli status-page create \
--name "Production Services" \
--subdomain "prod-status" \
--config '{
"theme": "modern",
"custom_domain": "status.acme.com",
"incident_history_days": 90,
"show_uptime_percentages": true
}'

Via API:

Terminal window
curl -X POST https://api.9n9s.com/v1/status-pages \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "ACME Service Status",
"subdomain": "acme-status",
"title": "ACME Services",
"description": "Real-time status of ACME services",
"monitors": [
{"id": "mon_api", "display_name": "API Service"},
{"id": "mon_website", "display_name": "Main Website"},
{"id": "mon_database", "display_name": "Database"}
],
"settings": {
"theme": "modern",
"show_incident_history": true,
"uptime_calculation_days": 30
}
}'

Service Groups: Organize monitors into logical service groups for better user experience:

# Status page configuration
service_groups:
- name: "Core Services"
monitors:
- id: "mon_api"
display_name: "API Gateway"
description: "Primary API endpoints"
- id: "mon_auth"
display_name: "Authentication"
description: "User login and authentication"
- name: "Website & Frontend"
monitors:
- id: "mon_website"
display_name: "Main Website"
- id: "mon_cdn"
display_name: "CDN & Assets"
- name: "Infrastructure"
monitors:
- id: "mon_database"
display_name: "Primary Database"
- id: "mon_cache"
display_name: "Cache Layer"

Monitor Filtering: Choose which monitors to display based on various criteria:

Terminal window
# Include monitors by tags
9n9s-cli status-page update status_123 \
--include-tags "public:true,criticality:high"
# Include specific projects
9n9s-cli status-page update status_123 \
--include-projects "proj_production,proj_core"
# Exclude maintenance monitors
9n9s-cli status-page update status_123 \
--exclude-tags "maintenance:true"

Theme Options:

  • Modern: Clean, minimal design with subtle shadows
  • Classic: Traditional status page layout
  • Dark: Dark theme for modern brands
  • Custom: Upload your own CSS for complete control

Branding Elements:

branding:
logo:
url: "https://example.com/logo.png"
width: 200
height: 50
colors:
primary: "#007bff"
success: "#28a745"
warning: "#ffc107"
danger: "#dc3545"
background: "#ffffff"
text: "#333333"
fonts:
family: "Inter, sans-serif"
headings: "Inter, sans-serif"

Custom CSS:

/* Custom styling for status page */
.status-page-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 2rem;
}
.service-group {
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
margin-bottom: 1.5rem;
}
.monitor-status.operational {
background-color: #d4edda;
border-color: #c3e6cb;
}

Configure your own domain for professional status page URLs:

DNS Configuration:

# Add CNAME record to your DNS
status.example.com CNAME status.9n9s.com

SSL Certificate: 9n9s automatically provisions and manages SSL certificates for custom domains using Let’s Encrypt.

Via CLI:

Terminal window
# Configure custom domain
9n9s-cli status-page update status_123 \
--custom-domain "status.example.com"
# Verify domain configuration
9n9s-cli status-page verify-domain status_123

Status pages automatically update based on monitor state changes:

Status Indicators:

  • 🟢 Operational: All systems functioning normally
  • 🟡 Degraded Performance: Some issues but service available
  • 🟠 Partial Outage: Some services affected
  • 🔴 Major Outage: Significant service disruption
  • 🔵 Maintenance: Planned maintenance in progress

Automatic Transitions:

Monitor Down → Service shows "Partial/Major Outage"
Monitor Degraded → Service shows "Degraded Performance"
Monitor Up → Service shows "Operational"
Maintenance Mode → Service shows "Maintenance"

Incident Creation: Incidents can be created automatically when monitors fail or manually for broader issues:

Terminal window
# Create manual incident
9n9s-cli incident create \
--title "Database Performance Issues" \
--description "Investigating elevated response times" \
--status "investigating" \
--affected-services "mon_api,mon_database"
# Update incident
9n9s-cli incident update inc_123 \
--status "identified" \
--message "Root cause identified as disk I/O bottleneck"

Incident Status Flow:

  1. Investigating: Team is looking into the issue
  2. Identified: Root cause has been determined
  3. Monitoring: Fix applied, monitoring for stability
  4. Resolved: Issue completely resolved

Incident Updates:

{
"incident_id": "inc_123",
"timestamp": "2024-01-15T14:30:00Z",
"status": "monitoring",
"message": "Database performance has been restored. We are monitoring the situation to ensure stability.",
"author": "ops-team"
}

Uptime Calculation:

uptime_metrics:
calculation_period: 30 # days
calculation_method: "percentage" # percentage or availability
exclude_maintenance: true
minimum_data_points: 1000

Display Options:

  • Current Status: Real-time operational state
  • Uptime Percentage: 99.95% uptime over last 30 days
  • Response Times: Average response times for uptime monitors
  • Historical Charts: Visual representation of uptime over time

SLA Reporting:

Terminal window
# Generate SLA report
9n9s-cli status-page report status_123 \
--period "last-quarter" \
--format "pdf" \
--include-details \
--output "q4-sla-report.pdf"

Schedule and communicate planned maintenance:

Terminal window
# Schedule maintenance window
9n9s-cli maintenance create \
--title "Database Upgrade" \
--description "Upgrading database cluster to v14" \
--start "2024-02-15T02:00:00Z" \
--end "2024-02-15T06:00:00Z" \
--affected-services "mon_database,mon_api"
# Notify subscribers
9n9s-cli maintenance notify maint_456 \
--advance-notice "24h" \
--reminder "1h"

Maintenance Communication:

  • Advance Notice: Email/SMS notifications to subscribers
  • Status Page Updates: Visible maintenance banner
  • Automatic Status: Services show as “Under Maintenance”
  • Progress Updates: Real-time updates during maintenance

Allow users to subscribe to status updates:

Subscription Options:

  • Email Notifications: Incident updates and maintenance notices
  • SMS Alerts: Critical incidents only (premium feature)
  • Webhooks: Programmatic notifications for other systems
  • RSS/Atom Feeds: Machine-readable status updates

Privacy Controls:

subscriber_settings:
require_confirmation: true
allow_unsubscribe: true
retention_period: 365 # days
privacy_policy_url: "https://example.com/privacy"

Status pages provide API access for external integrations:

Public API Endpoints:

Terminal window
# Get current status
curl https://status.9n9s.com/api/acme-status/summary
# Get detailed component status
curl https://status.9n9s.com/api/acme-status/components
# Get incident history
curl https://status.9n9s.com/api/acme-status/incidents
# Subscribe to updates
curl -X POST https://status.9n9s.com/api/acme-status/subscribers \
-d '{"email": "[email protected]", "components": ["api", "website"]}'

Response Format:

{
"status": {
"indicator": "operational",
"description": "All Systems Operational"
},
"components": [
{
"id": "api",
"name": "API Service",
"status": "operational",
"uptime": "99.98%"
}
],
"incidents": [],
"scheduled_maintenances": []
}

Create separate status pages for different environments:

Terminal window
# Production status page
9n9s-cli status-page create \
--name "Production Status" \
--subdomain "status" \
--monitors "$(9n9s-cli monitors list --tags environment:production --output ids)"
# Staging status page
9n9s-cli status-page create \
--name "Staging Status" \
--subdomain "staging-status" \
--monitors "$(9n9s-cli monitors list --tags environment:staging --output ids)" \
--public false # Internal only

Configure dependency relationships between services:

service_dependencies:
- service: "web-application"
depends_on: ["api-service", "database"]
dependency_type: "hard" # hard or soft
- service: "mobile-app"
depends_on: ["api-service"]
dependency_type: "soft"

Keep It Simple:

  • Use clear, non-technical language for service names
  • Group related services logically
  • Limit the number of services displayed
  • Use consistent naming conventions

Transparency Guidelines:

  • Be honest about service health
  • Provide meaningful incident updates
  • Set realistic uptime targets
  • Include estimated resolution times when possible

Incident Communication:

  1. Acknowledge Quickly: Confirm you’re aware of the issue
  2. Regular Updates: Provide updates every 30-60 minutes
  3. Technical Details: Include relevant technical information
  4. Resolution Confirmation: Confirm when issues are fully resolved
  5. Post-Mortem: Share lessons learned for significant incidents

Maintenance Communication:

  1. Advance Notice: Notify at least 24 hours in advance
  2. Multiple Channels: Use email, status page, and in-app notifications
  3. Clear Timeline: Provide start time, duration, and expected impact
  4. Alternatives: Suggest workarounds if available

Page Load Speed:

  • Use CDN for global distribution
  • Optimize images and assets
  • Minimize external dependencies
  • Enable browser caching

Mobile Optimization:

  • Responsive design for all devices
  • Touch-friendly interface elements
  • Readable fonts and appropriate sizing
  • Fast loading on mobile networks

Track status page usage and effectiveness:

Terminal window
# View status page analytics
9n9s-cli status-page analytics status_123 \
--period "last-30-days" \
--metrics "pageviews,unique-visitors,incident-views"

Key Metrics:

  • Page Views: Total visits to status page
  • Unique Visitors: Individual users checking status
  • Incident Engagement: Views during incident periods
  • Subscriber Growth: Status update subscription trends
  • Geographic Distribution: Where users are checking from

Peak Traffic Patterns:

  • Identify when users check status most frequently
  • Correlate traffic spikes with actual incidents
  • Understand geographic usage patterns
  • Plan communication timing based on user behavior

Incident Impact Analysis:

  • Measure customer awareness of incidents
  • Track communication effectiveness
  • Identify services users care about most
  • Optimize incident response based on user engagement

Embed status page data in internal dashboards:

<!-- Embed status widget -->
<iframe src="https://status.example.com/embed/compact" width="400" height="200" frameborder="0"> </iframe>
<!-- Or use JavaScript API -->
<script>
fetch("https://status.9n9s.com/api/acme-status/summary")
.then((response) => response.json())
.then((data) => {
document.getElementById("status").textContent = data.status.description;
document.getElementById("indicator").className = data.status.indicator;
});
</script>

Add status information to support chatbots:

# Slack bot example
@app.command("/status")
def status_command(ack, command, client):
ack()
# Fetch current status
response = requests.get('https://status.9n9s.com/api/acme-status/summary')
status_data = response.json()
message = f"Current Status: {status_data['status']['description']}\n"
for component in status_data['components']:
status_emoji = "🟢" if component['status'] == 'operational' else "🔴"
message += f"{status_emoji} {component['name']}: {component['status']}\n"
client.chat_postMessage(
channel=command['channel_id'],
text=message
)

Status pages are a crucial component of transparent service communication. By implementing comprehensive status pages with 9n9s, you can build customer trust, reduce support burden, and demonstrate your commitment to service reliability.