---
title: "Morning operations briefing | Grafana Cloud documentation"
description: "Every weekday morning, Grafana Assistant posts a short Slack briefing on active incidents, firing alerts, and what happened overnight."
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

# Morning operations briefing

> Note
> 
> Grafana Workflows is currently in [public preview](https://grafana.com/docs/release-life-cycle/). Grafana Labs offers limited support, and breaking changes might occur prior to the feature being made generally available.

Every weekday morning, Grafana Assistant posts a short Slack briefing on active incidents, firing alerts, and what happened overnight.

This Grafana Workflows blueprint is in the **Reports** category of the Blueprints library.

## Before you begin

To use this blueprint, you need:

- Slack connected to Grafana IRM. For details, refer to [Configure Slack for Grafana IRM](https://grafana.com/docs/grafana-cloud/alerting-and-irm/irm/integrations/chat-and-collaboration/slack/).
- Grafana Assistant in use on your stack.

## Steps

Steps run in order from first to last. A step inside a switch branch runs only when Workflows chooses that branch.

Expand table

| Step                | ID              | Type                 | Description                                                                                               |
|---------------------|-----------------|----------------------|-----------------------------------------------------------------------------------------------------------|
| Gather the briefing | `briefing`      | `assistant.prompt`   | Asks Grafana Assistant for the morning briefing. Adjust the window or add teams and services to focus on. |
| Post the briefing   | `post-briefing` | `slack.message.post` | Posts the briefing with Block Kit formatting. Set `channelID` to your team’s channel.                     |

For the inputs and outputs of each step type, refer to [Step and trigger types reference](https://grafana.com/docs/grafana-cloud/platform/workflows/reference/step-trigger-types).

Before you turn on the workflow, customize any steps that need input from you, such as a channel ID or a schedule name. Each step’s description says what to set.

## Workflow definition

Save this definition as a YAML file to create the workflow with gcx, the Workflows API, or Terraform, or give it to a coding agent as an example. Replace *FOLDER\_UID* with the UID of the folder for the workflow. Blueprints start disabled, so finish customizing the steps before you set `enabled` to `true`. For details, refer to [Manage workflows as code](https://grafana.com/docs/grafana-cloud/platform/workflows/as-code).

YAML ![Copy code to clipboard](https://grafana.com/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
apiVersion: workflows.ext.grafana.app/v1alpha1
kind: Definition
metadata:
  name: morning-operations-briefing
  annotations:
    grafana.app/folder: <FOLDER_UID>
spec:
  name: Morning operations briefing
  enabled: false
  startWhen:
    matchingRules: []
    schedules:
      - 'CRON_TZ=America/New_York 0 8 * * 1-5'
  steps:
    - id: briefing
      type: assistant.prompt
      name: Gather the briefing
      description: Asks Grafana Assistant for the morning briefing. Adjust the window or add teams and services to focus on.
      inputs:
        prompt: |
          Prepare a morning operations briefing from Grafana IRM for ${now() - duration('16h')} to ${now()}.

          Include:
          - Incidents that are active right now, with severity and how long they've been open
          - Alert groups that are firing or acknowledged
          - Incidents and alert groups that were resolved overnight
          - Anything that looks like it needs a human today

          headline is one sentence. details is Slack mrkdwn under 2500 characters, with links where you can.
        outputSchema: |
          {
            "type": "object",
            "required": ["headline", "activeIncidentCount", "firingAlertGroupCount", "details"],
            "properties": {
              "headline": { "type": "string" },
              "activeIncidentCount": { "type": "integer" },
              "firingAlertGroupCount": { "type": "integer" },
              "details": { "type": "string" }
            }
          }
        maxRetries: '3'
    - id: post-briefing
      type: slack.message.post
      name: Post the briefing
      description: Posts the briefing with Block Kit formatting. Set channelID to your team's channel.
      inputs:
        channelID: ''
        messageText: 'Morning operations briefing: ${steps.briefing.outputs.result.headline}'
        blocks: |
          [
            {
              "type": "header",
              "text": {
                "type": "plain_text",
                "text": "Morning operations briefing"
              }
            },
            {
              "type": "section",
              "text": {
                "type": "mrkdwn",
                "text": ${json_stringify('*' + steps.briefing.outputs.result.headline + '*')}
              }
            },
            {
              "type": "section",
              "fields": [
                {
                  "type": "mrkdwn",
                  "text": "*Active incidents*\n${steps.briefing.outputs.result.activeIncidentCount}"
                },
                {
                  "type": "mrkdwn",
                  "text": "*Firing alert groups*\n${steps.briefing.outputs.result.firingAlertGroupCount}"
                }
              ]
            },
            {
              "type": "divider"
            },
            {
              "type": "section",
              "text": {
                "type": "mrkdwn",
                "text": ${json_stringify(steps.briefing.outputs.result.details)}
              }
            }
          ]
```

## How it works

This section explains when the workflow runs and how its steps work together.

### When it runs

This blueprint runs on the schedule `CRON_TZ=America/New_York 0 8 * * 1-5`.

### How the steps fit together

These notes cover how the steps connect and which Workflows behaviors the blueprint relies on.

- Schedule trigger at 8:00 AM New York time on weekdays (`CRON_TZ` prefix, adjusted for daylight saving time).
- The `assistant.prompt` step asks Grafana Assistant to summarize the current state from Grafana IRM and return JSON that matches `outputSchema`.
- The Slack step sends Block Kit blocks instead of plain text.
- blocks is a JSON string, so assistant output is inserted with `json_stringify()`, which quotes and escapes it, to keep the blocks valid whatever the text contains.
- `messageText` is still set, because Slack uses it as the notification fallback.
- Customize the schedule and timezone, the time window, the prompt, and the Slack channel.

## Next steps

- [Blueprints](https://grafana.com/docs/grafana-cloud/platform/workflows/reference/blueprints)
- [Start from a blueprint](https://grafana.com/docs/grafana-cloud/platform/workflows/build/use-blueprints)
- [Manage workflows as code](https://grafana.com/docs/grafana-cloud/platform/workflows/as-code)
- [Step and trigger types reference](https://grafana.com/docs/grafana-cloud/platform/workflows/reference/step-trigger-types)
