Summary: The 7Mind mobile app uses six different vendors across the analytics, attribution, engagement, error-tracking, feature-flag, and A/B-test layers. Some of them (Rudderstack, Braze) also appear on the backend side, which causes events to be emitted from both client and server. Sources: direct code inspection (pubspec.yaml, lib/app.dart, lib/features/core/data/services/configuration/, lib/features/core/data/services/analytics/ in 7mind-mobile-apps-monorepo) Last updated: 2026-05-15


What each vendor does

VendorPackageRole
Rudderstackrudder_sdk_flutter 3.3.0Primary CDP. Mirrors analytics events to downstream destinations. Backend also forwards events to Rudderstack from the analytics domain.
Adjustadjust_sdk 5.4.4Install attribution; also resolves shortlink URLs on iOS for deep linking. See mobile-deep-linking.
Brazebraze_plugin 16.0.0Engagement (in-app messages, push, lifecycle campaigns). Backend’s prevention domain also sends Braze email.
Sentrysentry_flutter 9.8.0Crash and error reporting.
ConfigCatconfigcat_client 4.1.1Feature flags. Used for e.g. isAuryEnabled, gradual rollouts.
Amplitude Experiment(no package; HTTP via lib/features/core/data/services/configuration/amplitude_configurations_provider.dart)Runtime A/B test variant assignment. Endpoint api.lab.amplitude.com (US) / api.lab.eu.amplitude.com (EU). Used for the aury-experiment test among others.
Firebasefirebase_core 3.15.0 + firebase_messaging 15.2.9Push transport only. No firebase_auth, no firebase_analytics.

Why ConfigCat and Amplitude both exist

ConfigCat handles boolean / value feature flags. Amplitude Experiment handles A/B test variant assignment that drives multi-arm experiments and is tied to Amplitude’s analytics-side cohort tooling. They are not redundant; treat ConfigCat as “is this feature on” and Amplitude as “which variant did this user land in”.

Cross-repo overlap

Two vendors have configurations on both the mobile app and elixir-backend:

  • Rudderstack: backend has separate write keys per brand (see dual-brand-routing); the mobile app only carries the 7Mind write key because only the 7Mind brand ships from this repo.
  • Braze: backend uses Braze for transactional and lifecycle emails from the prevention domain; the mobile app uses Braze for push and in-app messages. Both target the same Braze workspace but through different surfaces.

When debugging “why did this event arrive twice in Rudderstack?”, check whether both client and server are emitting it. This is intentional in some cases (client-side click vs server-side confirmation) and accidental in others.

Aury analytics

The Aury AI companion has dedicated tracking helpers in lib/features/core/data/services/analytics/ai_companion_analytics.dart: trackAuryChatOpened(), trackAuryChatClosed(), trackAuryConsentGiven(), etc. These funnel through Rudderstack. See aury-companion.

What agents should know

  • Never add a fourth analytics vendor without confirming the event taxonomy. Adding a new SDK that duplicates Rudderstack’s role is a known anti-pattern in this codebase.
  • When introducing a new feature flag, use ConfigCat (lib/features/core/data/services/configuration/feature_flags.dart). For an A/B test, use Amplitude Experiment via AmplitudeConfigurationsProvider.
  • Firebase Analytics is intentionally not installed. Do not introduce firebase_analytics to “track an extra event” — use Rudderstack instead.
  • Sentry is the only error sink. Don’t add a competing crash reporter.
  • Push notifications go through Firebase Messaging (FCM/APNs); Braze sits on top via its plugin.