Sabo includes a pre-built status badge widget that displays real-time system status from Better Stack directly in your application’s footer. This provides transparency to users about service availability and ongoing incidents.
Overview
A status page is a dedicated public page that shows the operational status of your services. It’s essential for:- Building trust - Show users you’re transparent about service health
- Reducing support tickets - Users check status before contacting support
- Professional image - Demonstrates operational maturity
- Incident communication - Keep users informed during outages
- Real-time status badge embedded in footer
- Automatic theme matching (light/dark mode)
- Hosted status page at your custom domain (e.g.,
status.yourdomain.com) - Historical uptime data with visual graphs
- Powered by Better Stack - Industry-leading status page provider
Better Stack (formerly Checkly) provides enterprise-grade uptime monitoring and status pages. Their free tier includes everything you need to get started.
Quick Start
1
Create Better Stack account
Sign up for a free Better Stack account to get started.
- Visit Better Stack
- Create a free account (no credit card required)
- You’ll be redirected to the dashboard
Better Stack’s free tier includes 10 monitors and a branded status page - perfect for most projects.
2
Create your status page
Set up a public status page for your services.
- In Better Stack dashboard, go to Status Pages
- Click Create Status Page
- Configure:
- Name: Your company/product name (e.g., “Acme”)
- Subdomain: Choose a subdomain (e.g.,
acme→acme.betteruptime.com) - Custom domain (optional):
status.yourdomain.com
- Click Create
3
Add monitors
Create monitors for the services you want to track.
- Go to Monitors → Add Monitor
- Configure your first monitor:
- Monitor Type: HTTP(S)
- URL: Your main site (e.g.,
https://yourdomain.com) - Name: “Main Website”
- Check Frequency: Every 1 minute (free tier)
- Click Create Monitor
https://demo.yourdomain.com→ “Demo Site”https://docs.yourdomain.com→ “Documentation”https://api.yourdomain.com→ “API”
Each monitor will appear on your status page with real-time status and uptime history.
4
Get your status badge URL
Copy the embeddable badge URL for your status page.
- Go to Status Pages → Your status page
- Click Settings → Badge
- Copy the badge URL (format:
https://your-subdomain.betteruptime.com/badge)
You’ll use this URL in the next step to configure Sabo’s status badge widget.
5
Update status badge URL in Sabo
Configure Sabo to display your status badge.Open Replace
src/components/shared/status-badge.tsx and update line 29 with your badge URL:src/components/shared/status-badge.tsx
your-subdomain with your actual Better Stack subdomain.6
Verify integration
Check that the status badge appears in your footer.
- Restart your dev server:
pnpm dev - Visit
http://localhost:3000 - Scroll to footer
- You should see the status badge next to the theme toggle
- Light mode: Badge with light background
- Dark mode: Badge with dark background
- Status text: “All services operational” (or current status)
The badge updates automatically every 60 seconds to reflect current status.
How It Works
Status Badge Component
Sabo’s status badge is implemented insrc/components/shared/status-badge.tsx:
src/components/shared/status-badge.tsx
Key Features
Theme Synchronization
Theme Synchronization
The badge automatically matches your site’s theme using How it works:
next-themes:useTheme()hook detects current themeresolvedThemereturns “dark” or “light” (handles system preference)- Badge URL includes
?theme=parameter - Better Stack serves appropriate badge design
light- Light background, dark textdark- Dark background, light text
Hydration Mismatch Prevention
Hydration Mismatch Prevention
The component uses careful client-side rendering to avoid React hydration errors:Why this matters:
- Server renders a placeholder
<div>(same dimensions as badge) - Client renders the actual iframe after hydration
- Prevents “Expected server HTML to contain…” errors
- Uses
startTransitionfor smoother rendering
Footer Integration
Footer Integration
iframe Security
iframe Security
The badge uses an iframe for security and isolation:Security benefits:
- Sandboxed execution: Badge cannot access your site’s cookies or data
- CSP friendly: Content Security Policy compatible
- No JavaScript required: Pure iframe embed
- Automatic updates: Better Stack updates badge without code changes
titleattribute provides screen reader context- Fixed dimensions prevent layout shift
- No scrolling (compact design)
Better Stack Setup
Creating Monitors
Monitors check your services at regular intervals and update status automatically.- Website Monitor
- API Monitor
- Database Monitor
Monitor your main website’s availability.Configuration:What it checks:
- HTTP response status code
- Response time
- SSL certificate validity
- DNS resolution
Incident Management
When a monitor detects an issue, Better Stack creates an incident automatically. Incident workflow:- Detection: Monitor fails X consecutive checks (configurable)
- Alert: Better Stack sends notifications (email, Slack, PagerDuty, etc.)
- Status page: Incident appears on your status page
- Resolution: Monitor recovers, incident auto-resolves
- Post-mortem: Incident history retained for analysis
- Go to Status Pages → Settings → Incidents
- Configure:
- Which monitors trigger public incidents
- Incident title format
- Automatic status updates
- Resolution messages
Custom Domain Setup
Use your own domain for a professional status page.1
Add CNAME record
In your DNS provider, add a CNAME record:Example for popular DNS providers:
- Cloudflare
- Vercel DNS
- Namecheap
- Dashboard → DNS → Add record
- Type: CNAME
- Name:
status - Target:
status.betteruptime.com - Proxy status: DNS only (orange cloud OFF)
- Save
2
Configure in Better Stack
Add your custom domain to Better Stack.
- Go to Status Pages → Settings → Domain
- Enter:
status.yourdomain.com - Click Save
- Wait for DNS propagation (up to 24 hours, usually 15 minutes)
Better Stack automatically provisions SSL certificate via Let’s Encrypt.
3
Update badge URL
Update
status-badge.tsx with your custom domain:Customization
Badge Appearance
Better Stack provides several badge designs:Status Page Branding
Customize your status page’s appearance in Better Stack dashboard: Settings → Branding:- Logo: Upload your company logo (PNG, SVG, max 2MB)
- Favicon: Custom favicon for status page
- Primary color: Brand color (hex code)
- Background: Light/dark mode backgrounds
- Custom CSS: Advanced styling (paid plans)
- Header text: Replace “System Status” with your text
- Footer links: Add links to main site, support, etc.
- About section: Company description
- Contact info: Support email, Twitter handle
Alternative Placements
The status badge can be placed anywhere in your app:Best Practices
1. Monitor critical user paths
1. Monitor critical user paths
Don’t just monitor your homepage - track the entire user journey.Essential monitors:
- Landing page
- Sign-up/login page
- Dashboard/app
- API endpoints
- Payment processing
- Database connectivity
2. Set appropriate check intervals
2. Set appropriate check intervals
Balance between monitoring frequency and cost.Recommended intervals:
- Critical services (auth, payments): 1 minute
- Main website: 3 minutes
- Documentation: 5 minutes
- Internal tools: 10 minutes
- Free tier has limited checks per month
- More frequent checks = higher costs on paid plans
- Not all services need real-time monitoring
Better Stack’s free tier includes 10 monitors checking every 1 minute = 14,400 checks/day.
3. Use meaningful monitor names
3. Use meaningful monitor names
Bad:
- Monitor 1
- Test
- Website
- Main Website (getsabo.com)
- API - Production
- Stripe Webhook Endpoint
- Clear incident messages on status page
- Easier alert triage
- Better analytics and reporting
4. Configure alert thresholds
4. Configure alert thresholds
Avoid alert fatigue with smart thresholds.Default: Alert after 1 failed check
Better: Alert after 3 consecutive failuresWhy?
- Prevents false positives (network blips)
- Confirms actual outages
- Reduces notification noise
5. Communicate during incidents
5. Communicate during incidents
Transparency builds trust. Update your status page during outages.Incident update template:Best practices:
- Update every 15-30 minutes during incidents
- Be specific about what’s affected
- Provide estimated resolution time (if known)
- Apologize and explain after resolution
Troubleshooting
Status badge not appearing
Status badge not appearing
Symptoms: Footer shows blank space where badge should be.Causes:
- Incorrect badge URL in
status-badge.tsx - Better Stack status page not created
- Ad blocker blocking iframe
- CSP headers blocking iframe
- Verify URL: Check line 29 in
status-badge.tsxhas correct subdomain - Check Better Stack: Visit your status page URL directly in browser
- Test without ad blocker: Disable uBlock Origin, Privacy Badger, etc.
- Check CSP: If using Content Security Policy, allow Better Stack:
next.config.ts
- Check console: Browser DevTools → Console for iframe errors
Badge shows wrong theme
Badge shows wrong theme
Symptoms: Badge has light theme in dark mode (or vice versa).Causes:
- Missing
?theme=${badgeTheme}parameter - Theme not resolving correctly
- Server-side render mismatch
- Verify parameter: Ensure URL includes
?theme=${badgeTheme} - Check theme hook:
resolvedThemeshould be “dark” or “light” - Test mounting: Badge should show placeholder until
mounted === true - Check
next-themes: EnsureThemeProviderwraps your app inlayout.tsx
Custom domain not working
Custom domain not working
Symptoms:
status.yourdomain.com shows DNS error.Causes:- CNAME record not created
- DNS not propagated
- Wrong CNAME target
- Cloudflare proxy enabled (should be DNS only)
-
Verify CNAME: Use DNS Checker to verify:
- Wait for propagation: DNS can take up to 24 hours (usually 15 min)
-
Check target: Must point to
status.betteruptime.comexactly - Disable Cloudflare proxy: Orange cloud should be OFF (gray cloud)
-
Test with dig:
Badge not updating in real-time
Badge not updating in real-time
Symptoms: Status badge shows old status after incident resolved.Causes:
- Browser cache
- iframe caching
- CDN caching
- Hard refresh: Ctrl+Shift+R (Windows/Linux) or Cmd+Shift+R (Mac)
- Clear iframe cache: Better Stack badges have 60-second cache
- Wait 1-2 minutes: Badge auto-refreshes every 60 seconds
- Check Better Stack: Verify status page shows correct status
Badge updates are not instant. Better Stack caches badge images for 60 seconds to reduce load.
Monitors showing false positives
Monitors showing false positives
Symptoms: Monitor reports down but service is actually up.Causes:
- Too aggressive timeout (< 10 seconds)
- Checking from single region
- Rate limiting from monitoring checks
- SSL certificate issues
- Firewall blocking Better Stack IPs
- Increase timeout: Set to 30 seconds minimum
- Multi-region checks: Enable in monitor settings
- Whitelist Better Stack: Allow IPs
35.186.224.0/24and35.197.128.0/24 - Check SSL: Ensure certificate is valid and not expired
- Alert threshold: Set to 3 consecutive failures instead of 1
- Test manually: Visit URL from different locations (VPN, mobile network)
Going Further
Integrations
Better Stack integrates with popular tools: Alerting:- Slack - Real-time incident notifications
- Discord - Status updates in your server
- PagerDuty - On-call management
- Microsoft Teams - Enterprise communications
- Webhooks - Custom integrations
- Better Stack → Integrations
- Select your tool
- Authorize connection
- Configure alert rules
Advanced Monitoring
Multi-step checks:- Simulate real user interactions
- Test complete user flows
- Validate complex workflows
- Paid plans only
- Test from 10+ regions worldwide
- Detect regional outages
- Optimize CDN performance
- Available on all plans
Alternative Solutions
If Better Stack doesn’t fit your needs:| Solution | Pros | Cons | Price |
|---|---|---|---|
| Better Stack | Easy setup, generous free tier | Fewer regions on free plan | Free - $29/mo |
| Statuspage.io | Atlassian ecosystem, powerful | Expensive, complex | 699/mo |
| StatusCast | Simple, affordable | Limited features | 99/mo |
| Instatus | Beautiful design, fast | Newer, smaller team | 49/mo |
| Self-hosted | Full control, no cost | Maintenance burden, setup time | Free |
Sabo’s status badge implementation works with any Better Stack-compatible status page provider. Simply update the iframe URL in
status-badge.tsx.