Public Status Pages and Cron Job Monitoring
Branded public status pages with subscriber notifications, plus cron job monitoring with check-ins and maintenance windows. Transparent reliability for your users.
Reliability Is a Communication Problem
When your service goes down, two things need to happen simultaneously: your engineers need to fix the problem, and your users need to know what's going on. Most teams are good at the first part and terrible at the second.
A public status page bridges that gap. It gives users a single URL to check when something feels broken, and it gives your team a structured way to communicate about incidents without individual emails and support tickets.
Cron job monitoring solves the opposite problem -- the silent failure. When a background job stops running, nothing crashes. No errors fire. The job just doesn't execute, and nobody notices until a user reports that their daily report didn't arrive.
JustAnalytics now includes both features: branded public status pages and cron job monitoring with check-in verification.
Public Status Pages
Creating Your Status Page
Every JustAnalytics site can have a public status page. Set it up in Settings > Status Page:
Status Page Configuration:
URL: status.yourcompany.com (CNAME) or yourcompany.justanalytics.app/status
Company Name: Your Company
Logo: Upload your logo
Favicon: Upload your favicon
Primary Color: #2563EB
Description: "System status for Your Company services"
Support URL: https://support.yourcompany.com
Time Zone: America/New_York
Custom Domain
Use your own domain for the status page with a simple CNAME record:
Type: CNAME
Name: status
Value: status-proxy.justanalytics.app
TTL: 3600
After DNS propagation, your status page is accessible at status.yourcompany.com with HTTPS handled automatically.
Component Organization
Organize your status page by service components. Each component has its own status indicator:
Your Company Status
Website ● Operational
└── Homepage ● Operational
└── Dashboard ● Operational
└── Checkout ● Degraded Performance
API ● Partial Outage
└── REST API (v2) ● Operational
└── GraphQL API ● Major Outage
└── Webhooks ● Operational
Infrastructure ● Operational
└── Database ● Operational
└── CDN ● Operational
└── Email Delivery ● Operational
Component statuses:
| Status | Icon | Meaning |
|---|---|---|
| Operational | Green | Everything working normally |
| Degraded Performance | Yellow | Working but slower than usual |
| Partial Outage | Orange | Some functionality affected |
| Major Outage | Red | Service is down |
| Under Maintenance | Blue | Planned maintenance in progress |
Automatic Status Updates
JustAnalytics can automatically update component statuses based on your monitoring data:
Auto-Status Rules:
- Component: "REST API (v2)"
Source: Uptime Monitor "api-v2-health"
Rules:
- IF uptime < 100% in last 5 min → Degraded Performance
- IF uptime < 95% in last 5 min → Partial Outage
- IF uptime < 50% in last 5 min → Major Outage
- Component: "Database"
Source: Metric "db_query_p95_latency"
Rules:
- IF p95 > 500ms for 5 min → Degraded Performance
- IF p95 > 2000ms for 5 min → Major Outage
- Component: "Checkout"
Source: Error rate for URL "/checkout/*"
Rules:
- IF error_rate > 5% for 10 min → Degraded Performance
- IF error_rate > 20% for 5 min → Partial Outage
You can also update statuses manually or via the API.
Incident Communication
When an incident occurs, create an incident on your status page to keep users informed:
Creating an incident:
Incident: GraphQL API Unavailable
Status: Investigating
Affected Components: GraphQL API
Message: "We are investigating reports of errors when accessing the
GraphQL API. REST API endpoints are not affected."
Posting updates:
[14:32] Investigating
"We are investigating reports of errors when accessing the GraphQL API."
[14:45] Identified
"The root cause has been identified as a failed database migration.
We are working on a fix."
[15:02] Monitoring
"A fix has been deployed. We are monitoring the GraphQL API to
confirm stability."
[15:30] Resolved
"The GraphQL API is fully operational. The issue was caused by a
database migration that locked a critical table. We have added
safeguards to prevent this in the future."
Each update is timestamped and automatically sent to subscribers.
Incident History
The status page shows a rolling history of incidents:
Incident History
March 30, 2026 - No incidents reported
March 29, 2026 - No incidents reported
March 28, 2026
GraphQL API Unavailable (58 minutes)
Resolved at 15:30 UTC
March 25, 2026
Degraded Dashboard Performance (12 minutes)
Resolved at 09:42 UTC
Users can see that your team communicates transparently and resolves issues quickly.
Uptime History
Each component displays its uptime percentage over the past 90 days as a visual bar chart:
REST API (v2) 99.98% uptime
████████████████████████████████████████████████░█████████████████████████████████████████
↑ 12-min degradation on March 15
GraphQL API 99.87% uptime
█████████████████████████████████████████████████████████████░░███████████████████████████
↑ 58-min outage on March 28
Subscriber Notifications
Email Notifications
Users can subscribe to your status page to receive email notifications when incidents are created or updated:
Subscribe to Status Updates
Email: user@example.com
Notifications:
☑ All components
☐ Specific components only
☐ Website
☑ API
☐ Infrastructure
Frequency:
● Every update
○ Start and resolution only
RSS Feed
Your status page includes an RSS feed at status.yourcompany.com/feed.xml. Users can subscribe in any RSS reader to get incident updates.
Webhook Notifications
For programmatic integration, configure webhooks that fire on status changes:
POST https://your-webhook-endpoint.com/status
{
"event": "incident.update",
"incident": {
"id": "inc_abc123",
"title": "GraphQL API Unavailable",
"status": "identified",
"impact": "major",
"created_at": "2026-03-28T14:32:00Z",
"updated_at": "2026-03-28T14:45:00Z"
},
"update": {
"status": "identified",
"body": "The root cause has been identified as a failed database migration.",
"created_at": "2026-03-28T14:45:00Z"
},
"affected_components": [
{ "name": "GraphQL API", "status": "major_outage" }
]
}
API-Driven Status Updates
Update your status page programmatically from your incident management workflow:
# Create an incident
curl -X POST https://api.justanalytics.app/v1/status-page/incidents \
-H "Authorization: Bearer ja_live_abc123" \
-d '{
"title": "Database maintenance",
"status": "investigating",
"impact": "minor",
"components": ["database"],
"body": "Scheduled database maintenance is in progress."
}'
# Post an update
curl -X POST https://api.justanalytics.app/v1/status-page/incidents/inc_abc123/updates \
-H "Authorization: Bearer ja_live_abc123" \
-d '{
"status": "resolved",
"body": "Database maintenance is complete. All systems operational."
}'
Cron Job Monitoring
The Silent Failure Problem
Cron jobs are the backbone of most applications: sending emails, generating reports, processing payments, cleaning up data, syncing with third-party APIs. When they fail, the failure is silent. No HTTP request fails. No error page is shown. The job just doesn't run.
JustAnalytics cron monitoring uses a check-in model. Your cron job pings a unique URL when it starts (and optionally when it finishes). If JustAnalytics doesn't receive the expected check-in within the configured window, it alerts you.
Setting Up a Cron Monitor
Create a cron monitor in Monitoring > Cron Jobs > Create:
Name: Daily Report Generation
Schedule: Every day at 6:00 AM UTC (0 6 * * *)
Grace Period: 15 minutes
Expected Duration: Under 5 minutes
Alert Policy: Production Critical
JustAnalytics generates a unique check-in URL:
Check-in URL: https://ingest.justanalytics.app/cron/chk_abc123def456
Instrumenting Your Cron Job
Simple check-in (job completed):
#!/bin/bash
# daily-report.sh
# Run your job
python generate_reports.py
# Check in with JustAnalytics
curl -s https://ingest.justanalytics.app/cron/chk_abc123def456
Start and finish check-in (track duration):
#!/bin/bash
# daily-report.sh
# Signal job start
curl -s https://ingest.justanalytics.app/cron/chk_abc123def456/start
# Run your job
python generate_reports.py
EXIT_CODE=$?
# Signal job finish (with status)
if [ $EXIT_CODE -eq 0 ]; then
curl -s https://ingest.justanalytics.app/cron/chk_abc123def456/complete
else
curl -s https://ingest.justanalytics.app/cron/chk_abc123def456/fail
fi
With the Node.js SDK:
import { cronMonitor } from '@justanalyticsapp/node';
const monitor = cronMonitor('chk_abc123def456');
async function dailyReport() {
await monitor.start();
try {
await generateReports();
await monitor.complete();
} catch (error) {
await monitor.fail({ error: error.message });
throw error;
}
}
Cron Monitoring Dashboard
The cron dashboard shows all your monitored jobs at a glance:
Cron Jobs
Job | Schedule | Last Run | Status | Duration
Daily Report | 0 6 * * * | 6:00 AM | ✓ OK | 3m 42s
Hourly Data Sync | 0 * * * * | 10:00 AM | ✓ OK | 45s
Weekly Cleanup | 0 2 * * 0 | Mar 29, 2:00 | ✓ OK | 12m 18s
Payment Processing | */5 * * * * | 10:05 AM | ✗ MISSED | --
Email Queue Flush | */15 * * * * | 9:45 AM | ⚠ SLOW | 18m 32s
Alert Conditions
JustAnalytics alerts you when a cron job:
| Condition | Description | Example |
|---|---|---|
| Missed | No check-in received within schedule + grace period | Job should run at 6 AM, no check-in by 6:15 AM |
| Failed | Job explicitly reported failure | Exit code non-zero |
| Slow | Job duration exceeds expected threshold | Expected under 5 min, took 18 min |
| Stuck | Start signal received but no complete/fail signal | Job started but never finished |
Cron Job History
Each monitored job has a detailed history:
Daily Report - History
Date | Status | Duration | Notes
Mar 31 | ✓ OK | 3m 42s |
Mar 30 | ✓ OK | 3m 38s |
Mar 29 | ⚠ SLOW | 8m 12s | Spike in data volume
Mar 28 | ✓ OK | 3m 45s |
Mar 27 | ✗ FAIL | 1m 02s | Database connection timeout
Mar 26 | ✓ OK | 3m 40s |
Duration trends help you spot gradual performance degradation before it becomes a problem.
Maintenance Windows
Scheduled Maintenance
Create maintenance windows to suppress alerts during planned downtime:
Maintenance Window:
Name: Database Migration
Start: April 5, 2026 02:00 UTC
End: April 5, 2026 04:00 UTC
Components: Database, REST API, GraphQL API
Suppress Alerts: Yes
Status Page: Show "Under Maintenance" during window
Notification: Send advance notice 24 hours before
Recurring Maintenance
For regular maintenance schedules:
Recurring Maintenance:
Name: Weekly Database Vacuum
Schedule: Every Sunday, 03:00-03:30 UTC
Components: Database
Suppress Alerts: Yes
Status Page: Show "Under Maintenance"
Maintenance Notifications
Subscribers are notified:
- 24 hours before -- "Scheduled maintenance: Database Migration on April 5, 02:00-04:00 UTC"
- When maintenance starts -- "Maintenance in progress: Database, REST API, GraphQL API"
- When maintenance ends -- "Maintenance complete. All systems operational."
- If maintenance overruns -- "Maintenance is taking longer than expected. Updated ETA: 05:00 UTC"
How It Compares to Pingdom
Pingdom has been the standard for uptime monitoring and status pages for over a decade. Here's how JustAnalytics compares:
| Feature | JustAnalytics | Pingdom |
|---|---|---|
| Public status page | Yes | Yes |
| Custom domain | Yes | Yes |
| Component organization | Yes | Yes (limited) |
| Automatic status updates | Yes (from monitoring data) | Manual only |
| Subscriber notifications | Email, RSS, Webhook | Email, SMS |
| Incident management | Full lifecycle | Basic |
| Cron job monitoring | Yes | No |
| Maintenance windows | Yes | Yes |
| Uptime monitoring | Yes | Yes |
| Multi-region checks | Yes | Yes |
| SSL certificate monitoring | Yes | Yes |
| Integration with APM | Built-in | No |
| Integration with error tracking | Built-in | No |
| Pricing | Included in plan | $15/month+ |
The fundamental difference is integration. With Pingdom, status pages and uptime monitoring are standalone products. With JustAnalytics, they're connected to your entire observability stack. When an uptime check fails, JustAnalytics can automatically correlate it with server-side errors, traces, and logs to help you diagnose the root cause.
Getting Started
Status Pages
- Go to Settings > Status Page
- Configure your company name, logo, and colors
- Add components that represent your services
- Optionally set up a custom domain
- Share the URL with your users
Cron Monitoring
- Go to Monitoring > Cron Jobs > Create
- Enter the job name, schedule, and grace period
- Copy the check-in URL
- Add the check-in call to your cron script
- Verify with a test run
Maintenance Windows
- Go to Monitoring > Maintenance > Schedule
- Set the time window and affected components
- Configure notifications for subscribers
- The status page updates automatically when the window starts
All three features are available today on all JustAnalytics plans.
Start your 7-day free trial and give your users the transparency they deserve.
The engineering and product team behind JustAnalytics. We're on a mission to make web observability simpler, faster, and more private.