Petition apps face a critical challenge: ensuring each signature comes from a unique, verified individual. Without robust verification, the platform loses credibility and legal weight. We build petition apps with multi-layered verification to prevent fraud and ensure authenticity. Our experience launching 15+ civic applications guarantees compliance with App Store Review Guidelines and Google Play Console policies. With over 5 years of experience and 15+ successful civic apps, we deliver robust solutions.
This article covers mobile petition app development with signature verification.
Signature Verification: Core of Mobile Petition App Development
Signatures on a petition carry legal and public significance. One signature = one verified person—this requirement must be addressed at multiple levels. Phone auth is 2x faster than email in terms of processing time, but email is 30% cheaper. We combine methods to balance speed and cost.
Phone verification. SMS with OTP via Twilio Verify or Firebase Phone Auth. One number—one signature per petition. FirebaseAuth.verifyPhoneNumber() on the client, server-side check of uid from Firebase token. Protection against automated registrations: rate limiting at the API gateway level (max 3 requests per minute from one IP to the verification endpoint).
Email verification as an additional layer. sendEmailVerification() in Firebase Auth. Unverified email means no signing rights.
Biometric confirmation for repeated signatures: if a user signs multiple petitions in a row, we ask for confirmation via Face ID / Touch ID (LocalAuthentication.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)). This reduces the risk of accidental or automated actions.
On Android—BiometricPrompt from androidx.biometric. Always check BiometricManager.canAuthenticate(BIOMETRIC_STRONG) before showing—on emulators and some devices without a sensor, it's not SUCCESS. Apple Developer Documentation: Local Authentication and Android Developers: Biometric Authentication.
| Method | Processing Time | Cost (per 1000 signatures) | Reliability |
|---|---|---|---|
| Phone OTP | 15 sec | $5 | High |
| 30 sec | $0.1 | Medium | |
| Biometric | 2 sec | $0 | Very High |
Case Study: Handling 50,000 Signatures in a Week
For a recent civic initiative, we delivered a petition app that needed to process 50,000 verified signatures within seven days. We implemented phone OTP with strict rate limiting and biometric confirmation for repeat signers. The system handled the load with 99.9% uptime and zero fraudulent signatures. User onboarding time dropped from 30 seconds to 15 seconds by combining phone and biometric methods.Signing UX and Technical Details
The signature form has minimal fields: name, location (optional, with consent), email or phone. Long forms reduce conversion. On Android autofillHints in TextInputLayout fills data from the password manager.
Signature is saved immediately via URLSession / OkHttp with optimistic counter update on the UI. If the request fails, we roll back the counter and show a retry. Duplication on the server is prevented by a unique index (petition_id, user_id) in PostgreSQL—even if the client sends two simultaneous requests.
Real-time signature counter—WebSocket or Server-Sent Events. SSE is simpler: URLSessionStreamTask (iOS) or EventSource library (Android). When thresholds (1000, 10000, 100000 signatures) are reached, push notification via FCM topic to all subscribers.
What You Need for a Quick Start
MVP launch in 3 weeks:
- Requirements gathering and prototype
- Core feature development (petition list, signing, verification)
- Integration with Firebase Auth and database
- Testing and store publication
| Stage | Duration |
|---|---|
| MVP (list + signing + verification) | 3-5 weeks |
| Full version (creation, moderation, real-time, sharing) | 2-3 months |
| Technical support after release | from 1 month |
Creating a Petition
Editor—title, description (rich text via UITextView with basic formatting or Lexical in WebView), cover image, category, target number of signatures, recipient (organization, deputy, company).
Moderation before publication—queue in admin panel. Statuses: draft → pending_moderation → published / rejected. Authors receive push on status change.
Progress and Deadline
Progress bar towards signature goal—UIProgressView (iOS) / LinearProgressIndicator (Compose). Petition deadline—DateComponentsFormatter for displaying "3 days left", CountdownTimer on screen counting last hours.
After the deadline, petition status changes to closed. If target reached—status successful, batch notification to all signers encouraging them to share the result.
Sharing
Petition must be easily shareable. Dynamic links (Firebase Dynamic Links or Branch.io) open the specific petition in the app or on a web page—via UIActivityViewController (iOS) or Intent.ACTION_SEND (Android). Open Graph tags for preview in messengers—on the web page side.
What's Included in the Work
- Requirements analysis and UI/UX design
- iOS (SwiftUI) and Android (Jetpack Compose) development
- Verification integration (phone, email, biometrics)
- Real-time signature counter and push notifications
- App Store and Google Play publication
- 1 month of technical support
Timelines
Petition list + viewing + signing with phone verification—3 to 5 weeks. Creating petitions + moderation + real-time counter + sharing—2 to 3 months. Cost is calculated after requirements analysis. Our standard MVP cost is $12,000–$18,000 for both platforms. Get a consultation—contact us for project estimation.







