An Android app that automatically monitors incoming bKash SMS messages and forwards them to a web application for payment verification and status updates...
- Automatic SMS Monitoring: Listens for incoming bKash SMS messages in real-time
- Automatic Forwarding: Sends payment information to your configured API endpoint
- Payment Tracking: View all forwarded payments with status tracking
- SMS Logs: Complete history of all SMS messages received
- Background Mode: Runs with a persistent notification so forwarding continues in the background
- Configurable Filters: Customize which SMS messages to forward
- Test Mode: Simulate SMS messages for testing without real transactions
- Secure: Uses HTTPS for forwarding; local data is encrypted at rest on your device
Real-time monitoring status, statistics, and control panel
View all forwarded payments with their current status
Complete history of all SMS messages processed by the app
Configure API endpoint, filters, and app preferences
- Node.js 18 or higher
- Expo CLI
- Android device or emulator (iOS not supported for SMS reading)
- Clone the repository:
git clone <repository-url>
cd sms-forwarder- Install dependencies:
npm install- Set up environment variables:
cp .env.example .envEdit .env with your Supabase credentials:
EXPO_PUBLIC_SUPABASE_URL=your-supabase-url
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
- Start the development server:
npm run devFor SMS reading functionality, you need to create a development build:
eas build --profile development --platform androidSee SMS_SETUP.md for detailed instructions.
If you want an installable APK for GitHub Releases (outside the Play Store), use the preview build profile. See docs/GITHUB_RELEASE.md for the full guide and CI setup.
- Grant Permissions: When you first open the app, grant SMS permissions
- Configure API: Go to Settings and set your API endpoint
- Configure Filters: Add bKash sender names and filter keywords
- Enable Monitoring: Go to Monitor tab and tap "Start Monitoring"
The app sends POST requests to your configured endpoint with this structure:
{
"senderPhone": "01812345678",
"amount": 1020,
"transactionId": "DAQ0HBV6EG",
"reference": "LUC006"
}Notes:
senderPhoneis extracted from the SMS when possible (e.g.from ...), otherwise falls back to the SMS sender label.referenceis extracted fromRef .../Reference ...if present.
Your API should respond with:
{
"success": true,
"paymentId": "uuid",
"message": "SMS forwarded successfully"
}If you are using this forwarder with Linkup, set:
apiEndpoint:https://<your-domain>/api/bkash/webhookcustomHeaders(optional but recommended):Authorization: Bearer <BKASH_WEBHOOK_SECRET>(or)x-bkash-webhook-secret: <BKASH_WEBHOOK_SECRET>
The app uses Supabase with the following tables:
id(uuid): Unique payment identifierreference_id(text): bKash transaction referenceamount(decimal): Payment amountsender(text): Sender phone numberstatus(text): Payment status (pending, received, verified)sms_content(text): Full SMS messagecreated_at(timestamp): Creation timeupdated_at(timestamp): Last update time
id(uuid): Unique log identifiersender(text): SMS sendercontent(text): SMS contentreceived_at(timestamp): When SMS was receivedpayment_id(uuid): Linked payment IDforwarded(boolean): Whether SMS was forwardedcreated_at(timestamp): Log creation time
Add keywords that should be present in SMS messages for them to be forwarded. Default keywords:
- bkash
- trxid
- transaction
Add sender names/numbers that the app should monitor. Default senders:
- bKash
- 16247
- bKash-Pay
Use the "Simulate Test SMS" button in the Monitor tab to test the app without receiving actual SMS messages. This sends a mock bKash payment SMS through the system.
- Expo Router: File-based routing with tabs
- React Native: UI components and native functionality
- AsyncStorage: Local configuration storage
- Supabase Client: Database queries and real-time updates
- PostgreSQL: Payment and log storage
- Row Level Security: Secure data access
- API Routes: Expo Router API endpoints
- Android receives SMS message
- SMS listener captures the message
- App checks if sender and content match filters
- App extracts payment information (reference ID, amount, sender)
- App forwards data to configured API endpoint
- API stores payment in database
- App logs the SMS in local database
- SMS permissions are required and must be granted by user
- All API communication uses HTTPS
- Database access is protected with Row Level Security
- SMS logs and configuration are stored locally, encrypted at rest, and can be cleared in Settings
- All payment processing happens on the backend
- Android Only: iOS doesn't allow apps to read SMS messages
- Development Build Required: Cannot run in Expo Go
- Permissions Required: User must grant SMS permissions (Play Store distribution may require default SMS app eligibility)
- Network Required: Must have internet connection to forward SMS
- Distribution: This app is intended for direct distribution, not the Play Store, due to SMS permission restrictions
- Persistent Notification: Android requires an ongoing notification for reliable background operation
- Check SMS permissions are granted
- Verify monitoring is enabled
- Check sender is in configured list
- Verify SMS contains filter keywords
- Check API endpoint is configured correctly
- Verify internet connection
- Check SMS Logs tab for error details
- Test API endpoint manually
- Check device logs:
adb logcat - Verify native module is properly installed
- Rebuild the app:
eas build
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License - see LICENSE file for details
For help and support:
- Open an issue on GitHub
- Check SMS_SETUP.md for setup instructions
- Review Expo documentation: https://docs.expo.dev
- Built with Expo and React Native
- Database powered by Supabase
- Icons from Lucide React Native