Case Study
TxtFlow
Turning any Android phone into a self-hosted SMS marketing gateway — no server, no API fees, no middleman.
The Problem
Small businesses in the Philippines — sari-sari stores, local clinics, small restaurants — need SMS marketing to reach customers. But the existing options are terrible for them:
- SMS API providers (Twilio, Semaphore, etc.) charge per message and require a backend server to integrate — way too expensive and complex for a small business sending 200 texts a month.
- Bulk SMS platforms come with monthly subscriptions, minimum volumes, and clunky dashboards built for enterprises, not a shop owner with a phone.
- Manual texting works but doesn't scale. Copy-pasting messages to 100 contacts is painful and error-prone.
The core insight: these businesses already have an Android phone with an active SIM and unlimited text promos. They just need software that lets them use it as a gateway.
The Solution
TxtFlow turns any Android phone into a self-hosted SMS marketing platform. No server needed. No per-message fees. No third-party API. Just install the app, import your contacts, write your campaign, and hit send — the phone does the rest using its native SMS capability.
Campaign Manager
Create, schedule, and send SMS campaigns to segmented contact lists. Supports personalization tokens and message templates.
Contact Management
Import contacts via CSV or manual entry. Tag and segment audiences for targeted messaging.
SMS Provider Pooling
Rotate across multiple SIM slots or devices to distribute sending load and avoid carrier throttling.
Delivery Tracking
Real-time status tracking for each message — sent, delivered, or failed — with campaign-level analytics.
Simple Marketing Dashboard
At-a-glance view of campaign performance, contact growth, and sending activity.
Zero Infrastructure
Everything runs on-device. No cloud server, no database hosting, no recurring costs beyond the phone plan.
Why Flutter?
This wasn't a typical "cross-platform for iOS and Android" decision. TxtFlow is Android-only by design — it relies on native SMS APIs that iOS simply doesn't expose. So why Flutter instead of native Kotlin?
Rapid Prototyping
Flutter's hot reload and widget system let me iterate on the UI extremely fast. For a solo project, speed to first usable version matters more than anything.
Platform Channel Access
Flutter's platform channels give full access to Android's native SMS Manager API. I get the best of both worlds — fast UI development with Dart, and native Android capabilities where needed.
Single Codebase Simplicity
Even though it's Android-only, Flutter keeps the codebase clean and maintainable. The declarative UI model is easier to reason about than XML layouts, especially for complex state like campaign progress tracking.
Future Flexibility
If TxtFlow ever expands to a companion web dashboard or desktop app, Flutter's multi-platform support makes that transition straightforward without rewriting the core logic.
Challenges
Carrier Throttling
Philippine carriers aggressively throttle bulk SMS from a single SIM. Sending 100+ messages in quick succession triggers rate limits or temporary blocks. I solved this with configurable send delays, SIM rotation across dual-SIM devices, and a queuing system that spaces messages intelligently.
Android Background Restrictions
Modern Android (10+) kills background processes aggressively to save battery. Keeping the SMS sending service alive during long campaigns required foreground service notifications, wake locks, and careful handling of Doze mode — all through Flutter platform channels.
Delivery Confirmation
Android's SMS delivery reports are unreliable — some carriers don't send them, others delay them significantly. I built a best-effort tracking system using broadcast receivers for sent/delivered intents, with timeout-based fallback status updates.
Data Privacy on Device
Since everything is on-device, data security is the user's responsibility. I implemented local encryption for contact lists and campaign data, with an optional PIN lock for the app. No data ever leaves the phone unless the user explicitly exports it.
Outcome
TxtFlow is live and being used by small businesses for local SMS marketing. The key wins:
- Zero recurring cost — businesses only pay for their existing phone plan
- No technical setup — install, import contacts, send
- Full data ownership — no third party ever sees the contact list or message content
- Privacy-first — everything stays on the device
What I Learned
- Constraints breed creativity. Not having a server forced a simpler, more resilient architecture.
- Platform channels in Flutter are powerful but require deep understanding of the native side. You can't abstract away Android's SMS permission model.
- For products targeting emerging markets, "works on a cheap phone with spotty internet" is a feature, not a limitation.
- Building for small businesses means the UX has to be dead simple. If it takes more than 3 taps to send a campaign, it's too complex.
Interested in this kind of work?
I build products that solve real problems with practical technology choices.