Client Portal for Monitoring Data: Agency Reporting Guide
"We Have Monitoring — But Clients Don't Know It"
Once you have set up uptime monitoring and configured your alerts, a second problem often surfaces: clients have no idea the monitoring exists. The dashboard accumulates data every day, but clients still ask "what exactly do you do each month?" or, worse, discover outages on their own before you have had a chance to notify them.
This guide organizes client-facing monitoring visibility into three layers: a status page for real-time self-service, a monthly report for structured proof of work, and incident notices that reach clients before they reach you. Together, these three layers turn invisible monitoring infrastructure into a tangible, retention-building service your clients can see and appreciate.
Why Making Monitoring Visible Matters
Clients who cancel maintenance contracts most often cite a vague sense that nothing is happening for the money they spend. The better your monitoring works — fewer incidents, faster recovery — the more invisible your effort becomes. Visibility breaks this paradox.
| Client situation | Without visibility | With visibility |
|---|---|---|
| No incidents this month | "Nothing happened. Why am I paying?" | "Monitoring kept things stable all month." |
| Incident resolved quickly | "Why did the site go down?" | "15-minute recovery time — documented." |
| SSL renewal or DNS changes | "Renewed automatically somehow." | "Alert caught a near-miss before expiry." |
The goal is to build a client portal — not necessarily a dedicated software tool, but any set of touchpoints where clients can see that their site is being actively monitored and managed.
Layer 1: Status Pages for Real-Time Visibility
Give Clients a URL to Check Themselves
The foundation of a monitoring portal is a status page clients can reach at any time. When a client wonders "is the site okay right now?", a status page lets them find out without calling or emailing you.
A Miterl status page surfaces:
- Current operational status for each monitored endpoint (operational, degraded, or down)
- Rolling 90-day uptime history
- Past incident log with resolution details
- Scheduled maintenance windows
# Fetch a public status page by slug — no authentication required
curl -X GET https://miterl.com/api/v1/status-pages/your-client-slug \
-H "Content-Type: application/json"
# Example response
# {
# "data": {
# "name": "Client A Status",
# "overall_status": "operational",
# "monitors": [
# {"id": 1, "name": "Website", "status": "up", "uptime_90d": 99.9}
# ],
# "incidents": [],
# "upcoming_maintenance": []
# }
# }
Agencies that deploy client-facing status pages report a 60–70% drop in inbound status inquiries during incidents. Full setup guidance and operational best practices are covered in "How Status Pages Reduce Client Support Requests."
Where to Host the Status Page
| Option | Benefit | Best fit |
|---|---|---|
status.client-domain.com |
Fully branded for the client | Higher-tier maintenance plans with white-label |
miterl.com/status/your-slug |
Zero additional setup | Getting started quickly |
| URL in every monthly email and proposal | Keeps clients from forgetting it exists | During the adoption period |
Miterl's Standard plan and above supports custom domains for status pages. From the client's perspective, it appears to be a tool run by your agency — reinforcing your professional positioning rather than exposing the underlying platform.
Layer 2: Monthly Reports for Structured Proof of Work
The Five KPIs Worth Reporting
A monthly report is what converts accumulated monitoring data into a client-readable proof of value. The five monitoring-specific KPIs worth including are covered in detail in "5 Monitoring KPIs Web Agencies Should Report to Clients." The short version:
=== [Client Name] — Site Monitoring Report (Month YYYY) ===
[Uptime]
Rolling 30-day uptime: 99.97% (industry baseline: 99.9%)
Total downtime: 9 minutes (1 incident)
[Response Time]
Monthly average: 340ms (prior month: 380ms)
[SSL Certificate]
Status: Valid — 85 days to expiry
[Mail Authentication]
SPF / DMARC / DKIM / MX: All healthy
[Mean Time to Recovery]
Incidents this month: 1
Average recovery time: 15 minutes
Status page: https://status.example-client.com
Automating the Data Collection
For a small client roster, this report can be assembled by hand. For ten clients or more, automation is the only sustainable path. Here is a shell script that collects the core data from Miterl's API for every client in one pass.
#!/bin/bash
# monthly_portal_report.sh
# Collect monthly report data for all clients
API_KEY="YOUR_API_KEY"
BASE_URL="https://miterl.com/api/v1"
MONTH="${MONTH:-$(date +%Y-%m)}"
declare -A MONITORS=(
[1]="Client A — Corporate"
[2]="Client B — E-commerce"
[3]="Client C — Recruitment"
)
for MONITOR_ID in "${!MONITORS[@]}"; do
CLIENT="${MONITORS[$MONITOR_ID]}"
# Fetch rolling 30-day uptime
UPTIME=$(curl -s "${BASE_URL}/monitors/${MONITOR_ID}" \
-H "Authorization: Bearer ${API_KEY}" \
| jq -r '.data.uptime_30d // "N/A"')
# Summarize incidents resolved in the current calendar month
INCIDENTS=$(curl -s "${BASE_URL}/incidents?monitor_id=${MONITOR_ID}&status=resolved&per_page=100" \
-H "Authorization: Bearer ${API_KEY}" \
| jq --arg ym "${MONTH}" '
[.data[] | select(.resolved_at | startswith($ym))]
| {count: length, total_min: (map(.duration_seconds) | (add // 0) / 60 | round)}
')
COUNT=$(echo "$INCIDENTS" | jq -r '.count')
DOWNTIME=$(echo "$INCIDENTS" | jq -r '.total_min')
echo "## ${CLIENT}"
echo "- Uptime: ${UPTIME}%"
echo "- Incidents: ${COUNT} / Total downtime: ${DOWNTIME} min"
echo ""
done
Run this script via cron on the first of each month and pipe its output to an HTML template for email delivery. The complete pipeline — from API data collection through formatted email delivery — is described in "How to Automate Monthly Uptime Reports for Clients."
Quiet Months Are Worth Reporting Too
A common mistake is skipping the report when nothing bad happened. An incident-free month is the outcome your monitoring is designed to produce — and it deserves recognition. "Uptime: 99.99%. Zero incidents this month." tells clients that stability was actively maintained, not that nothing happened by luck. Twelve consecutive months of reports in their inbox transforms the maintenance retainer from an abstract cost to a documented track record.
Layer 3: Incident Notices That Arrive Before Clients Notice
Turning Incidents into Trust Moments
The highest-leverage touchpoint in client-facing monitoring visibility is the first notification during an incident. If a client hears from you before they notice the outage themselves, it completely changes the emotional tone of the situation.
Subject: [Miterl Alert] Client A — Service Degradation Detected
Hi [Client Name],
We detected reduced availability on your site (https://example-client.com)
at xx:xx. We are currently investigating the cause.
Live status: https://status.example-client.com
We will send an update as soon as we have more information.
— [Your Agency Name]
Sending this within five minutes of detection — before the client calls you — turns an incident into a proof point. "They noticed before I did" is one of the most powerful things a client can say about their agency.
The Three-Stage Incident Communication Timeline
| Stage | Timing | Content |
|---|---|---|
| First notice | Within 5 minutes of detection | "We're investigating." Status page URL. |
| Update | When root cause is identified | Cause and remediation plan. |
| Resolution | Immediately after recovery | Confirmed resolution. Prevention notes. |
Keeping the status page incident log updated at each stage means clients can check current status without emailing you. That removes the duplicate workload of both managing an incident and answering status queries simultaneously.
Automating Maintenance Window Notices
For planned work — server migrations, WordPress core updates, plugin upgrades — announce the window on the status page at least 48 hours in advance. Integrate the Miterl webhook into your deployment script so that the monitoring pause and status page notice happen automatically when the job starts.
# Start a maintenance window at deployment time (auto-expires after 1 hour)
curl -X POST https://miterl.com/api/v1/webhooks/maintenance/$MITERL_TOKEN/start \
-H "Content-Type: application/json" \
-d '{"duration_hours": 1, "name": "Scheduled maintenance — WordPress core update"}'
One command pauses monitoring alerts and updates the status page with a "Scheduled Maintenance" banner. Clients who check the status page during the window see a planned event, not an unexplained outage.
How the Three Layers Work Together
Status pages, monthly reports, and incident notices create multiple points of contact where clients experience monitoring value each month.
A typical month:
Day-to-day → Client checks status page independently
Month-end → Monthly report arrives: "Another stable month"
As needed → Maintenance notice: planned downtime announced in advance
A month with one incident:
Detection → Agency receives alert before client notices
T+5 min → "Investigating" notice sent; status page updated
T+15 min → Service restored; resolution notice sent
Next month → "1 incident, 15-minute recovery" appears in report
Each layer handles a different time horizon: real-time (status page), periodic (monthly report), and event-driven (incident notice). Covering all three means monitoring value is visible to clients regardless of whether the current month was quiet or eventful.
Pricing the Portal Into Your Maintenance Plans
Tying the client portal's features to maintenance plan tiers creates a clear upgrade path.
| Plan | What clients receive | Estimated monthly fee |
|---|---|---|
| Basic | Uptime monitoring + monthly email summary | $50–100 |
| Standard | 5-KPI report + status page + incident notices | $150–300 |
| Premium | Full portal + custom domain status page + automated delivery | $300–600 |
For a detailed guide to pricing monitoring into your maintenance contracts, see "Pricing Monitoring Into Agency Maintenance Contracts." For the ROI calculation that supports the business case internally, see "Why Agencies Should Include Monitoring in Contracts."
Summary
Making monitoring value visible to clients requires three layers working together:
- Status page (real-time): A self-service URL clients can check anytime. Cuts status inquiries by 60–70%.
- Monthly report (periodic): Five KPIs that document a month of stable operations. Makes the retainer fee tangible.
- Incident notice (event-driven): Proactive communication that turns outages into trust-building moments.
Miterl supports all three layers out of the box. Sign up for free to configure a status page and run your first API data collection. See the documentation for full setup instructions, and browse the use cases section for agency-specific deployment examples.