2026-06-18

Client Portal for Monitoring Data: Agency Reporting Guide

client reporting web agency status page monthly report maintenance contract

"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:

  1. Status page (real-time): A self-service URL clients can check anytime. Cuts status inquiries by 60–70%.
  2. Monthly report (periodic): Five KPIs that document a month of stable operations. Makes the retainer fee tangible.
  3. 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.