# Custom reports

While our pre-built reports offer extensive functionality, you might need **highly customized analyses or visualizations** that are updated in real-time. Our live CSV export feature, e.g. combined with Google Sheets, empowers you to create dynamic, automatically refreshing custom reports.

This method is particularly useful for:

*   Building bespoke dashboards tailored to unique business metrics.
*   Sharing real-time data with stakeholders who prefer spreadsheet formats.
*   Performing advanced statistical analysis not available in the UI.

![Export as CSV](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/9907c238-62a5-4044-4471-9660209f6700/lg1x =3620x1414)

## Exporting data as CSV

1. **Navigate to a report:** Go to any report that contains the data you wish to analyze. For example, [Incidents overview](https://uptime.betterstack.com/team/0/reporting/incidents-overview?rf=now-90d ";_blank").
2. **Apply filters (Optional):** Apply any filters or date ranges to narrow down the data before export. The exported CSV will reflect these selections.
3. **Get your CSV URL:** Look for the **Export CSV** button located near the top right of the report interface and **copy the link address**.

You now have a **URL that holds your real-time reporting data** in an easily usable format.

### Importing live data into Google Sheets

Create a [new Google Spreadsheet](https://docs.google.com/spreadsheets/u/0/create). Of course, you can use other software in a similar fashion.

Select cell `A1` and use the `IMPORTDATA` function, pasting the copied URL:

```excel
[label Import your data by pasting URL into A1 cell]
=IMPORTDATA("YOUR_EXPORT_CSV_URL_HERE")
```

![Allow loading external data](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/3b0b82d7-543a-4138-4924-ea4517fe0d00/orig =3502x1254)

After **allowing access to data from Better Stack**, your data from the live CSV endpoint will be fetched. ✨

![Live data in Google Spreadsheet](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/479a8e17-2041-4b24-d443-68ee80be9800/lg1x =3506x1324)

Now that your live data is in Google Sheets, you can **use its powerful features**, like pivot tables, to create insightful visualizations in an environment you're likely **already familiar with**.

[note]
#### Seeing numbers instead of dates in columns such as "Started at"?

Select the column, open **Format** → **Number** menu and select **Date and time**.
[/note]

### Example: Weekly incidents trends

As a real-world example, explore weekly trends in number of incidents, **grouping them by the type of resolution and their urgency** based on your [metadata](https://betterstack.com/docs/uptime/incident-metadata/).

The example will use these 3 columns of the [Incidents overview report](https://uptime.betterstack.com/team/0/reporting/incidents-overview?rf=now-90d ";_blank"):

- **Started at** in column `D`
- **Resolved by** in column `I`
- **Metadata** in column `K`

![Weekly incidents trends sheet](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/182acb07-26f3-4053-54c8-9a3eb2963a00/orig =3590x1214)

### Date range format

To group the data on a weekly basis, transform the **Started at** column into week ranges - such as `2025/11/17 - 2025/11/23`.

1. Write **Started in week** into the empty cell `L1`.
2. Paste the following formula into `L2`. Feel free to customize the format.
3. Autofill the rest of the cells in the `L` column.

[code-tabs]
```plaintext
[label Cell L2: Transform "Started at" into a week label]
=TEXT(D4 - WEEKDAY(D4,2) + 1, "yyyy/mm/dd") & " - " & TEXT(D4 - WEEKDAY(D4,2) + 7, "yyyy/mm/dd")
```
```plaintext
[label Start weeks on Sunday]
=TEXT(D4 - WEEKDAY(D4,1) + 1, "yyyy/mm/dd") & " - " & TEXT(D4 - WEEKDAY(D4,1) + 7, "yyyy/mm/dd")
```
[/code-tabs]

### Categorize values

To simplify the trend report, it might be great to ignore specific people who resolved the incident. Categorize the **Resolved by** column into `"Ongoing"`, `"Automatically resolved"`, and `"Manually resolved"`.

1. Write **Resolution type** into the empty cell `M1`.
2. Paste the following formula into `M2`. It will replace names of specific team members by `"Manually resolved"`.
3. Autofill the rest of the cells in the `M` column.

```plaintext
[label Cell M2: Simplify "Resolved by" into just 3 states]
=IF(OR(I2 = "Ongoing", I2 = "Automatically resolved"), I2, "Manually resolved")
```

### Extract metadata

You can extract any [metadata](https://betterstack.com/docs/uptime/incident-metadata/) value from your incidents and use it in your report. For example, extract the **Urgency** key into a separate column.

1. Write **Urgency** into the empty cell `N1`.
2. Paste the following formula into `N2`. It will extract values from a specific key in the **Metadata** column, for example the `"Urgency"` key.
3. Autofill the rest of the cells in the `N` column.

```plaintext
[label Cell N2: Extract value of specific key in "Metadata"]
=IFNA(REGEXEXTRACT(K2, "Urgency: (.*?)(?:;|$)"), "N/A")
```

### Pivot tables

Now, all data are transformed and formatted for your reports.

Go to **Insert** menu and select **Pivot table**. Change the data range to `Sheet1!A1:N` to work with the whole sheet, insert to a new sheet, and click **Create**.

To see the summary, configure the pivot table:

- **Rows:** pick **Started in week**
- **Columns:** pick **Resolved type** or **Urgency**
- **Value:** pick **Started at** and summarize by **COUNTA**
- **Filters:** add **Started at**, and select **Filter by condition: Is not empty**.

You can see the number of incidents started each week of your report, grouped by the column you selected.

![Weekly incidents by resolution type](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/8c16b849-a215-4198-e86a-085814b6f200/orig =2660x806)

### Quick visualizing

To visualize the data, select all cells of your pivot table, go to **Insert** menu, and select **Chart**.

You'll get a quick visualizion of the trends in your started incidents.

![Chart weekly incidents by resolution type](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/8b6fe920-d897-49ce-81e1-3825e9429600/md2x =2836x1190)

### Real-time updates

The beauty of this setup is that your custom reports and charts in Google Sheets will **automatically update** as new data becomes available through the `IMPORTDATA` function.

This provides you with **live, dynamic dashboards** without any manual intervention after the initial setup. 🚀

## Tips for custom reports

Google Sheets allows **easy sharing and collaboration**, enabling you to share your live reports with your team or management.

**Leverage other advanced formulas and functions**, such as `QUERY`, `FILTER`, or `SUMIF`, for more complex analysis.

This approach gives you **unmatched flexibility and control** over your reporting, ensuring you always have the insights you need, exactly how you need them.

## Common use cases

### Track incident response performance

Use **Incidents MTTA** and **Incidents MTTR** reports to measure how quickly your team acknowledges and resolves incidents. Filter by escalation policy to compare response times across different severity levels.

Combine with metadata filtering to analyze response times for critical production incidents: `environment=production severity=critical`.

### Monitor service availability

The **Monitors SLA** report shows compound availability across selected monitors. Filter by resource groups to track SLA for specific services or environments.

Export this data monthly for compliance reports and stakeholder updates.

### Review on-call effectiveness

Use **On-calls overview** to see how many incidents each team member handled during their on-call shifts. Combine with business hours filters to measure activity during and after working hours.

This helps identify on-call load imbalances and potential burnout risks.

### Analyze team workload

The **Teams response effort** report tracks total response interactions per team member. This helps identify workload imbalances and burnout risk.

Compare response effort across teams to ensure fair distribution of incident load.

### Generate compliance reports

Export **Monitors SLA** data to CSV for monthly or quarterly availability reports. Use metadata filters to include only production monitors in your compliance calculations.

Set up saved filter presets for each compliance report you generate regularly.

[docs-incident-metadata]: https://betterstack.com/docs/uptime/incident-metadata/