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


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 ๐ก
Auto-capture device info - Users hate filling forms
Make image upload optional - But when they use it, it's gold
Use encouraging copy - "How can we make this better?" vs "Report bug"
Enable push notifications - Get alerted for critical issues immediately
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! ๐
Subscribe to my newsletter
Read articles from Nash9 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
