# Customer uptime and SLA portal for account managers

> Pick a customer, choose a date range, and see whether you met the uptime you promised them before the renewal call, then send them the report.

- Workflow type: app
- Services: Better Stack, HubSpot, Google Docs
- Categories: Operations, Customer Support
- Published: 2026-08-14

## What it does

- Choose a customer from your CRM and a date range, then see one combined uptime percentage covering only the systems that belong to that customer
- States plainly whether you met or missed their contracted uptime target, and by how many minutes of downtime
- Lists every outage in the window with start time, end time, and length, and lets you mark any of them as planned maintenance so it does not count against the target
- Shows how response times trended over the period, so you can talk about performance and not just availability
- Turns the whole picture into a polished document you can send straight to the customer

## What you'll need

- A Better Stack account with monitors already running for the systems you host for customers
- A HubSpot login where your customers exist as companies
- A Google account, for creating the report documents
- The uptime target you promised each customer, for example 99.9 percent
- A few minutes up front to map each customer to their monitors in the settings view

## Prompt

Build me a customer uptime portal that my account managers open before renewal calls and monthly check-ins. Better Stack reports on monitors, but never on customers, so I need a view that reframes the same data per customer: one combined SLA percentage for that customer's systems over a date range I choose, every incident in that window, and a response time trend. The app must state plainly in the header whether we met or breached the uptime we contracted with that customer, and by how many minutes of downtime.

Main view. At the top, a customer picker backed by HubSpot Search Companies, so the account manager types a company name and selects it. Next to it, a date range control with quick presets for last 30 days, last quarter, and month to date, plus a custom range. Selecting a customer loads that customer's saved monitor mapping and contracted uptime target from app storage, then fetches everything for the chosen range. If the selected company has no mapping yet, show an empty state that links straight into the settings view rather than rendering a misleading zero.

SLA header and the verdict. For each mapped monitor, call Better Stack Get Monitor Availability (SLA) with the chosen from and to dates. Combine them time weighted: total up minutes across the monitors divided by total monitored minutes across the monitors, so a customer with six systems is not judged by an unweighted average of percentages. Compute allowed downtime for the window as (100 minus the contracted target percent) times the length of the window in minutes. Then state the verdict in plain language, for example: Target 99.9 percent, allowed 43 minutes of downtime, actual 12 minutes. Met, with 31 minutes to spare. Or: Target 99.9 percent, allowed 43 minutes, actual 68 minutes. Breached by 25 minutes. Show the combined percentage large, the verdict directly under it in a clearly positive or negative treatment, and a per monitor breakdown table underneath so the account manager can see which system caused the damage.

Exclude paused monitors from the SLA math. Use Better Stack List Monitors to read each mapped monitor's current status, drop paused ones from both the combined percentage and the allowed versus actual downtime comparison, and show a small note listing which monitors were excluded and why. A system we deliberately took offline must not drag down a customer's number, but it also must not vanish without explanation.

Incidents. Use Better Stack List Incidents filtered by the mapped monitors and the selected date range, and render a table with start time, end time, duration, which monitor was affected, and the incident cause or name. Each row has a planned maintenance toggle. When an account manager marks a row as planned maintenance, persist that flag against the incident id in app storage so it stays marked for everyone and for every future report, then subtract that incident's duration from the downtime counted against the contracted target. The header should show both figures when they differ: total downtime, and downtime counted against the target after planned maintenance is excluded. Never silently drop maintenance windows from the incident list, because the customer should still see we were transparent about the work.

Response time trend. Use Better Stack Get Monitor Response Times for the mapped monitors over the same window and render a line chart, with a selector to view one monitor at a time or an average across them. Underneath, call out the slowest day and the change from the start of the period to the end, so the account manager has something concrete to say about performance rather than just availability.

Settings view for mapping. A second view lists every mapped customer with its monitor count and contracted target, and lets the user add or edit a mapping. In the editor, search for the company with HubSpot Search Companies, then attach monitors from Better Stack List Monitors and monitor groups from Better Stack List Monitor Groups, and enter the contracted uptime target as a percentage. Store the HubSpot company id, the company name, the selected monitor ids and monitor group ids, and the target. When a customer is mapped to a group, expand it at report time with Better Stack List Monitors in Group rather than freezing the member list, so monitors added to that group later are picked up automatically. All of this is shared workspace wide so two account managers pulling the same customer and range get identical numbers.

Generate report button. On click, create the report with Google Docs Create Document, titled with the customer name and the date range, then fill it with Google Docs Batch Update Document. The document should contain a heading with the customer name and period, a short SLA summary paragraph stating the combined uptime, the contracted target, and the met or breached verdict in minutes of allowed versus actual downtime, a per monitor availability table, and an incident table with start, end, duration, affected system, and a planned maintenance column. Exclude paused monitors from the document's math exactly as the screen does. When the document is ready, show the link in the app so the account manager can open it, give it a final read, and send it to the customer.

General behaviour. Everything except the generated document and the stored mapping is read only, so nothing in Better Stack or HubSpot is modified. Show loading states per panel rather than blocking the whole page, since availability, incidents, and response times all load separately. If a monitor returns an error or has no data for the window, show that monitor as unavailable in the breakdown instead of failing the whole report.

## How to customize

- Change the default date range to last 30 days, last quarter, or the customer's current contract month
- Adjust how the combined percentage is calculated, for example weighting critical systems more heavily or reporting the worst performing system instead of the average
- Restyle the generated document with your own intro paragraph, sign off, and service credit language
- Add fields to the customer mapping, such as the contract renewal date or the account manager who owns the relationship

## FAQ

### Do I have to set something up before the first report?

Yes, once per customer. In the settings view you match each customer to the monitors or monitor groups that belong to them and enter the uptime target from their contract. After that, producing a report is just picking the customer and a date range.

### What happens to monitors that are paused?

Paused monitors are left out of the uptime math entirely, so a system you deliberately took offline does not drag down a customer's number. The portal still shows you which monitors were skipped, so nothing disappears silently.

### Can I stop planned maintenance from counting against us?

Yes. Every outage in the list has a planned maintenance toggle. Flip it and that downtime is subtracted from the total held against the contracted target. The report shows both the raw figure and the adjusted one, so the customer sees you are not hiding anything.

### Does this change anything in Better Stack or HubSpot?

No. The portal only reads from both. The only thing it creates is the Google Doc report, plus the customer mapping and maintenance flags it stores inside the app itself.

### Can I use monitor groups instead of picking monitors one at a time?

Yes. You can map a customer to a whole monitor group, and the group is expanded fresh every time you run a report, so monitors added to that group later are included automatically.

### Will everyone on my team see the same numbers?

Yes. The customer mapping, uptime targets, and maintenance flags are shared across your workspace, so two account managers pulling the same customer and date range get identical figures.

Use this prompt in General Input: https://www.generalinput.com/prompts/customer-uptime-and-sla-portal-for-account-managers