Skip to content

App Monitoring

ShipFlutter includes a complete monitoring setup using:

  1. Firebase Google Analytics for user behavior
  2. Performance Monitoring for app performance
  3. Firebase Crashlytics for crash reporting

The monitoring module is privacy-focused and requires explicit user consent before collecting any data.

Setup

Enable and setup each service in the Firebase Console:

  1. Analytics Dashboard
  2. Performance Dashboard
  3. Crashlytics Dashboard

All monitoring features require explicit user consent. The consent system includes:

class UserConsent {
bool analyticsStorage; // Basic analytics
bool adUserData; // User data for ads
bool adPersonalization; // Personalized ads
bool adStorage; // Ad storage
bool functionalityStorage; // App functionality
bool personalizationStorage; // Personalization
bool securityStorage; // Security features
bool errorsData; // Error reporting
}

Analytics Service

The MonitoringService handles analytics, performance monitoring, and crash reporting:

// Log custom event
await monitoringService.instance.logEvent(
'button_click',
parameters: {'button_id': 'submit'},
);
// Log purchase
await monitoringService.instance.logPurchase(
currency: 'USD',
value: 9.99,
items: ['premium'],
);

Route Tracking

The AnalyticsRouteObserver automatically tracks screen views and its already added in the navigator:

class AnalyticsRouteObserver extends RouteObserver<ModalRoute<dynamic>> {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
if (route.settings.name != null) {
monitoringService.instance.logEvent(route.settings.name!);
}
}
}

The consent flow is managed by the ConsentController:

  1. Check for existing consent:

    final hasConsent = await monitoringService.instance.hasUserConsent();
  2. Show consent banner if needed:

    if (!hasConsent) {
    showConsentBanner(context);
    }
  3. Update consent settings:

    await monitoringService.instance.setUserConsent(
    UserConsent(
    analyticsStorage: true,
    errorsData: true,
    ),
    );
  4. Features are enabled based on consent:

    final consent = await monitoringService.instance.getUserConsent();
    if (consent.analyticsStorage) {
    // Enable Analytics
    }