{
  "doc": {
    "id": "cloud/guides/webhooks",
    "title": "Build custom integrations with Cypress webhooks",
    "description": "Use the Cypress Cloud run.completed webhook with Slack Workflow Builder and other tools to send messages, create issues, trigger deploys, and more.",
    "section": "cloud",
    "source_path": "/llm/markdown/cloud/guides/webhooks.md",
    "version": "475685366f7f73d62514764c71d1dcf13e7eb276",
    "updated_at": "2026-09-19T00:22:08.216Z",
    "headings": [
      {
        "id": "cloud/guides/webhooks#build-custom-integrations-with-cypress-webhooks",
        "text": "Build custom integrations with Cypress webhooks",
        "level": 1
      },
      {
        "id": "cloud/guides/webhooks#what-you-can-build",
        "text": "What you can build",
        "level": 2
      },
      {
        "id": "cloud/guides/webhooks#what-you-need-to-set-up-a-cypress-webhook",
        "text": "What you need to set up a Cypress webhook",
        "level": 2
      },
      {
        "id": "cloud/guides/webhooks#create-a-custom-slack-message-for-a-cypress-run",
        "text": "Create a custom Slack message for a Cypress run",
        "level": 2
      },
      {
        "id": "cloud/guides/webhooks#what-youll-build",
        "text": "What you'll build",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#prerequisites",
        "text": "Prerequisites",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#step-1-create-a-webhook-triggered-slack-workflow",
        "text": "Step 1: Create a webhook-triggered Slack workflow",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#step-2-compose-the-message",
        "text": "Step 2: Compose the message",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#step-3-format-passing-and-failing-runs-differently",
        "text": "Step 3: Format passing and failing runs differently",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#step-4-point-the-cypress-cloud-webhook-at-slack",
        "text": "Step 4: Point the Cypress Cloud webhook at Slack",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#step-5-test-the-delivery",
        "text": "Step 5: Test the delivery",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#step-6-go-live",
        "text": "Step 6: Go live",
        "level": 3
      },
      {
        "id": "cloud/guides/webhooks#github-status-checks",
        "text": "GitHub status checks",
        "level": 2
      },
      {
        "id": "cloud/guides/webhooks#other-options",
        "text": "Other options",
        "level": 2
      },
      {
        "id": "cloud/guides/webhooks#see-also",
        "text": "See also",
        "level": 2
      }
    ]
  },
  "content": {
    "type": "root",
    "children": [
      {
        "type": "heading",
        "depth": 1,
        "children": [
          {
            "type": "text",
            "value": "Build custom integrations with Cypress webhooks"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "When a Cypress Cloud run finishes, the `run.completed` webhook delivers a JSON payload describing the run. You can use that event to send a message, create a tracking ticket, trigger a deployment, or page an on-call engineer."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "The "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md",
            "children": [
              {
                "type": "text",
                "value": "Cloud Webhook documentation"
              }
            ]
          },
          {
            "type": "text",
            "value": " explains the event, payload, headers, security, and retry behavior. This guide provides examples and shows you one deep-dive: how to create a custom Slack message with different formatting for passing and failing runs."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "What you can build"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "One event, `run.completed`, can drive many downstream actions. Point the Payload URL at a tool that accepts an inbound webhook, map the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md#Payload",
            "children": [
              {
                "type": "text",
                "value": "payload fields"
              }
            ]
          },
          {
            "type": "text",
            "value": " you care about, and filter in the destination if you only want certain runs. "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://slack.com/help/articles/360053571454",
            "children": [
              {
                "type": "text",
                "value": "Slack's built-in Workflow Builder"
              }
            ]
          },
          {
            "type": "text",
            "value": " works this way. Some destinations use a no-code platform or a short script that receives the Cypress POST and performs the next action."
          }
        ]
      },
      {
        "type": "table",
        "align": [
          null,
          null,
          null
        ],
        "children": [
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Outcome"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "How to build it"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Use cases"
                  }
                ]
              }
            ]
          },
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Custom Slack or Teams message"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Point the Payload URL at a "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://slack.com/help/articles/360053571454",
                    "children": [
                      {
                        "type": "text",
                        "value": "Slack Workflow Builder"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " webhook ("
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "#Create-a-custom-Slack-message-for-a-Cypress-run",
                    "children": [
                      {
                        "type": "text",
                        "value": "walkthrough below"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "). "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://support.microsoft.com/office/browse-and-add-workflows-in-microsoft-teams-4998095c-8b72-4b0e-984c-f2ad39e6ba9a",
                    "children": [
                      {
                        "type": "text",
                        "value": "Microsoft Teams Workflows"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " work the same way."
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Failed-run alerts with your own wording, alerts to the commit author, conditional logic or formatting that the built-in "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/slack.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Slack"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " or "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/microsoft-teams.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Teams"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " integrations do not offer"
                  }
                ]
              }
            ]
          },
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Custom GitHub status"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Point the Payload URL at "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://zapier.com",
                    "children": [
                      {
                        "type": "text",
                        "value": "Zapier"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://www.make.com",
                    "children": [
                      {
                        "type": "text",
                        "value": "Make"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", or "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://n8n.io",
                    "children": [
                      {
                        "type": "text",
                        "value": "n8n"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", which forwards `commitSha`, `status`, and `runUrl` to GitHub. See "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "#GitHub-status-checks",
                    "children": [
                      {
                        "type": "text",
                        "value": "GitHub status checks"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "."
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Required checks with your own rules"
                  }
                ]
              }
            ]
          },
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Trigger a deploy"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Point the Payload URL at a CD provider's build hook (Netlify, Vercel, and similar)."
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Deploy after a passing run"
                  }
                ]
              }
            ]
          },
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Create a Jira issue"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://support.atlassian.com/cloud-automation/docs/jira-automation-triggers/#Incoming-webhook",
                    "children": [
                      {
                        "type": "text",
                        "value": "Jira automation"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " receives the delivery on its incoming-webhook trigger and creates an issue."
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "File a bug when a run fails"
                  }
                ]
              }
            ]
          },
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Page an on-call engineer"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://support.pagerduty.com/main/docs/webhooks",
                    "children": [
                      {
                        "type": "text",
                        "value": "PagerDuty"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " receives the event on an integration URL and opens an incident."
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Page when a run fails or times out"
                  }
                ]
              }
            ]
          },
          {
            "type": "tableRow",
            "children": [
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Post to other apps"
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://zapier.com",
                    "children": [
                      {
                        "type": "text",
                        "value": "Zapier"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://www.make.com",
                    "children": [
                      {
                        "type": "text",
                        "value": "Make"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", or "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://n8n.io",
                    "children": [
                      {
                        "type": "text",
                        "value": "n8n"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " receives the webhook and sends the next action. For Google Chat, an "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://developers.google.com/apps-script/guides/web",
                    "children": [
                      {
                        "type": "text",
                        "value": "Apps Script"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " web app can post the message."
                  }
                ]
              },
              {
                "type": "tableCell",
                "children": [
                  {
                    "type": "text",
                    "value": "Discord, Google Chat, a spreadsheet, a warehouse"
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "What you need to set up a Cypress webhook"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Each outcome uses the same three moving parts:"
          }
        ]
      },
      {
        "type": "list",
        "ordered": true,
        "start": 1,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Get a destination URL from the tool you are integrating with. Use that URL as the Payload URL on your Cypress Cloud webhook."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Map fields from the flat "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/webhooks.md#Payload",
                    "children": [
                      {
                        "type": "text",
                        "value": "`run.completed` payload"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " to variables in your tool. These fields can include `status`, `projectName`, `runNumber`, `runUrl`, `totalFailed`, and `commitBranch`."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "If needed, add a condition in your tool. For example, check whether `status` is `failed` so the tool creates a ticket or page only for failed runs."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "You don't need to run a server for these examples. Each one points the Payload URL at a no-code or low-code tool that receives the delivery. Review "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md#Send-to-a-no-code-destination",
            "children": [
              {
                "type": "text",
                "value": "Send to a no-code destination"
              }
            ]
          },
          {
            "type": "text",
            "value": " for details about signature verification and other security considerations."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "Create a custom Slack message for a Cypress run"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Cypress Cloud already has a built-in "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/slack.md",
            "children": [
              {
                "type": "text",
                "value": "Slack integration"
              }
            ]
          },
          {
            "type": "text",
            "value": " that posts run results. Reach for a webhook when you want a message Cypress Cloud does not offer out of the box: your own wording, your own fields, a specific channel, or different formatting for passing and failing runs. This walkthrough builds one from scratch."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "What you'll build"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "This walkthrough posts a Slack message to a channel or person every time a run completes. The message names the project, links to the run in Cypress Cloud, and shows the test totals. You can also format passing and failing runs differently."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "You'll use "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://slack.com/help/articles/360053571454",
            "children": [
              {
                "type": "text",
                "value": "Slack's Workflow Builder"
              }
            ]
          },
          {
            "type": "text",
            "value": ", a tool provided by Slack. It can receive a webhook directly and map its JSON into a message, so you don't need a separate automation account. The example message also shows optional Slack interactive buttons that link to actions for the Cypress Cloud run."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Prerequisites"
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Permission to manage webhooks for the Cypress Cloud project. You must be an Owner, Admin, or Team Admin, or you can ask a user with one of those roles to add the webhook."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "A Slack plan that includes Workflow Builder, and permission to create and publish a workflow in your workspace. Conditional (if/else) steps require a paid Slack plan; a fallback that works on any plan is described below."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Step 1: Create a webhook-triggered Slack workflow"
          }
        ]
      },
      {
        "type": "list",
        "ordered": true,
        "start": 1,
        "spread": true,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "In Slack, open Workflow Builder and create a new workflow."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "For the way the workflow starts, choose Starts with a webhook."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": true,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Under Data Variables, add a key for each payload field you want in the message. Slack reads these from the top-level keys of the JSON body. You will likely want to start with fields like this:"
                  }
                ]
              },
              {
                "type": "list",
                "ordered": false,
                "start": null,
                "spread": false,
                "children": [
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`message` (only present in Cypress Cloud's generic `webhook.ping` test event)"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`status`"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`projectName`"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`runNumber`"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`runUrl`"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`commitBranch`"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`totalTests`"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "type": "listItem",
                    "spread": false,
                    "checked": null,
                    "children": [
                      {
                        "type": "paragraph",
                        "children": [
                          {
                            "type": "text",
                            "value": "`totalFailed`"
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "You can add any other "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/webhooks.md#Payload",
                    "children": [
                      {
                        "type": "text",
                        "value": "payload field"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " you plan to use, such as `commitMessage` or `commitAuthorName`."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Save the trigger. Slack generates a Web request URL. Click Copy Link; that URL becomes your Cypress Cloud Payload URL later. Treat it as a secret: anyone who has the link can trigger the workflow."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Array fields such as `tags` and `groups` don't map to a Workflow Builder variable. If you need these fields in Slack, transform the response in another service. You can also use Submit feedback in Cypress Cloud or contact your Cypress representative to request support for these fields."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Step 2: Compose the message"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "If needed, add a check using a Branch workflow step that checks fields such as `commitAuthorName`, `commitBranch`, `tags`, or `ciProvider` to only send the message on certain conditions."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Inside that branch, add a Send a message to a channel or Send a message to a person step. Choose the destination, and write the message, using Insert a variable to drop in the fields you mapped in Step 1. For example:"
          }
        ]
      },
      {
        "type": "code",
        "lang": null,
        "meta": null,
        "value": "Hey! A {projectName} test run just finished:\n\n- Status: {status}\n- Failures: {totalFailed} test(s) failed out of {totalTests} tests"
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Link the words \"test run\" (or the run number) to `{runUrl}` so the message opens the run in Cypress Cloud."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "When a run completes, Slack replaces each variable with the value from the payload."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "The final message looks like this:"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "In the screenshot, the Compare to last run, See failures, and See errors buttons link to Cypress Cloud pages for that run. To create something like this yourself, add Slack Interactive Buttons to the workflow, where you can set a URL that includes branch and project variables from the webhook payload, to set right to the page you would use the most."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "The Create Issue button uses Slack's built-in Jira integration to start a ticket for the run. You can replace it with another workflow step, such as PagerDuty."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Step 3: Format passing and failing runs differently"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "The `status` field tells you how the run ended. Use it to make a failing run stand out."
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": true,
        "children": [
          {
            "type": "listItem",
            "spread": true,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "On a paid Slack plan, add a Branch workflow step (If/else) before the message step. Set the condition to check whether the `status` variable equals `passed`. In the passing path, send a success-styled message; in the other path, send a failure-styled one, for example leading with a clear label and the failure count:"
                  }
                ]
              },
              {
                "type": "code",
                "lang": null,
                "meta": null,
                "value": "❌ FAILED — Cypress run #{runNumber} for {projectName} on {commitBranch}\n{totalFailed} of {totalTests} tests failed. Investigate: {runUrl}"
              }
            ]
          },
          {
            "type": "listItem",
            "spread": true,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "On any plan, skip the branch and put the status directly in the text so the outcome is always spelled out in words, never by color alone:"
                  }
                ]
              },
              {
                "type": "code",
                "lang": null,
                "meta": null,
                "value": "[{status}] Cypress run #{runNumber}: {projectName} ({commitBranch})\n{totalFailed}/{totalTests} failed · {runUrl}"
              }
            ]
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Because `status` can be `passed`, `failed`, `errored`, `timedOut`, or `cancelled`, treat \"not passed\" as the attention case rather than checking only for `failed`. That way an `errored` or `timedOut` run still gets your failure formatting."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Click Publish when the message looks right."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Step 4: Point the Cypress Cloud webhook at Slack"
          }
        ]
      },
      {
        "type": "list",
        "ordered": true,
        "start": 1,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "In Cypress Cloud, open your project's Settings, find the Webhooks panel, and click Add webhook. See "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/webhooks.md#Create-a-webhook",
                    "children": [
                      {
                        "type": "text",
                        "value": "Create a webhook"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Paste the Slack workflow's webhook URL as the Payload URL."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Leave `run.completed` selected. Save the webhook."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "You cannot use a "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md#Verify-webhook-signatures",
            "children": [
              {
                "type": "text",
                "value": "signing secret"
              }
            ]
          },
          {
            "type": "text",
            "value": " to authenticate the request here. Treat the Slack webhook URL itself as a secret: don't share it or commit it, since anyone who has it can post to your channel. For the full tradeoff, see "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md#Send-to-a-no-code-destination",
            "children": [
              {
                "type": "text",
                "value": "Send to a no-code destination"
              }
            ]
          },
          {
            "type": "text",
            "value": "."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Step 5: Test the delivery"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Use Send test on the webhook to confirm Cypress Cloud can reach Slack. See "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md#Send-a-test-event",
            "children": [
              {
                "type": "text",
                "value": "Send a test event"
              }
            ]
          },
          {
            "type": "text",
            "value": "."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "The test event is a `webhook.ping`, not a `run.completed`. Its body is `{ \"message\": \"Webhook ping\" }`, so it doesn't contain `status`, `runNumber`, or the other run fields your message maps. Send test confirms the connection and that the workflow fires; it will not render your mapped values."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "To confirm the field mapping end to end, record a Cypress run so a fresh `run.completed` fires. You can trigger this run locally with a single test if your project doesn't record runs often."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 3,
        "children": [
          {
            "type": "text",
            "value": "Step 6: Go live"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Once a real delivery renders the message the way you want, you're done. The workflow runs on every completed run. If you need to change the wording or fields later, edit the Slack workflow and republish; the Payload URL stays the same, so the Cypress Cloud webhook needs no change."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "GitHub status checks"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Use the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/github.md#Status-checks",
            "children": [
              {
                "type": "text",
                "value": "GitHub integration"
              }
            ]
          },
          {
            "type": "text",
            "value": " to report Cypress results on the pull request. It posts commit status checks per run group or spec."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "For a custom check, such as your own `context` name or a pass/fail rule on `totalFailed` and `commitBranch`, point the Payload URL at "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://zapier.com",
            "children": [
              {
                "type": "text",
                "value": "Zapier"
              }
            ]
          },
          {
            "type": "text",
            "value": ", "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://www.make.com",
            "children": [
              {
                "type": "text",
                "value": "Make"
              }
            ]
          },
          {
            "type": "text",
            "value": ", or "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://n8n.io",
            "children": [
              {
                "type": "text",
                "value": "n8n"
              }
            ]
          },
          {
            "type": "text",
            "value": ". That tool acts as a forwarder: it receives the Cypress POST, then calls GitHub with `commitSha`, `status`, and `runUrl` so a "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#repository_dispatch",
            "children": [
              {
                "type": "text",
                "value": "`repository_dispatch`"
              }
            ]
          },
          {
            "type": "text",
            "value": " workflow can post the commit status. Store a GitHub token in the tool."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "When a check fails and you want the tests, screenshots, or Test Replay for that run, use the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/cloud-cli.md",
            "children": [
              {
                "type": "text",
                "value": "Cloud CLI"
              }
            ]
          },
          {
            "type": "text",
            "value": " or "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/cloud-mcp.md",
            "children": [
              {
                "type": "text",
                "value": "Cloud MCP"
              }
            ]
          },
          {
            "type": "text",
            "value": "."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "Other options"
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "To send the message to Microsoft Teams instead of Slack, use "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://support.microsoft.com/office/browse-and-add-workflows-in-microsoft-teams-4998095c-8b72-4b0e-984c-f2ad39e6ba9a",
                    "children": [
                      {
                        "type": "text",
                        "value": "Workflows"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " with an incoming-webhook trigger. Create the flow, map the payload fields, and use its URL as the Payload URL. Cypress Cloud also has a built-in "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/microsoft-teams.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Microsoft Teams integration"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " for standard notifications."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "To post to Google Chat, deploy an "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://developers.google.com/apps-script/guides/web",
                    "children": [
                      {
                        "type": "text",
                        "value": "Apps Script web app"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " whose `doPost` reads the Cypress JSON and POSTs a message to a Chat "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "https://developers.google.com/workspace/chat/quickstart/webhooks",
                    "children": [
                      {
                        "type": "text",
                        "value": "incoming webhook"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "To filter runs, use your tool's filter step to continue only when `status` isn't `passed`, or only when `totalFailed` is greater than zero."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "A no-code platform such as Zapier, Make, or n8n can use one delivery to post to a channel, open a Jira ticket, and append a row to a reporting sheet."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "See also"
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/webhooks.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Webhooks Integration"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - the full event, payload, headers, security, and retry reference"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/webhooks.md#Payload",
                    "children": [
                      {
                        "type": "text",
                        "value": "`run.completed` payload"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - every field, its type, and meaning"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/webhooks.md#Verify-webhook-signatures",
                    "children": [
                      {
                        "type": "text",
                        "value": "Verify webhook signatures"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - HMAC verification for destinations that support it"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/slack.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Slack integration"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - built-in Slack notifications for run results"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/github.md#Status-checks",
                    "children": [
                      {
                        "type": "text",
                        "value": "GitHub integration"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - built-in commit status checks and pull request comments"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/cloud-cli.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Cloud CLI"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - inspect a specific run from the terminal"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/cloud-mcp.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Cloud MCP"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - inspect a specific run from an AI client"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/microsoft-teams.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Microsoft Teams integration"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - built-in Teams notifications"
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/jira.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Jira integration"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " - connect Cypress Cloud runs to Jira"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  "token_estimate": 2585
}