Netlify integration

Netlify uptime, deploy tracking and analytics

BugOtter imports every Netlify site with a token it uses once and never stores. Uptime checks start on each domain right away. Netlify's deploy webhook marks each production deploy, so errors and outages say which deploy they started after. Analytics and browser errors come from one script tag.

  • Used onceimport token, never stored
  • 1 webhookmarks every production deploy
  • 3 regionscheck each domain
The BugOtter otter plugging in a cable

Import every site with a token used once

  1. Create a personal access token

    In Netlify, open User settings → Applications, then Personal access tokens → New access token. Name it “BugOtter import”, with a short expiry.
  2. Paste it in BugOtter

    Click Import from Netlify. You see every site across your teams, with its custom domain when it has one, or its netlify.app address.
  3. Pick the sites to watch

    Checks start right away from US East, Europe and US West. SSL and domain expiry are watched too. The token is then forgotten: delete it in Netlify if you like.
BugOtter uptime for one app: 30 days of daily bars with two amber days, the response time chart, and the latest check from US East, Europe and US West
  1. 30 days at a glance. Amber marks a day with some downtime.
  2. Response time, median and p95, with the slowest region named.
  3. Three regions. An outage only counts when two agree.
Uptime for one site: an outage only counts when two of the three regions agree.

Mark every production deploy with Netlify's webhook

  1. Copy your deploy webhook

    Each app's page in BugOtter has a webhook URL like https://bugotter.com/api/123/deploys?key=…. The key is the app's upload key, so treat the URL as a secret.
  2. Add it as a deploy notification

    In the site's Project configuration → Notifications → Deploy notifications, add an HTTP POST request on Deploy succeeded and paste the URL. Leave the signing secret empty.
  3. Deploy once to see it

    Netlify sends the deploy when it's live on the CDN. BugOtter records the commit, its title and the deploy URL, only for the production context.

From then on, issues say “started 4 min after deploy c0ffee1”

Release health compares each deploy with the one before: errors, new error types, and resolved errors that came back.
BugOtter's deploy check for v1.8.1 saying it looks fine, above the error inbox with a new ChunkLoadError seen 9 times by 1 person
  1. Deploy check. After each Netlify deploy: new errors, error rate, speed and sales against the day before.
  2. New errors name their release, so you know which change to look at.
  3. Who it hit: events and people, per issue.
Each deploy gets a check, and each issue names the release it started in.

Analytics past ad blockers, with Netlify redirects

Ad blockers drop 20–40% of visitors for most analytics. A Netlify rewrite with status 200 serves BugOtter from your own domain.

netlify.toml
# netlify.toml
[[redirects]]
  from = "/_bo/bo.js"
  to = "https://bugotter.com/bo.js"
  status = 200
  force = true

[[redirects]]
  from = "/_bo/api/collect"
  to = "https://bugotter.com/api/collect?via=YOUR_PROXY_KEY"
  status = 200
  force = true

[[redirects]]
  from = "/_bo/api/errors"
  to = "https://bugotter.com/api/errors?via=YOUR_PROXY_KEY"
  status = 200
  force = true

netlify.toml sits at the root of your repository, so it works whatever your framework builds into. If you prefer _redirects, it has to end up in the publish folder:

_redirects
# _redirects (in your publish folder, e.g. public/ for Vite and Astro)
/_bo/bo.js         https://bugotter.com/bo.js  200!
/_bo/api/collect   https://bugotter.com/api/collect?via=YOUR_PROXY_KEY  200!
/_bo/api/errors    https://bugotter.com/api/errors?via=YOUR_PROXY_KEY  200!

Then use src="/_bo/bo.js" on the script tag.

Netlify passes query strings through on rewrites, and the ?via= key in the target is what tells BugOtter the visit came through your proxy.

Check it once: curl -sI https://yourapp.com/_bo/bo.js should answer 200. Your proxy key is on the app's Traffic tab in BugOtter. Keep the ?via= part: it proves visits came through your proxy, and it only lives in server config, never in the page.

BugOtter's visitors chart for the last 7 days, with the previous period as a dashed line and markers for big payments and an error spike
  1. Visitors, against the period before (the dashed line).
  2. Markers for big payments, error spikes and deploys.
  3. Bots kept out of the count.
Traffic for one site, counted past ad blockers.

Errors and source maps on Netlify

Browser errors arrive with the script. For server code, use the Sentry SDK for your framework (Next.js, Astro, SvelteKit, Nuxt, React Router) with your BugOtter DSN.

For plain Netlify Functions, @sentry/node is enough. Flush before returning, since a function can be paused as soon as it answers:

netlify/functions/checkout.mts
// netlify/functions/checkout.mts
import * as Sentry from "@sentry/node";

Sentry.init({
  dsn: process.env.BUGOTTER_DSN,
  dataCollection: { userInfo: false, cookies: false, httpBodies: [], databaseQueryData: false },
});

export default async (req: Request) => {
  try {
    return await handle(req);
  } catch (e) {
    Sentry.captureException(e);
    await Sentry.flush(2000); // send before the function is frozen
    return new Response("Something went wrong", { status: 500 });
  }
};

Add the keys under Project configuration → Environment variables, or from the CLI. Scope BUGOTTER_KEY to builds only.

terminal
netlify env:set BUGOTTER_DSN "https://…@bugotter.com/123"
netlify env:set BUGOTTER_PROJECT 123
netlify env:set BUGOTTER_KEY "…"   # the upload key: builds only, never in browser code

Then add the upload to your build command, after the build: npm run build && npx bugotter sourcemaps dist --delete (use your framework's output folder).

The CLI tags the maps with Netlify's COMMIT_REF by itself, and --delete keeps .map files out of the deploy.

A status page for your Netlify site

Netlify's own status page tells you about Netlify. Yours should tell your users about your site: the home page, the signup form, and any function your app can't work without.

Add each as a check, with an expected status, word or JSON value, so an error page that answers 200 still fails.

  • Turn on the status page and it lives at bugotter.com/status/your-site, with uptime, incidents and your updates. Never errors or revenue.
  • Pro can serve it from your own domain, like status.yoursite.com.
  • People can subscribe to updates, and a badge shows your uptime in the README.
  • Netlify Scheduled Functions can call a heartbeat URL when they finish, so a run that's late or fails alerts you.
A BugOtter public status page: all systems operational, uptime bars for Website, Docs and API, and a resolved partial outage with its updates
  1. One line for your users: all good, or what isn't.
  2. Uptime per check, day by day.
  3. Incidents and your updates. Never errors, logs or revenue.
A public status page from the live demo.

Or ask your coding agent

Connect BugOtter to Claude Code, Cursor or Codex once over MCP. It signs in through your browser, read-only unless you allow changes. Then paste one line.

Claude Code, once
claude mcp add --transport http --scope user bugotter https://bugotter.com/api/mcp

Then ask, in plain words:

  • Add the BugOtter ad-blocker redirects to netlify.toml and switch the script tag to /_bo/bo.js.

  • Add BugOtter source map upload to this site's Netlify build command, using the right output folder for our framework.

  • Using BugOtter, what changed in errors and traffic since our last Netlify deploy?

Cursor, VS Code, Codex and the rest have their own one-step setup at Docs: your agent (MCP). Every setup screen in BugOtter also has a Copy prompt for your agent button with your keys filled in.

Questions

Does BugOtter keep my Netlify token?

No. It's used once, to list your sites while you pick, and never stored. Netlify personal access tokens can't be limited to reading, so give it the shortest expiry Netlify offers, or delete it right after the import.

Are deploy previews and branch deploys tracked?

No. The webhook only records deploys whose context is production. If you do want a branch, add &branch=staging (or any name) to the webhook URL and that branch's deploys count too.

Why a webhook and not the API?

So BugOtter doesn't have to keep a token with full access to your Netlify account. Netlify sends the deploy to BugOtter when it's live, with its commit, title and URL, and the upload key in the webhook URL proves it's yours.

Do visitor countries work through the Netlify proxy?

Usually, but not always. Netlify doesn't promise to pass on the visitor's address when it proxies, so on some sites the country shows Netlify's region. Visits, pages, sources and revenue aren't affected.

Does it work for Next.js on Netlify?

Yes. Use the Next.js rewrites from the Next.js page for the proxy, or the netlify.toml rules here; either works. Deploy tracking with the webhook is the same for every framework.

Can I check a Netlify site that's password protected?

Add the check with a header. Each uptime check can send headers, like a basic auth or a bypass token, and expect a status, a word or a JSON value.

Sources

Checked Nov 4, 2026 against Netlify's docs on access tokens, deploy notifications, rewrites and proxies and build environment variables. BugOtter isn't affiliated with Netlify.

Watch every app you ship, from one calm list.

14 days of everything, no card needed. Plans from $10 a month, billed yearly.