Production deployment checklist for Sentry integration.
Use when preparing a production deployment, auditing an existing
Sentry setup, or running a go-live readiness review.
Trigger: "sentry production checklist", "deploy sentry",
"sentry go-live", "audit sentry config", "production readiness sentry".
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Production deployment checklist for Sentry integration.
Use when preparing a production deployment, auditing an existing
Sentry setup, or running a go-live readiness review.
Trigger: "sentry production checklist", "deploy sentry",
"sentry go-live", "audit sentry config", "production readiness sentry".
Designed for Claude Code, also compatible with Codex and OpenClaw
Sentry Production Deployment Checklist
Overview
Walk through every production-critical Sentry configuration item before a deploy — SDK init options, source map uploads, alert routing, PII scrubbing, sample rate tuning, and test error verification. Covers @sentry/node (v8+) and sentry-cli workflows.
Use when:
Preparing a first production deploy with Sentry
Auditing an existing Sentry config after an incident
Running a go-live readiness review
Onboarding a new service into Sentry monitoring
Prerequisites
@sentry/node (or framework-specific SDK like @sentry/nextjs, @sentry/react) installed
Sentry project created with a dedicated production DSN (separate from dev/staging)
sentry-cli installed globally or as a devDependency (npm i -D @sentry/cli)
SENTRY_AUTH_TOKEN with scope project:releases available in CI environment
Build pipeline that produces source maps
Instructions
Work through each section in order. Check off each item as you verify it.
Step 1 — DSN and Environment Variables
DSN set via environment variable, not hardcoded in source code
// CORRECT — DSN from environmentSentry.init({
dsn: process.env.SENTRY_DSN,
});
// WRONG — hardcoded DSN leaks project ID and org infoSentry.init({
dsn: 'https://abc123@o456.ingest.sentry.io/789',
});
Verify with: grep -r "ingest.sentry.io" src/ --include="*.ts" --include="*.js" — should return zero results.
SENTRY_DSN set in production environment (not just .env.local)
SENTRY_ORG and SENTRY_PROJECT set for CLI operations
The release value must match exactly what you pass to sentry-cli releases new. Mismatches break source map resolution and release health tracking.
Step 4 — Error Sample Rate
sampleRate tuned — not 1.0 in high-traffic production
Sentry.init({
// For most apps: 0.1 to 0.25 captures enough to spot trends// without burning through your event quotasampleRate: 0.25, // 25% of errors captured// For low-traffic apps or critical services, 1.0 is fine// sampleRate: 1.0,
});
Traffic level
Recommended sampleRate
< 10K errors/day
1.0
10K-100K errors/day
0.25
> 100K errors/day
0.1
Step 5 — Traces Sample Rate
tracesSampleRate tuned (0.05-0.2 for production)
Sentry.init({
tracesSampleRate: 0.1, // 10% of transactions traced// Or use tracesSampler for endpoint-specific ratestracesSampler: (samplingContext) => {
const name = samplingContext.transactionContext?.name || '';
// Never trace health checksif (name.includes('/health') || name.includes('/ready')) return0;
// Always trace paymentsif (name.includes('/checkout') || name.includes('/payment')) return1.0;
// Default: 10%return0.1;
},
});
Never ship tracesSampleRate: 1.0 in production — it generates massive event volume and will exhaust your quota within hours on any real workload.
Step 6 — Source Map Upload
Source maps uploaded via sentry-cli releases files
#!/bin/bash# Run in CI after build, before deployset -euo pipefail
VERSION="${SENTRY_RELEASE:-$(git rev-parse --short HEAD)}"# Create the release
sentry-cli releases new "$VERSION"# Associate commits for suspect commits feature
sentry-cli releases set-commits "$VERSION" --auto
# Upload source maps from build output
sentry-cli releases files "$VERSION" upload-sourcemaps ./dist \
--url-prefix '~/static/js' \
--validate
# Mark release as deployed
sentry-cli releases finalize "$VERSION"
sentry-cli releases deploys "$VERSION" new -e production
--url-prefix matches the path where assets are served (e.g., ~/static/js or ~/assets)
--validate flag is used to catch malformed maps at build time
Source maps are NOT served to browsers (add to .gitignore or strip from deploy artifact)
Verify upload succeeded:
sentry-cli releases files "$VERSION" list
# Should show .js and .js.map files with correct paths
Step 7 — beforeSend Noise Filter
beforeSend configured to drop noise
Sentry.init({
beforeSend(event, hint) {
const error = hint?.originalException;
const message = typeof error === 'string' ? error : error?.message || '';
// Drop browser noise that is never actionableconst noise = [
'ResizeObserver loop',
'Non-Error promise rejection captured',
/Loading chunk \d+ failed/,
'Network request failed',
'AbortError',
'TypeError: cancelled',
'TypeError: Failed to fetch',
];
for (const pattern of noise) {
if (pattern instanceofRegExp ? pattern.test(message) : message.includes(pattern)) {
returnnull; // Drop this event
}
}
// Scrub auth headers if they leak into request contextif (event.request?.headers) {
delete event.request.headers['Authorization'];
delete event.request.headers['Cookie'];
delete event.request.headers['X-API-Key'];
}
return event;
},
});
Step 8 — PII Scrubbing
PII scrubbing enabled: sendDefaultPii: false
Sentry.init({
sendDefaultPii: false, // Do NOT send cookies, user IPs, or auth headers// If you need user context, set it explicitly with scrubbed data// Sentry.setUser({ id: user.id }); // ID only, no email/name
});
Also verify in Sentry project settings:
Settings > Security & Privacy > Data Scrubbing is enabled
IP Address collection is disabled if not needed
Sensitive Fields list includes your app-specific fields (e.g., ssn, creditCard)
Step 9 — Alert Rules
Alert rules configured for production environment
Set up these minimum alert rules in Alerts > Create Alert Rule:
Alert
Type
Condition
Action
New issue in production
Issue
First seen, environment:production
Slack channel + email
Regression detected
Issue
Regressed, environment:production
Slack channel
Error spike
Metric
Error count > N in 5 min
PagerDuty (on-call)
P95 latency breach
Metric
p95(transaction.duration) > threshold
Slack #performance
Crash-free rate drop
Release health
Crash-free sessions < 99%
Email + Slack
Alert actions route to correct channels (not a dead channel)
PagerDuty / OpsGenie integration tested with a test alert
Step 10 — Process Exit Flush (Serverless / CLI)
Sentry.flush() called before process exit
For serverless functions, CLI tools, or any short-lived process, events may be lost if the process exits before the SDK flushes its queue: