ScreenshotNeo

BlogHow-to

How to Monitor a Website with Screenshot Checks from Multiple Locations

Build scheduled browser checks that verify important page states from multiple regions, save useful failure evidence, and distinguish visual changes from real outages.

By the ScreenshotNeo team4 October 20269 min read

To monitor a website with screenshot checks from multiple locations, run the same scheduled browser check from regions that represent your users, assert that the expected page or journey succeeds, and save screenshots with other diagnostics when it fails. A screenshot is evidence of what rendered; pair it with an assertion such as “the main heading is visible” or “checkout reached its confirmation state.” A screenshot by itself cannot tell you whether the page is usable.

This guide builds a self-managed check with Playwright, explains how to run it from multiple regions, and covers baselines, failure investigation, reliability, cost, and hosted alternatives. For official guidance, see Playwright visual comparisons, Datadog browser testing, and Checkly synthetic monitoring.

1. Decide what the check must prove

Start with one critical page or journey and a clear pass condition. Examples include the landing page’s main heading appearing, a sign-in flow reaching an authenticated state, or a checkout flow reaching its confirmation page. Keep the initial check narrow: if it fails, the result should point to a meaningful problem.

Use two kinds of evidence:

  • Functional assertions: confirm an expected element, URL, or success state exists. These catch failures even when a screenshot looks superficially normal.
  • Screenshots: show what the browser rendered, either for visual comparison against an approved baseline or for investigation after a failure.

Decide which regions matter by looking at where your users are and where your infrastructure or dependencies could behave differently. Run the same check in each selected region and inspect results by region; a single aggregate status can hide a regional issue. There is no universally correct number of regions or schedule. Choose based on the consequence of a missed failure and the cost of running checks.

2. Create a repeatable Playwright check

This example uses Playwright Test to verify a page heading and compare a screenshot to an approved baseline. The browser, viewport, and runner should stay consistent between baseline creation and monitoring runs.

import { test, expect } from '@playwright/test';

test('homepage is available and visually stable', async ({ page }) => {
  await page.setViewportSize({ width: 1440, height: 900 });
  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });

  await expect(page.getByRole('heading', { name: 'Example Domain' })).toBeVisible();
  await expect(page).toHaveScreenshot('homepage.png', {
    fullPage: true,
    animations: 'disabled'
  });
});

Save this as a test file such as tests/homepage.spec.ts. Install Playwright Test and its browser, then run the test in your deployment or monitoring runner:

npm init playwright@latest
npx playwright test tests/homepage.spec.ts

On the first run, Playwright creates a baseline image for the screenshot assertion. Review that image before accepting it as the expected state. A later run fails the visual comparison if the rendered image differs beyond the configured comparison behavior. Consult the Playwright screenshot comparison documentation for snapshot updates, comparison settings, and project configuration.

The example uses a public sample page. Replace the URL and heading with the page and state you own or are authorized to monitor. For an authenticated journey, use a test account and store its credentials in your runner’s secret store rather than committing them in the test.

3. Run the check from multiple locations

A local Playwright run comes from the machine where it executes. To get regional coverage, schedule the same test on runners located in the regions that matter, or use a hosted synthetic-monitoring service that runs browser tests from selected locations. The researched documentation describes managed and private locations in Datadog and scheduled global checks in Checkly; verify each provider’s current location and runner options before choosing.

  1. Choose the regions based on your audience and relevant network paths.
  2. Run the identical test, browser version, viewport, and configuration in every region.
  3. Record the region with each result and artifact so a regional failure is easy to isolate.
  4. Schedule runs at a cadence that fits the impact of an outage and the noise and cost you can tolerate.
  5. Route failures to the people responsible for the application, with enough context to investigate.

For a self-managed approach, you are responsible for placing and maintaining runners in the required regions, scheduling runs, storing artifacts, and routing alerts. This dossier does not establish a particular self-hosted multi-region architecture. Hosted services can reduce that operational work, but compare their documented location coverage, private-location support, browser options, artifact retention, scheduling controls, and pricing directly.

4. Make screenshot comparisons dependable

Screenshot comparisons are sensitive to the environment. Playwright warns that rendering can vary with the host operating system, browser version, settings, hardware, power source, and headless mode. Keep those settings stable between baseline generation and monitoring, and review proposed baseline changes deliberately. See Playwright’s visual comparison guidance.

  • Use a fixed viewport: responsive layouts can change substantially at different dimensions.
  • Keep the browser and operating system stable: upgrades can change rendering and create visual diffs.
  • Control animation: disable it for a stable screenshot when motion is not what you are monitoring.
  • Account for dynamic content: timestamps, rotating banners, personalized data, and random content can make snapshots noisy. Prefer a stable test environment or assert the important state separately.
  • Choose screenshot scope intentionally: a full-page capture covers content below the fold but can be more sensitive to page length and lazy loading. A viewport capture is narrower and often easier to interpret.
  • Review, then update baselines: do not accept a changed image automatically without deciding whether the change is expected.

Do not treat every pixel difference as an outage. A changed font, browser update, or legitimate content release can alter an image while the service remains available. The functional assertion and the screenshot together help separate those cases.

5. Capture evidence that explains a failure

When a check fails, inspect the screenshot alongside the failed assertion. Then determine whether the failure occurred in one region or across all regions, whether the page loaded slowly or incompletely, and whether the image reflects an expected release. Keep the run’s timestamp, region, browser configuration, and test output with its artifacts.

Hosted products describe additional diagnostics: Checkly lists screenshots, video, traces, console logs, and network requests; Datadog documents browser-test results and performance details by location. These are product descriptions, not independent evaluations, and the available evidence depends on the selected product and configuration. See Checkly’s synthetic monitoring overview and Datadog’s browser test guide.

6. Choose a self-managed or hosted setup

Approach Useful when Responsibilities or questions
Playwright Test on your own runners You need control over the test code and runner environment. You operate the runners in each region, schedule runs, keep browsers stable, store artifacts, and route alerts.
Hosted synthetic monitoring You want a service to schedule browser checks and provide managed locations or diagnostics. Compare region coverage, private-location options, supported browsers, test reuse, artifact retention, scheduling, alert controls, pricing, and operational burden.

Datadog documents managed and private locations, browser tests, and periodic runs. Checkly describes scheduled Playwright monitoring across global locations. Those pages are primary sources for their respective product capabilities; they do not establish a neutral product ranking or comparative pricing. Check current vendor documentation for the exact plans and options you need.

7. Performance, reliability, and cost

Keep the check focused

Every additional page, browser, region, or frequent run adds execution work and more results to review. Start with the most consequential page or journey, then expand when a specific risk justifies it. Use a cadence tied to how quickly you need to detect a problem rather than assuming one interval suits every site.

Reduce false alarms

Stable browser configuration, deliberate baseline updates, and assertions for the important page state make results easier to trust. If a check fails, compare other regions and review the available artifacts before deciding whether the issue is regional, site-wide, or a visual change.

Budget for operations

For self-managed monitoring, account for runner hosting, browser maintenance, scheduling, artifact storage, and alert handling. For hosted monitoring, check current pricing and what the plan includes; pricing was not established in the research for this article. Also consider the engineering time spent investigating noisy checks. A cheap run can still be costly if its signal is poor.

8. Troubleshooting common failures

Symptom Likely cause What to do
Heading assertion fails The page did not reach the expected state, the text changed, or the selector is too specific. Inspect the screenshot and test output. Confirm the expected text and choose a locator tied to the intended state.
Screenshot diff appears after a runner change Browser, operating system, headless mode, hardware, or other rendering settings changed. Restore the previous configuration or review the new baseline under the intended stable environment. Playwright documents these sources of rendering variation.
Only one region fails The issue may be regional or related to a path, dependency, or runner configuration that differs there. Compare that region’s screenshot and diagnostics with successful regions; verify that browser and test settings are actually identical.
Intermittent visual differences Dynamic content, animation, timing, or inconsistent page state may affect the capture. Disable animation where appropriate, wait for the relevant state, stabilize test data, and assert the critical state independently.
Page screenshot is incomplete Navigation or page content may not have finished loading when capture occurred. Wait for the meaningful page state before capturing; use a specific element assertion rather than relying only on a generic load event.
Too many alerts for harmless changes The test may compare unstable areas or use a baseline that was not reviewed after intended releases. Narrow the capture or stabilize the content, keep functional and visual signals distinct, and update the baseline only after review.
No useful evidence after a failure The setup may retain only pass/fail status or discard run artifacts. Configure the runner or hosted service to retain screenshots and relevant traces, logs, network details, or video where available.

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server for developers. It can capture a URL as PNG, JPEG, WebP, or PDF. One GET request takes a screenshot; for monitoring, schedule the request from the regions you need and record the result with the region and time. A screenshot request does not replace a browser assertion about your application’s critical state.

Cookie banners are accepted and 60+ known consent platforms, newsletter popups, and chat widgets are removed before the shot; each step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing, and responses identify the page verdict and billing status in headers. The MCP server gives AI agents tools to take screenshots, get page information, and capture PDFs. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

See the ScreenshotNeo API documentation for request options and setup. Create a free account for 1,000 screenshots a month with no card.

FAQ

How many locations should I monitor from?

Use regions that represent your audience or a meaningful network risk. Add coverage when it answers a concrete question; there is no universal number.

Should every screenshot difference page someone?

Usually, decide based on whether the difference also violates an important user-facing expectation. Review visual changes with the functional result and run artifacts.

Can screenshots alone prove the site is healthy?

No. They show rendered output, while assertions verify the page or journey reached the state you care about.

How often should checks run?

Set the interval according to the impact of an undetected failure and the volume of checks and alerts your team can manage. The cited sources do not prescribe one cadence for all sites.