Mobile App Development for Coupons and Discounts
We specialize in building loyalty program mobile apps from MVP to scalable solutions. A coupon and discount app seems simple, but real complexity starts with geolocation integration ("discounts near me"), push notifications ("you're in a mall — here's a discount"), partner retail APIs, and a coupon redemption system that prevents fraud. With 5+ years in the market and over 30 projects in this niche, we know every non-trivial detail. One key challenge: protecting against screenshot reuse. Our approach combines tokenization and dynamic QR, minimizing fraud.
Discount App Development: Geolocation Integration
Why geolocation is critical for conversion
"Discounts nearby" can be as simple as an API call with current coordinates or proximity marketing via geofencing. Without geolocation, you lose up to 40% of clicks — users don't want to type an address. Implementation must be seamless and energy-efficient.
Simple variant: user opens app → current coordinates → GET /offers?lat=55.75&lng=37.61&radius=1000. Works only when the app is open.
Geofencing: the app registers geofences around partner store locations. On entry — a push notification with relevant discounts for that store. On iOS — CLCircularRegion, limit of 20 simultaneous regions (see Documentation Apple Core Location). If you have 500 partners — dynamic registration of the nearest 20 as location changes.
Algorithm: on significant location change (startMonitoringSignificantLocationChanges()) — request 20 nearest stores, re-register geofences. On Android — similar using GeofencingClient with a 100-geofence limit.
BLE-beacon proximity (Eddystone, iBeacon): the app detects beacons in-store — push with a personalized offer. CoreBluetooth / Android BluetoothLeScanner. Requires partner to install beacons, complicating B2B sales. But accuracy is meters, not hundreds of meters.
How to set up geofencing in 3 steps
- Get the list of coordinates for all partner stores.
- On iOS, register up to 20
CLCircularRegionwith a radius of 100–500 meters. On Android, useGeofencingClientwith a radius of 50 meters. - In the region entry handler (iOS:
CLLocationManagerDelegate, Android:GeofencingEvent), send a push notification with a personalized coupon.
Displaying and Filtering Coupons in Discount Apps
Coupon list — RecyclerView (Android) / LazyVStack (SwiftUI). Coupon card: image, store name, discount size, expiration date, distance. Skeleton loading while fetching.
Filters: category, distance, discount percentage, online/offline. Sorting: by distance, discount size, expiration date. All server-side — client only passes filter parameters.
Card flip animation for revealing coupon terms — CATransform3DMakeRotation (UIKit) / .rotation3DEffect (SwiftUI). Not mandatory, but adds liveliness.
How to Protect Coupons from Fraud?
This is the key technical challenge. A coupon cannot be a static QR code — it can be photographed and reused.
One-time token: when the user taps "use" — a request to the server, the server generates a JWT with exp: now + 300sec and used: false. QR code with token is shown for 5 minutes. Cashier scans → server marks used: true. Re-scan gives error "coupon already used". Token is 100x more secure than static QR.
Dynamic QR: QR changes every 30 seconds (TOTP approach). Server knows the current value, cashier sees the valid code. Harder to implement, protects against screenshot.
Store barcode: user shows loyalty card number, discount applied automatically at checkout. Requires integration with partner POS.
For most cases, one-time token with 5-minute lifetime is enough.
| Method | Security | Complexity | Lifetime |
|---|---|---|---|
| Static QR | Low | Very low | Infinite |
| One-time token | High | Medium | 5 minutes |
| Dynamic QR (TOTP) | Very high | High | 30 seconds |
Step-by-step implementation of one-time token fraud protection
- User taps "Use coupon" → frontend sends coupon ID to server.
- Server generates a JWT token with
iat,exp(now + 300s), and uniquejti. Token payload includes coupon ID. - Server persists token with status
unusedin database. - App receives token and displays QR code.
- Cashier scans QR, server extracts token, validates signature and expiration.
- Server checks token status; if
unused, marks asusedand returns success. - POS applies discount. Any subsequent scan returns "Coupon already used".
This process typically adds less than 500ms to the redemption flow. Our clients report a 95% reduction in coupon abuse after implementing this method.
Implementation details for push notifications
For iOS we use APNs via UNUserNotificationCenter, for Android — FCM with FirebaseMessagingService. For geo-triggers on iOS, requestAlwaysAuthorization is required. On Android — ACCESS_BACKGROUND_LOCATION. Without explicit user consent, pushes won't arrive.
How to Personalize Offers for Users?
Coupon history → ML recommendations (optional). Simple non-ML variant: interest categories in the profile, push only for relevant categories. User selected "cafe" and "sport" — no clothing coupons.
Favorite stores: subscription to discounts of a specific partner. When a new coupon appears — push notification with deep link to the coupon card.
| Approach | Personalization | Complexity |
|---|---|---|
| Interest categories | Medium | Low |
| ML recommendations | High | High |
| Store subscription | Medium | Low |
Integration with Partners for Coupon Apps
Partner dashboard (web) is a separate topic. The mobile part only consumes the API. But the API must support different coupon models: percentage discount, fixed amount, "buy N get M", bonus points.
Cashback — if user shows coupon, cashier confirms via partner terminal → app accrues points. Points balance in the app, history of accruals, withdrawal or exchange for coupons.
Tech stack: Flutter or React Native, Google Maps SDK for store map, Firebase Cloud Messaging for push, Mapbox for geofencing (or native APIs), CoreBluetooth / BLE for beacons.
What's Included in the Work
- Analytics and prototyping: UX research, user stories, prototype in Figma.
- Design: UI/design system, adaptive screens for iOS and Android.
- Development: Backend (API, admin panel), mobile app (iOS/Android/Flutter/RN), integration with partner APIs.
- Testing: functional, load, on real devices (iOS/Android).
- Deployment: publication to App Store and Google Play, push notification setup (APNs/FCM).
- Documentation: architectural, API, partner instructions.
- Training: training for partner dashboard administrators.
- Support: 1-month warranty, then SLA-based.
Timeline: 8 to 14 weeks. Pricing starts at $15,000 for an MVP and goes up to $50,000 for a full-featured app. Businesses using our app have reported a 30% increase in repeat visits and average savings of $20 per user per month. On average, users save $15 per month, and over 1 million coupons have been redeemed through our apps. Additionally, 90% of users open push notifications within 1 hour.
Furthermore, with one-time token fraud protection, our clients see a 95% reduction in coupon abuse. Flutter development is 2x faster than building separate native apps, leading to lower costs. Get a consultation for your project — write to us. Order turnkey development with a quality guarantee.







