Implementing a Feedback Form in Mobile Apps
A feedback form is a channel through which developers receive information about problems before they appear in App Store reviews. A user who finds where to write directly in the app is less likely to leave a 1-star review publicly. But a poorly implemented form—with slow loading or text loss on screen rotation—is worse than no form.
Implementation Essentials
State Preservation
A user wrote three paragraphs, got a call, returned to the app—and the text disappeared. This breaks the willingness to write. On iOS, save the draft in UserDefaults with each change:
textView.delegate = self
func textViewDidChange(_ textView: UITextView) {
UserDefaults.standard.set(textView.text, forKey: "feedback_draft")
}
Upon opening the form, restore. Clear only after successful submission.
Auto-Attaching Diagnostics
An empty "everything is broken" message is useless to developers. On submission, automatically attach context: app version, OS version, device model, user ID (if logged in). Users don't fill this—data is collected programmatically.
// Android: generate metadata for submission
val metadata = mapOf(
"app_version" to BuildConfig.VERSION_NAME,
"os_version" to Build.VERSION.RELEASE,
"device_model" to "${Build.MANUFACTURER} ${Build.MODEL}",
"user_id" to userRepository.getCurrentUserId()
)
Message Delivery
Sending methods depend on infrastructure:
- SMTP via backend—most common, support receives email
- Webhook to Slack/Telegram—convenient for small teams, immediate visibility
- Helpdesk integration (Zendesk, Freshdesk)—for products with dedicated support
Avoid direct email from mobile via MFMailComposeViewController (iOS) or Intent.ACTION_SENDTO (Android)—depends on mail client availability and doesn't provide centralized storage.
Receipt Confirmation
After sending—simple notification: "Message received, we'll reply within 24 hours." If the form doubles as support, generate a ticket ID and let users track status.
Workflow
Define form purpose: collect UX feedback, report bugs, contact support, or combination. This determines field set and routing.
Design UI: one text field + category (optional) + submit button. Users don't fill complex 10-field forms.
Implement with draft preservation, auto-metadata collection, and selected delivery channel.
Test: network loss during submission, very long text, special characters.
Timeline Estimates
Simple form with email submission—1–2 days. Form with helpdesk integration, categorization, and request history—3–5 days.







