---
title: Alert RCA with Autopilot and Slack
source: https://docs.newrelic.com/docs/workflow-automation/workflow-examples/integrations/autopilot-slack-rca
---

When an alert fires, trigger [Autopilot](https://docs.newrelic.com/docs/agentic-ai/autopilot/overview) to run a root cause analysis and post the findings directly to a Slack channel. If Autopilot returns no usable response, the workflow sends an error notice instead so the team knows to investigate manually.

Before using this workflow, ensure you have:

-   A New Relic alert issue ID in UUID format
-   A Slack destination configured in New Relic — see [Create destinations](https://docs.newrelic.com/docs/workflow-automation/setup-and-configure/create-destinations)
-   The destination's UUID and the target Slack channel name

> #### 💡 TIP
>
> When triggering this workflow from **Alert Workflows**, use `{{ issueId }}` as the value for the `issueId` input. This variable automatically passes the triggering alert's issue ID to the workflow.

This workflow completes the following steps:

1.  Sends an initial Slack message to acknowledge the alert and let the team know RCA is underway
2.  Runs Autopilot with a root cause analysis prompt scoped to the alert issue ID
3.  Checks whether Autopilot returned a usable response
4.  If Autopilot succeeds, reformats the response as Slack Block Kit blocks and posts findings to Slack
5.  If Autopilot fails, posts an error message with the issue ID

This workflow uses `newrelic.autopilot.run` and `newrelic.notification.sendSlack`.

> #### ⚠️ IMPORTANT
>
> Selector `expression` values must be written on a single line. Multi-line YAML block scalars (`|` or `|-`) aren't evaluated for selector expressions and silently produce no output.

> #### 💡 TIP
>
> Autopilot's `finalAnswer` field can return as either a plain string or a JSON-encoded object depending on prompt context. The `analysisText` selector in this workflow handles both shapes automatically.

```yaml
name: autopilotSlackRCA
description: Automatically analyze New Relic alerts with Autopilot and send cleanly formatted findings to Slack
workflowInputs:
  issueId:
    type: String
    required: true
    validations:
      - errorMessage: Must be a valid New Relic issue ID in UUID format
        pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'
        type: regex
  slackDestinationId:
    type: String
    required: true
    validations:
      - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
        errorMessage: "Invalid format. Please provide a valid UUID."
        type: regex
  channel:
    type: String
    required: true
steps:
  - name: notifyAlertReceived
    type: action
    action: newrelic.notification.sendSlack
    version: 1
    inputs:
      destinationId: ${{ .workflowInputs.slackDestinationId }}
      channel: ${{ .workflowInputs.channel }}
      text: |-
        🔔 *Alert Received — Starting Root Cause Analysis*

        ⏳ Running Autopilot for RCA, please wait...

  - name: runAutopilot
    type: action
    action: newrelic.autopilot.run
    version: 1
    inputs:
      prompt: >-
        Perform a root cause analysis for the following New Relic alert:
        Issue ID: ${{ .workflowInputs.issueId }}
        Provide your comprehensive analysis including Summary, Root Cause, and Remediation Actions.
      selectors:
        - name: analysisRaw
          expression: .response.finalAnswer
        - name: analysisText
          expression: '(.response.finalAnswer | if type=="string" then fromjson else . end).card.body | map(.value) | join("\n\n")'
    ignoreErrors: true

  - name: checkAgentResponse
    type: switch
    switch:
      - condition: ${{ (.steps.runAutopilot.outputs.analysisRaw // "") != "" }}
        next: buildSlackBlocks
    next: sendAutopilotError

  - name: buildSlackBlocks
    type: assign
    inputs:
      blocks: '${{ (.steps.runAutopilot.outputs.analysisText // "") | gsub("\\*\\*"; "*") | gsub("### "; "*") | gsub("## "; "*") as $text | ([ $text / "\n" ]) as $lines | [ { "type": "header", "text": { "type": "plain_text", "text": "✅ Autopilot RCA Complete" } }, { "type": "divider" } ] + [ $lines[][] | select(. != "") | { "type": "section", "text": { "type": "mrkdwn", "text": . } } ] }}'
    next: sendRcaFindings

  - name: sendRcaFindings
    type: action
    action: newrelic.notification.sendSlack
    version: 1
    inputs:
      destinationId: ${{ .workflowInputs.slackDestinationId }}
      channel: ${{ .workflowInputs.channel }}
      blocks: ${{ .steps.buildSlackBlocks.outputs.blocks }}
    next: end

  - name: sendAutopilotError
    type: action
    action: newrelic.notification.sendSlack
    version: 1
    inputs:
      destinationId: ${{ .workflowInputs.slackDestinationId }}
      channel: ${{ .workflowInputs.channel }}
      text: |-
        🟥 *Autopilot RCA Failed*

        Could not extract findings from Autopilot response for issue: ${{ .workflowInputs.issueId }}
        Please investigate manually.
    next: end
```

## How it works [#how-it-works]

The `runAutopilot` step uses two selectors to handle `finalAnswer` shape variability at the data-extraction layer:

-   **`analysisRaw`** captures the raw `finalAnswer` value. The `checkAgentResponse` step uses this to determine whether Autopilot returned anything.
-   **`analysisText`** normalizes the value — if `finalAnswer` is a JSON-encoded string, it parses it first, then extracts text content from `.card.body`. The `buildSlackBlocks` step uses `analysisText` directly, which keeps the formatting logic simple.

`buildSlackBlocks` converts `**bold**` and `###`/`##` heading markers to Slack mrkdwn format, splits the result on newlines, and wraps each non-empty line in a Block Kit `section` block.

## Related topics [#related-topics]

[Autopilot overview](https://docs.newrelic.com/docs/agentic-ai/autopilot/overview)

Learn how Autopilot investigates alerts and incidents

[Conditional logic](https://docs.newrelic.com/docs/workflow-automation/workflow-examples/basic-patterns/conditional-logic)

Use switch statements to branch on success or failure

[Send Slack notifications](https://docs.newrelic.com/docs/workflow-automation/setup-and-configure/actions-catalog/newrelic/newrelic-notification#newrelic.notification.sendSlack)

Full reference for the sendSlack action

[Create destinations](https://docs.newrelic.com/docs/workflow-automation/setup-and-configure/create-destinations)

Configure the Slack destination required by this workflow

[Troubleshoot Workflow Automation](https://docs.newrelic.com/docs/workflow-automation/troubleshooting)

Solutions for common Autopilot and Slack integration issues
