ANALYTICS SETUP - nself-org/nchat GitHub Wiki
Version: 0.8.0 Platform: iOS, Android, Electron, Web
This guide explains how to set up Firebase Analytics and Sentry for the nChat mobile and desktop apps.
- Prerequisites
- Firebase Setup
- Sentry Setup
- iOS Configuration
- Android Configuration
- Electron Configuration
- Environment Variables
- Testing
- Troubleshooting
- Firebase project created
- Sentry account created
- Node.js 20+ installed
- iOS: Xcode 15+ and CocoaPods
- Android: Android Studio and JDK 17
- Go to Firebase Console
- Click "Add project"
- Enter project name:
nchat-production(or your preferred name) - Enable Google Analytics (recommended)
- Choose or create Analytics account
- Click "Create project"
In Firebase Console:
- Analytics: Enabled by default
-
Crashlytics:
- Go to Crashlytics in left menu
- Click "Enable Crashlytics"
-
Performance Monitoring:
- Go to Performance in left menu
- Click "Get started"
-
Remote Config (optional):
- Go to Remote Config
- Click "Create configuration"
- Click "Add app" → iOS
- Enter iOS Bundle ID:
com.nself.nchat - Enter App nickname:
nChat iOS - Download
GoogleService-Info.plist - Save to:
platforms/capacitor/ios/App/App/GoogleService-Info.plist
- Click "Add app" → Android
- Enter package name:
io.nself.chat - Enter App nickname:
nChat Android - Download
google-services.json - Save to:
platforms/capacitor/android/app/google-services.json
- Click "Add app" → Web
- Enter App nickname:
nChat Web - Copy Firebase config object
- Add to
.env.local:
NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=your_measurement_id- Go to Sentry.io
- Click "Create Project"
- Select platform: "React Native" (for mobile) or "Electron" (for desktop)
- Enter project name:
nchat-mobileornchat-desktop - Copy the DSN
For better organization, create separate projects:
nchat-iosnchat-androidnchat-electronnchat-web
- Go to Settings → Account → API → Auth Tokens
- Click "Create New Token"
- Scopes required:
project:releasesproject:writeorg:read
- Copy the token
- Add to
sentry.properties
cd platforms/capacitor/ios/App
pod install- Open
platforms/capacitor/ios/App/App.xcworkspacein Xcode - Right-click on "App" folder
- Add Files to "App"
- Select
GoogleService-Info.plist - Ensure "Copy items if needed" is checked
- Add to "App" target
Edit platforms/capacitor/ios/App/App/Info.plist:
<key>SentryDSN</key>
<string>YOUR_SENTRY_DSN</string>Edit platforms/capacitor/ios/App/Podfile:
# Firebase
pod 'Firebase/Analytics'
pod 'Firebase/Crashlytics'
pod 'Firebase/Performance'
# Sentry
pod 'Sentry', :git => 'https://github.com/getsentry/sentry-cocoa.git', :tag => '8.17.2'Then run:
pod installIn Xcode:
- Select "App" target
- Build Phases → Add "Run Script"
- Add Firebase Crashlytics script:
"${PODS_ROOT}/FirebaseCrashlytics/run"- Add Sentry upload script:
export SENTRY_PROPERTIES=../sentry.properties
"${PODS_ROOT}/../../node_modules/@sentry/cli/bin/sentry-cli" upload-dif "$DWARF_DSYM_FOLDER_PATH"Copy google-services.json to:
platforms/capacitor/android/app/google-services.json
The build.gradle is already configured with:
- Firebase plugins
- Sentry plugin
- Required dependencies
Create platforms/capacitor/android/sentry.properties:
defaults.url=https://sentry.io/
defaults.org=YOUR_SENTRY_ORG
defaults.project=nchat-android
auth.token=YOUR_SENTRY_AUTH_TOKENIf using ProGuard, add to platforms/capacitor/android/app/proguard-rules.pro:
# Firebase
-keep class com.google.firebase.** { *; }
-keep class com.google.android.gms.** { *; }
# Sentry
-keepattributes LineNumberTable,SourceFile
-dontwarn org.slf4j.**
-dontwarn javax.**
-keep class io.sentry.** { *; }
npm install @sentry/electronCreate platforms/electron/main/sentry.ts:
import * as Sentry from '@sentry/electron/main'
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV,
release: `nchat@${process.env.APP_VERSION}`,
tracesSampleRate: 0.2,
})// At the top
require('./main/sentry')
// Rest of your codeCreate .env.local in project root:
# Firebase (Web)
NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=your_measurement_id
# Sentry
NEXT_PUBLIC_SENTRY_DSN=your_sentry_dsn
NEXT_PUBLIC_SENTRY_ORG=your_sentry_org
NEXT_PUBLIC_SENTRY_PROJECT=nchat
SENTRY_AUTH_TOKEN=your_auth_token
# Analytics
NEXT_PUBLIC_ANALYTICS_ENABLED=true
NEXT_PUBLIC_RELEASE_VERSION=0.8.0
# Performance
NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE=0.1
NEXT_PUBLIC_SENTRY_REPLAYS_SAMPLE_RATE=0.1Create src/lib/analytics/init.ts:
import { initializeAnalytics } from '@/lib/analytics'
export async function initAnalytics() {
await initializeAnalytics({
enabled: process.env.NEXT_PUBLIC_ANALYTICS_ENABLED === 'true',
providers: ['firebase', 'sentry'],
})
}In src/app/layout.tsx or main app component:
import { initAnalytics } from '@/lib/analytics/init'
useEffect(() => {
initAnalytics()
}, [])iOS:
- In Xcode, Edit Scheme → Run → Arguments
- Add argument:
-FIRDebugEnabled
Android:
adb shell setprop debug.firebase.analytics.app io.nself.chatFirebase:
- Open Firebase Console
- Go to Analytics → DebugView
- Should see events in real-time
Sentry:
- Open Sentry dashboard
- Go to Issues
- Trigger a test error:
import { sentryMobile } from '@/lib/analytics/sentry-mobile'
sentryMobile.captureMessage('Test message', 'info')iOS:
fatalError("Test crash")Android:
throw RuntimeException("Test crash")Should appear in Firebase Crashlytics and Sentry within a few minutes.
Issue: Events not appearing in Firebase Console
Solutions:
- Check
GoogleService-Info.plist/google-services.jsonis correctly placed - Verify app is in debug mode
- Wait up to 24 hours for production data
- Check DebugView for real-time events
Issue: Errors not appearing in Sentry
Solutions:
- Verify DSN is correct
- Check network connectivity
- Ensure Sentry is initialized before errors occur
- Check beforeSend filter isn't blocking events
Issue: Build fails with Firebase/Sentry errors
Solutions:
cd platforms/capacitor/ios/App
pod deintegrate
pod installIssue: Build fails with Firebase/Sentry errors
Solutions:
cd platforms/capacitor/android
./gradlew clean
./gradlew build --refresh-dependenciesIssue: User consent resets on app restart
Solutions:
- Check localStorage permissions
- Verify Capacitor Preferences plugin is installed
- Check for errors in console
- Always request consent before tracking
- Provide granular controls
- Respect user choices
- Be transparent about data collection
- Sample performance data (don't track 100%)
- Use appropriate sample rates:
- Production: 0.1 (10%)
- Staging: 0.5 (50%)
- Development: 1.0 (100%)
- Filter sensitive data from error reports
- Don't send passwords, tokens, API keys
- Scrub PII from breadcrumbs
- Use consistent naming conventions
- Follow Firebase event naming rules:
- Lowercase with underscores
- Max 40 characters
- No spaces or special characters
- Test on real devices, not just simulators
- Test in different network conditions
- Test opt-out functionality
- Test data export/deletion
For issues:
- Check Common Issues
- Search GitHub issues
- Contact: [email protected]