{
  "doc": {
    "id": "ui-coverage/guides/monitor-changes",
    "title": "Monitor UI Coverage changes over time",
    "description": "Set up a repeatable workflow to catch UI Coverage regressions before they merge and track coverage trends across your projects.",
    "section": "ui-coverage",
    "source_path": "/llm/markdown/ui-coverage/guides/monitor-changes.md",
    "version": "f97f06d85653c51afe39a9bd3cefda946807f150",
    "updated_at": "2026-10-05T21:01:45.863Z",
    "headings": [
      {
        "id": "ui-coverage/guides/monitor-changes#monitor-changes",
        "text": "Monitor changes",
        "level": 1
      },
      {
        "id": "ui-coverage/guides/monitor-changes#step-1-record-runs-on-a-regular-cadence",
        "text": "Step 1: Record runs on a regular cadence",
        "level": 2
      },
      {
        "id": "ui-coverage/guides/monitor-changes#step-2-catch-regressions-on-each-pull-request",
        "text": "Step 2: Catch regressions on each pull request",
        "level": 2
      },
      {
        "id": "ui-coverage/guides/monitor-changes#step-3-investigate-a-specific-change",
        "text": "Step 3: Investigate a specific change",
        "level": 2
      },
      {
        "id": "ui-coverage/guides/monitor-changes#step-4-track-trends-across-projects",
        "text": "Step 4: Track trends across projects",
        "level": 2
      },
      {
        "id": "ui-coverage/guides/monitor-changes#see-also",
        "text": "See also",
        "level": 2
      }
    ]
  },
  "content": {
    "type": "root",
    "children": [
      {
        "type": "heading",
        "depth": 1,
        "children": [
          {
            "type": "text",
            "value": "Monitor changes"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "A single UI Coverage score tells you where you are today. Monitoring tells you which direction you're moving, so a drop in coverage is caught and reviewed before it merges, rather than discovered months later. This guide walks through a repeatable monitoring workflow, from establishing a cadence of runs to reviewing individual changes and tracking long-term trends."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "UI Coverage turns your runs into a visual map of the interactive elements your tests exercise and the ones they miss, with no code changes or instrumentation. "
          },
          {
            "type": "link",
            "title": null,
            "url": "https://www.cypress.io/ui-coverage?utm_medium=premium-solution-tip&utm_source=docs.cypress.io&utm_content=Schedule%20a%20demo",
            "children": [
              {
                "type": "text",
                "value": "Schedule a demo"
              }
            ]
          },
          {
            "type": "text",
            "value": "."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "This guide assumes UI Coverage is enabled and your tests are recording to Cypress Cloud. If you haven't set that up yet, start with the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/ui-coverage/get-started/setup.md",
            "children": [
              {
                "type": "text",
                "value": "UI Coverage setup guide"
              }
            ]
          },
          {
            "type": "text",
            "value": "."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "Step 1: Record runs on a regular cadence"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Monitoring only works when there is something to compare. Two recording patterns give you that:"
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "On every pull request: record a run for each PR so you can compare it against your base branch. This is what surfaces coverage regressions while they can still be fixed cheaply."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "On a schedule: add a recurring job to your CI (for example, a nightly cron workflow) that records a run against a stable environment. Scheduled runs give you a consistent point of comparison that isn't affected by which files a particular PR happened to touch."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "When a run is split across parallel machines or multiple `cypress run` calls, combine those specs into a single "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/features/recorded-runs.md",
            "children": [
              {
                "type": "text",
                "value": "Cypress run"
              }
            ]
          },
          {
            "type": "text",
            "value": " with the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/features/smart-orchestration/parallelization.md#Grouping-test-runs",
            "children": [
              {
                "type": "text",
                "value": "`--group` flag"
              }
            ]
          },
          {
            "type": "text",
            "value": " so each report reflects your entire suite rather than a slice of it."
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Once runs are recording, connect "
          },
          {
            "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": "Microsoft Teams"
              }
            ]
          },
          {
            "type": "text",
            "value": " so your team is alerted whenever a run finishes, with UI Coverage results surfaced directly in the notification. For scheduled runs especially, this is what turns a nightly regression into an alert rather than a report no one opens. To send the report to a tool those integrations don't reach, the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/webhooks.md",
            "children": [
              {
                "type": "text",
                "value": "Cypress Cloud webhooks"
              }
            ]
          },
          {
            "type": "text",
            "value": " `run.uiCoverage.completed` event."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "Step 2: Catch regressions on each pull request"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "With a run recorded for every PR, compare it against the base branch to see the exact coverage impact of the change."
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "For a manual review, open "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/ui-coverage/guides/compare-reports.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Branch Review"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " and compare the PR run against your base branch. The report highlights new untested elements and links introduced by the change, so you can decide whether to add a test or ignore the element with configuration."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "To enforce a policy automatically, add a Results API check to CI that fails the build when new gaps appear. See "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/ui-coverage/guides/block-pull-requests.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Block pull requests and set policies"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": " for a status-check workflow and a baseline-comparison script that fails only on new untested elements."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "To surface the change in code review, connect a version control integration ("
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/github.md#Pull-request-comments",
                    "children": [
                      {
                        "type": "text",
                        "value": "GitHub"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/gitlab.md#Merge-Request-comments",
                    "children": [
                      {
                        "type": "text",
                        "value": "GitLab"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ", or "
                  },
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/cloud/integrations/bitbucket.md#Pull-Request-comments",
                    "children": [
                      {
                        "type": "text",
                        "value": "Bitbucket"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": "). Cypress Cloud comments on the pull request with the run summary and a link straight to Branch Review, putting the coverage comparison one click from the reviewer."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "Step 3: Investigate a specific change"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "When a monitoring run or a PR shows an unexpected shift, use "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/ui-coverage/guides/compare-reports.md",
            "children": [
              {
                "type": "text",
                "value": "Branch Review"
              }
            ]
          },
          {
            "type": "text",
            "value": " to pin down the cause. Its dropdowns let you compare any two runs, so you can:"
          }
        ]
      },
      {
        "type": "list",
        "ordered": false,
        "start": null,
        "spread": false,
        "children": [
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Compare a nightly run against the previous night's to catch drift in the application."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Step back through runs to find the exact commit that introduced a new untested element or link."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "text",
                    "value": "Confirm that a fix had the intended effect before sharing it with your team."
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "When you find a real gap, follow "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/ui-coverage/guides/address-coverage-gaps.md",
            "children": [
              {
                "type": "text",
                "value": "Address coverage gaps"
              }
            ]
          },
          {
            "type": "text",
            "value": " to close it."
          }
        ]
      },
      {
        "type": "heading",
        "depth": 2,
        "children": [
          {
            "type": "text",
            "value": "Step 4: Track trends across projects"
          }
        ]
      },
      {
        "type": "paragraph",
        "children": [
          {
            "type": "text",
            "value": "Individual comparisons answer \"what changed between these two runs?\" To answer \"how is coverage trending over weeks and months?\", use the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/features/analytics/enterprise-reporting.md#UI-Coverage",
            "children": [
              {
                "type": "text",
                "value": "Enterprise Reporting"
              }
            ]
          },
          {
            "type": "text",
            "value": " area of Cypress Cloud. It rolls trends up across every project in your organization, not just one, so you can view high-level UI Coverage trends across all projects and runs, download reports, or pull the data through the "
          },
          {
            "type": "link",
            "title": null,
            "url": "/llm/markdown/cloud/integrations/data-extract-api.md",
            "children": [
              {
                "type": "text",
                "value": "data extract API"
              }
            ]
          },
          {
            "type": "text",
            "value": " for your own dashboards."
          }
        ]
      },
      {
        "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/ui-coverage/guides/compare-reports.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Compare reports"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ": the full Branch Review workflow for diffing two runs."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/ui-coverage/guides/block-pull-requests.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Block pull requests and set policies"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ": automate the regression gate in CI."
                  }
                ]
              }
            ]
          },
          {
            "type": "listItem",
            "spread": false,
            "checked": null,
            "children": [
              {
                "type": "paragraph",
                "children": [
                  {
                    "type": "link",
                    "title": null,
                    "url": "/llm/markdown/ui-coverage/guides/address-coverage-gaps.md",
                    "children": [
                      {
                        "type": "text",
                        "value": "Address coverage gaps"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ": close the gaps your monitoring surfaces."
                  }
                ]
              }
            ]
          },
          {
            "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"
                      }
                    ]
                  },
                  {
                    "type": "text",
                    "value": ": send `run.uiCoverage.completed` when a UI Coverage report finishes processing."
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  "token_estimate": 945
}