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
| Vendor | Package | Role |
|---|---|---|
| Rudderstack | rudder_sdk_flutter 3.3.0 | Primary CDP. Mirrors analytics events to downstream destinations. Backend also forwards events to Rudderstack from the analytics domain. |
| Adjust | adjust_sdk 5.4.4 | Install attribution; also resolves shortlink URLs on iOS for deep linking. See mobile-deep-linking. |
| Braze | braze_plugin 16.0.0 | Engagement (in-app messages, push, lifecycle campaigns). Backend’s prevention domain also sends Braze email. |
| Sentry | sentry_flutter 9.8.0 | Crash and error reporting. |
| ConfigCat | configcat_client 4.1.1 | Feature 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. |
| Firebase | firebase_core 3.15.0 + firebase_messaging 15.2.9 | Push 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
preventiondomain; 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 viaAmplitudeConfigurationsProvider. - Firebase Analytics is intentionally not installed. Do not introduce
firebase_analyticsto “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.
Related
- 7mind-mobile-apps-monorepo — the repo this lives in
- elixir-backend — the other side of the Rudderstack and Braze configurations
- dual-brand-routing — why backend keys are per-brand but mobile keys are not
- mobile-deep-linking — Adjust’s shortlink resolver role
- aury-companion — the feature that exercises both ConfigCat and Amplitude