| name | sentry-miniapp-sdk |
| description | Full Sentry SDK setup for Mini Programs โ error monitoring, tracing, offline cache, source maps. Supports WeChat, Alipay, ByteDance, Baidu, QQ, DingTalk, Kuaishou and cross-platform frameworks (Taro / uni-app). |
| license | MIT |
| category | sdk-setup |
| disable-model-invocation | false |
Sentry Mini Program SDK Setup
Set up Sentry error monitoring, performance tracing, and offline caching in mini program projects using sentry-miniapp โ a community SDK built on @sentry/core v10.
Invoke This Skill When
- User mentions mini program, miniapp, ๅฐ็จๅบ, WeChat, Alipay, ByteDance, Taro, uni-app alongside Sentry
- User wants to add error monitoring or performance tracking to a mini program
- User asks about Sentry support for WeChat/Alipay/ByteDance mini programs
- User imports or references
sentry-miniapp in their project
Note: SDK versions and APIs reflect the current sentry-miniapp docs. Always verify against the sentry-miniapp README before implementing.
Phase 1: Detect
Run these commands to understand the project:
ls app.json project.config.json mini.project.json 2>/dev/null
cat app.json 2>/dev/null | head -20
cat package.json 2>/dev/null | grep -E '"@tarojs/|"@dcloudio/uni-|"sentry-miniapp"'
grep -r "sentry" package.json 2>/dev/null
grep -r "Sentry.init" app.js app.ts src/app.js src/app.ts 2>/dev/null
ls app.js app.ts src/app.js src/app.ts 2>/dev/null
ls yarn.lock pnpm-lock.yaml package-lock.json 2>/dev/null
What to determine:
| Question | Impact |
|---|
| Which mini program platform? | Determines platform option and API differences |
| Native or cross-platform framework (Taro/uni-app)? | Determines init pattern and build config |
Is sentry-miniapp already installed? | Skip install if present, check version |
| Where is the app entry point? | Determines where to place Sentry.init() |
| Is there a build tool config (webpack/vite)? | Needed for Source Map setup |
Platform Detection Guide
| File Present | Platform |
|---|
project.config.json | WeChat (ๅพฎไฟก) |
mini.project.json | Alipay (ๆฏไปๅฎ) |
project.tt.json | ByteDance (ๅญ่่ทณๅจ) |
project.swan.json | Baidu (็พๅบฆ) |
project.qq.json | QQ |
@tarojs/* in package.json | Taro (cross-platform) |
@dcloudio/uni-* in package.json | uni-app (cross-platform) |
Phase 2: Recommend
Present this recommendation based on detection results:
Recommended (core coverage):
- โ
Error Monitoring โ always. Automatic capture of
onError, onUnhandledRejection, onPageNotFound, onMemoryWarning
- โ
Performance Tracing โ always. Navigation timing, render performance, resource loading, custom spans
Recommended for production:
- โก Source Map Upload โ when deploying to production. Maps minified stack traces back to source code
- โก Offline Cache โ when users are on unreliable networks. Caches events locally, retries when connectivity returns
Optional:
- โก Distributed Tracing โ when mini program calls backend APIs. Injects
sentry-trace/baggage headers to link frontend and backend spans
- โก User Feedback โ when you want to collect user-reported issues via
Sentry.captureFeedback()
| Feature | Recommend when... |
|---|
| Error Monitoring | Always โ zero-config automatic exception capture |
| Performance Tracing | Always โ automatic page/network/render performance |
| Source Map | Production โ required to read minified stack traces |
| Offline Cache | Weak networks โ mobile users, rural areas |
| Distributed Tracing | API calls โ mini program talks to backend services |
| User Feedback | User-facing โ collect bug reports from end users |
Phase 3: Guide
Step 1: Install
npm install sentry-miniapp
yarn add sentry-miniapp
Step 2: Initialize
Create or modify the app entry point. Sentry.init() must be called before App().
Native Mini Program (app.js)
const Sentry = require('sentry-miniapp');
Sentry.init({
dsn: 'https://<key>@<org>.ingest.sentry.io/<project>',
release: 'my-miniapp@1.0.0',
environment: 'production',
});
App({
});
Taro (app.js or app.ts)
import * as Sentry from 'sentry-miniapp';
Sentry.init({
dsn: 'https://<key>@<org>.ingest.sentry.io/<project>',
release: 'my-miniapp@1.0.0',
environment: 'production',
});
uni-app (App.vue or main.js)
const Sentry = require('sentry-miniapp');
Sentry.init({
dsn: 'https://<key>@<org>.ingest.sentry.io/<project>',
release: 'my-miniapp@1.0.0',
environment: 'production',
});
Step 3: Configure Platform (if needed)
The SDK auto-detects the platform at runtime. No explicit platform option is required in most cases.
If you need to force a specific platform:
Sentry.init({
dsn: '...',
platform: 'wechat',
});
Step 4: Add User Context
Sentry.setUser({
id: 'user-123',
username: 'zhang_san',
});
Sentry.setTag('page', 'payment');
Sentry.setContext('order', { orderId: '2024001', amount: 99.9 });
Minigame (ๅฐๆธธๆ)
WeChat / ByteDance minigames have no App() / Page() / routing, so the page-based integrations (PageBreadcrumbs, Session) cannot work there. The SDK detects minigames via crossPlatform.isMinigame() and switches to dedicated integrations โ enabled by default only in a minigame runtime, and a safe no-op in a regular mini program:
MinigameIntegration (enableMinigameLifecycle) โ reads the launch scene (scene / path / query) from getLaunchOptionsSync(), measures cold-start time (SDK init โ first frame), and logs onShow / onHide foreground/background breadcrumbs.
FrameRateIntegration (enableMinigameFrameRate) โ samples the global requestAnimationFrame to estimate FPS and jank. Mini programs use a two-thread model with no logic-layer requestAnimationFrame, so this safely no-ops there.
No extra wiring is needed โ Sentry.init() auto-enables these in a minigame. To force them on or off:
Sentry.init({
dsn: '...',
enableMinigameLifecycle: true,
enableMinigameFrameRate: true,
});
For Each Agreed Feature
Walk through features one at a time. Load the corresponding reference file:
| Feature | Reference | Load when... |
|---|
| Error Monitoring | ${SKILL_ROOT}/references/error-monitoring.md | Always |
| Performance Tracing | ${SKILL_ROOT}/references/tracing.md | User agreed to tracing |
| Offline Cache | ${SKILL_ROOT}/references/offline-cache.md | User agreed to offline cache |
| Source Map | ${SKILL_ROOT}/references/sourcemap.md | User agreed to source maps |
Configuration Reference
Key Init Options
| Option | Type | Default | Description |
|---|
dsn | string | โ | Sentry DSN (required) |
release | string | โ | Release version, must match source map upload |
environment | string | โ | Environment name (production, staging, etc.) |
sampleRate | number | 1.0 | Error event sample rate (0.0โ1.0) |
tracesSampleRate | number | โ | Trace sample rate (0.0โ1.0) |
tracesSampler | function | โ | Dynamic sampling function (overrides tracesSampleRate) |
enableSourceMap | boolean | true | Auto-normalize stack trace paths for source map resolution |
enableOfflineCache | boolean | true | Cache events when offline, retry when back online |
offlineCacheLimit | number | 30 | Max events to store in offline cache |
offlineCacheMaxAge | number | 86400000 | Drop cached events older than this (ms); default 24h |
requireConsent | boolean | false | Gate outbound Sentry network sends until Sentry.setConsent(true) |
consentCacheLimit | number | 100 | Max events buffered before consent; preserves oldest cold-start data |
consentCacheMaxBytes | number | 921600 | Max consent-buffer bytes; default ~900KB due miniapp single-key storage limits |
consentCacheMaxAge | number | 86400000 | Drop consent-buffered events older than this (ms); default 24h |
onConsentCacheDrop | function | โ | Called with { reason, dropped } when consent buffer drops events |
enableTracePropagation | boolean | true | Inject sentry-trace/baggage headers in outgoing requests |
tracePropagationTargets | Array | [] | URL patterns for trace header injection (empty = all) |
enableAutoSessionTracking | boolean | true | Automatic session lifecycle management |
enableConsoleBreadcrumbs | boolean | false | Capture console.log/warn/error as breadcrumbs |
traceNetworkBody | boolean | false | Capture request/response body in network breadcrumbs |
enableNavigationBreadcrumbs | boolean | true | Page lifecycle (navigation) breadcrumbs |
enableUserInteractionBreadcrumbs | boolean | true | Tap / user-interaction breadcrumbs |
enableNetworkStatusMonitoring | boolean | true | Real-time network monitoring; triggers offline flush on reconnect |
allowUrls | Array<string|RegExp> | โ | Only send errors whose URL matches (others dropped) |
denyUrls | Array<string|RegExp> | โ | Drop errors whose URL matches |
ignoreErrors | Array<string|RegExp> | โ | Drop errors whose message/type matches |
enableMinigameLifecycle | boolean | minigame true / miniprogram false | Minigame cold-start + scene + show/hide breadcrumbs |
enableMinigameFrameRate | boolean | minigame true / miniprogram false | Minigame FPS / jank sampling (no-op in mini program) |
beforeSend | function | โ | Event processor for filtering/modifying events |
beforeBreadcrumb | function | โ | Hook to filter/modify breadcrumbs before they are attached |
Privacy Consent Gate
For domestic mini program / mini game privacy flows, initialize with requireConsent: true. Before the user agrees, the SDK still collects errors, breadcrumbs, and performance data, but sends no Sentry network requests; events are buffered in miniapp storage and flushed after consent.
Sentry.init({
dsn: '...',
requireConsent: true,
consentCacheLimit: 100,
});
Sentry.setConsent(true);
Sentry.setConsent(false);
requireConsent implies local buffering even when enableOfflineCache is false; custom transport functions are wrapped by the consent gate too. The current store uses one storage key, so keep consentCacheMaxBytes near the default ~900KB unless the SDK adds sharded storage in a future version.
Platform Compatibility
| Feature | WeChat | Alipay | ByteDance | Baidu | QQ | DingTalk | Kuaishou |
|---|
| Error Capture | โ
| โ
| โ
| โ
| โ
| โ
| โ
|
| Performance | โ
| โ
| โ
| โ
| โ
| โ
| โ
|
| Offline Cache | โ
| โ
| โ
| โ
| โ
| โ
| โ
|
| Distributed Tracing | โ
| โ
| โ
| โ
| โ
| โ
| โ
|
| Session Tracking | โ
| โ
| โ
| โ
| โ
| โ
| โ
|
| Source Map | โ
| โ
| โ
| โ
| โ
| โ
| โ
|
โ
= supported through the SDK's cross-platform abstraction, not a per-host on-device certification. WeChat / Alipay / ByteDance are the most battle-tested; validate less common hosts (Kuaishou, DingTalk) in your own environment before relying on them in production.
Verification
After setup, verify the integration:
- Trigger a test error:
Sentry.captureException(new Error('Test error from mini program'));
-
Check Sentry dashboard:
- Go to your Sentry project โ Issues
- You should see the test error with:
- Device info (brand, model, OS)
- Mini program context (platform, SDK version)
- Breadcrumbs (page navigation, network requests)
-
Verify automatic capture works:
- Throw an unhandled error in a page โ it should appear in Sentry without any manual
captureException call
Phase 4: Cross-Link
After mini program setup, check for companion services:
ls -d ../*/package.json ../*/requirements.txt ../*/go.mod ../*/Gemfile 2>/dev/null
Tip: Enable distributed tracing on both mini program and backend to get end-to-end request traces across services.
Troubleshooting
| Issue | Solution |
|---|
| Events not appearing in Sentry | Check DSN is correct; verify Sentry domain is in mini program's trusted domain list |
sampleRate filtering all events | Ensure sampleRate is not set to 0; default is 1.0 |
| Tracing spans not appearing | Set tracesSampleRate > 0 (or use tracesSampler) โ tracing is off until set; there is no default |
| Minified stack traces | Set up Source Map upload โ see ${SKILL_ROOT}/references/sourcemap.md |
| Duplicate error reports | Do NOT manually call Sentry.captureException in onError โ SDK captures automatically |
| Events lost on weak networks | Enable offline cache: enableOfflineCache: true (default) |
WeChat DevTools not triggering onError | Test on a real device; DevTools may not trigger all error handlers |
| Stack trace paths don't match source maps | Ensure --url-prefix "app:///" when uploading; SDK normalizes paths to app:/// automatically |