How I Built a Unified Feedback System for Multiple Flutter Apps Using Firebase

Nash9Nash9
3 min read

TL;DR: Created a reusable Flutter feedback component with Firebase backend that centralizes user feedback across all my apps. One codebase, multiple collections, unified dashboard.

The Problem ๐Ÿค”

Managing feedback across multiple Flutter apps was a nightmare. Users would email bugs, leave cryptic App Store reviews, or just silently uninstall. I needed a solution that would:

  • Capture feedback directly in-app

  • Work across all my Flutter projects

  • Give me centralized analytics

  • Require minimal setup per new app

The Architecture ๐Ÿ—๏ธ

Backend: Firebase Firestore with separate collections per app Frontend: Reusable Flutter feedback widget Dashboard: Custom Flutter Web app for unified viewing

โ”œโ”€โ”€ app1_feedback (collection)
โ”œโ”€โ”€ app2_feedback (collection) 
โ”œโ”€โ”€ app3_feedback (collection)
โ””โ”€โ”€ unified_dashboard (Flutter Web)

Implementation Deep Dive ๐Ÿ’ป

The Reusable Feedback Service

class FeedbackService {
  // Only this line changes per app ๐ŸŽฏ
  static const String collectionName = 'myapp_feedback';

  static Future<void> submitFeedback({
    required String message,
    required String category, // 'feature_request' or 'bug_report'
    String? imageUrl,
  }) async {
    final packageInfo = await PackageInfo.fromPlatform();
    final deviceInfo = await DeviceInfoPlugin().androidInfo;

    await FirebaseFirestore.instance
        .collection(collectionName)
        .add({
      'message': message,
      'category': category,
      'timestamp': FieldValue.serverTimestamp(),
      'appVersion': packageInfo.version,
      'buildNumber': packageInfo.buildNumber,
      'deviceModel': deviceInfo.model,
      'androidVersion': deviceInfo.version.release,
      'userId': FirebaseAuth.instance.currentUser?.uid,
      'imageUrl': imageUrl,
    });
  }
}

UI That Actually Gets Used

The secret sauce is in the UX. I learned that complex forms kill adoption rates.

My approach:

  • Simple category selection (Feature Request vs Bug Report)

  • Encouraging placeholder: "How can we make the app even better?"

  • Optional image attachment for visual bugs

  • Placed under Settings โ†’ Support โ†’ Feedback

The Custom Dashboard

Built with Flutter Web, my dashboard aggregates data from all collections:

class FeedbackDashboard extends StatelessWidget {
  final List<String> appCollections = [
    'app1_feedback',
    'app2_feedback', 
    'app3_feedback'
  ];

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<QuerySnapshot>>(
      stream: CombineLatestStream.list(
        appCollections.map((collection) =>
          FirebaseFirestore.instance
            .collection(collection)
            .orderBy('timestamp', descending: true)
            .snapshots()
        ).toList(),
      ),
      builder: (context, snapshot) {
        // Merge and display all feedback
        return FeedbackList(allFeedback: mergedData);
      },
    );
  }
}

Game-Changing Insights ๐Ÿ“Š

Cross-app pattern recognition: The same UI confusion appearing in 3 different apps led to a complete design system overhaul.

Proactive bug fixing: Performance issues reported in one app helped me fix similar code in others before users noticed.

Better prioritization: Seeing feedback volume across all apps helps decide which issues to tackle first.

Firestore Document Structure

{
  "message": "The save button doesn't work on my Galaxy S21",
  "category": "bug_report",
  "timestamp": "2024-01-15T10:30:00Z",
  "appVersion": "2.1.0",
  "buildNumber": "42",
  "deviceModel": "SM-G991B",
  "androidVersion": "13",
  "userId": "user123",
  "imageUrl": "gs://bucket/feedback_images/img_001.jpg"
}

Pro Tips for Implementation ๐Ÿ’ก

  1. Auto-capture device info - Users hate filling forms

  2. Make image upload optional - But when they use it, it's gold

  3. Use encouraging copy - "How can we make this better?" vs "Report bug"

  4. Enable push notifications - Get alerted for critical issues immediately

  5. Close the feedback loop - Follow up when you fix reported issues

Firebase Security Rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{appName}_feedback/{document} {
      allow read, write: if request.auth != null;
      allow create: if true; // Allow anonymous feedback
    }
  }
}

The Results ๐Ÿ“ˆ

  • 80% reduction in app store complaints about unaddressed bugs

  • 3x increase in actionable feedback vs email reports

  • Hours saved weekly from centralized triage

  • Better user retention through responsive issue resolution

Next Steps

Planning to add:

  • Automatic sentiment analysis using Cloud Functions

  • Integration with Linear/GitHub issues

  • User notification system for bug fix updates

  • A/B testing different feedback prompts


What's your approach to handling user feedback across multiple apps? Drop a comment below! ๐Ÿ‘‡

0
Subscribe to my newsletter

Read articles from Nash9 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Nash9
Nash9