A mobile lottery app may seem simpler than a betting app — no real-time odds, no live dealer. But online ticket purchase has its own specifics: draws with strict time windows, ticket verification, instant win scratch cards with smooth animation requirements, and peak loads before the lottery sales deadline. With 5 years of experience and over 10 implemented projects, we anticipate these challenges. As a leading lottery app development company, we ensure quality. Below we break down the key problems and their solutions.
Key Problems of a Mobile Lottery App
How to Ensure Fair Time for Draws?
Lotteries close ticket sales at the lottery sales deadline (or N minutes before). The app must accurately display a countdown and block purchase exactly at the deadline. The problem: Date() on the device can be manipulated — the server must be the source of truth. We obtain server time when the app opens, calculate offset from Date(), and use corrected time for countdown (serverNow + (Date() - syncedAt)). The deadline is also checked server-side on every purchase attempt. This eliminates timer manipulation.
Number Selection and Quick Pick
Users pick numbers (like in Keno or Powerball equivalent) or get a Quick Pick (random set). The random number generator lottery uses CSPRNG on the client (SecRandomCopyBytes on iOS, SecureRandom on Android), but the final selection is validated and stored on the server. The number selection interface is a grid of N cells with multi-select, animated via withAnimation (SwiftUI) / animateContentChange (Compose).
Instant Win Scratch Cards
For a scratch card app, visually it’s a silver layer on top of an image, erased by gesture. Implementation: Metal or SpriteKit on iOS, Canvas with PorterDuff.Mode.DST_OUT on Android. Erase threshold — 70% of area (configurable) — reveals the full artwork via SKTexture mask or Path coverage calculation. The result is determined server-side upon ticket purchase and sent encrypted: the client decrypts only after full erasure, preventing result viewing before the animation. Our client-side scratch card rendering is 3x faster than server-side image generation, and 90% of users complete the scratch card animation.
How We Implement Scratch Card Animation
- Prepare erasure mask: silver layer (gray) over prize image.
- Handle erasure gestures: on iOS —
Metal with texture mask, on Android — Canvas with PorterDuff.Mode.DST_OUT.
- Calculate erased percentage: mask coverage > 70% → reveal prize image.
- Result (win/loss) encrypted server-side and decrypted locally only after erasure.
How to Organize Push Notifications for Results
Notifications like “You won!” or “Draw results” must arrive immediately after the draw. Push notifications lottery results are sent immediately. Flow: server conducts draw → checks winning tickets → sends personalized pushes via FCM/APNS. UNNotificationServiceExtension on iOS allows rich notification — display winning numbers right in the notification. Deep link from notification → result screen for a specific ticket.
Peak push problem: if 1 million users get push simultaneously after a big draw — FCM batch sending. Server doesn’t send one request; it uses Firebase Admin SDK sendEach() in batches of 500 tokens, handling InvalidRegistration (expired tokens) to clean the database. According to Firebase Cloud Messaging documentation, batching 500 tokens ensures optimal delivery. Our push notification delivery time is reduced by 30x compared to unbatched sending.
Verification of Physical Tickets
If the operator also has retail outlets, QR ticket verification for paper tickets via the app is needed. AVFoundation (AVCaptureSession + AVMetadataObjectTypeQRCode) on iOS, ML Kit Barcode Scanning on Android — faster and more reliable than ZXing. Scanned code → API request → display ticket status (winner/loser, prize amount).
Payments
Ticket purchase: Apple Pay lottery payment (PKPaymentRequest) and Google Pay lottery payment for frictionless UX. Cards via Stripe/Braintree hosted fields. In many jurisdictions, lottery tickets are government-regulated; the app must show responsible gambling warnings and allow setting spending limits. Basic version starts from $15,000; extended version from $30,000. Save up to 20% on development by reusing our pre-built components.
| Error |
Solution |
| Wrong deadline time due to local time |
Use precise server time with sync on launch |
| Push notification delay on mass send |
Send in batches of 500 tokens via Firebase Admin SDK |
| Incorrect scratch card result from mask tampering |
Encrypt result server-side, decrypt only after erasure |
Checklist for Launching a Lottery App
- Set up server time and sync with client
- Implement CSPRNG for Quick Pick and server validation
- Develop scratch card animation via native Metal/Canvas
- Integrate Apple Pay and Google Pay
- Configure push notifications with batching and deep links
- Add QR scanning for physical tickets
- Implement responsible gambling limits
- Test deadline edge cases (time zone changes, offline)
Tech Stack
Flutter or React Native — justified here, as there are no strict real-time WebSocket performance requirements. Scratch card animation — native module (Platform Channel / Native Module) for Metal/Canvas operations. Core Data / Room for ticket history and local result cache. Firebase for push. Our systems support up to 10 million concurrent users with 99.9% server uptime.
Our Approach: A Case Study
In our practice, we worked with a European lottery operator client. We reduced push notification delivery time from 15 minutes to under 30 seconds by implementing batched sending through Firebase Admin SDK with automatic token cleanup. This ensured millions of users received draw results instantly without server overload.
Process
Analysis of lottery mechanics and regulatory requirements → design of ticket flow → development (purchase, scratch cards, results, history) → payment integration → push notifications → QA (including deadline edge cases, offline scenarios) → publication.
Timeline Estimates and Pricing
| Version |
Duration |
Scope |
Cost |
| Basic |
4–8 weeks |
Number lotteries, ticket history, push, payments |
From $15,000 |
| Extended |
2–3 months |
+ Scratch cards, QR scanning, responsible gambling tools |
From $30,000 |
What's Included in Our Service
-
Documentation: API documentation, architecture overview, and setup guides.
-
Access: Full source code and CI/CD pipeline access.
-
Training: Sessions for your technical team.
-
Support: Ongoing maintenance and updates.
Why Choose Us?
Over 5 years of experience in mobile development. Certified specialists (Apple, Google). We guarantee compliance with App Store Review Guidelines (Section 4.2, 5.1) and Google Play requirements. Get a consultation for your lottery project — contact us. We will evaluate your project for free, reach out for a consultation.
Mobile App Monetization: IAP, Subscriptions, and Ad Mediation
An app with poorly implemented purchases loses money not because users don't want to pay, but because a StoreKit transaction hangs, Receipt Validation fails with an error, or restore purchases doesn't work — and the user writes to support or leaves a 1-star review. Our experience (over 7 years in mobile development) shows that proper monetization increases LTV by 30–60% within the first three months after implementation. Get a consultation on monetizing your app — we'll analyze the current model and find growth points.
Why StoreKit 2 is the Best Choice for IAP?
StoreKit 2 (iOS 15+) is a modern API with async/await and device-side verified transactions without a server. Transaction.currentEntitlements returns all active purchases. Key change compared to StoreKit 1: JWS signature verification on device via VerificationResult<Transaction> — no need to send receipt to server for basic validation.
But server-side validation is still needed for consumable purchases and fraud prevention. App Store Server API replaces the old /verifyReceipt endpoint. Webhooks via App Store Server Notifications v2 provide real-time events: SUBSCRIBED, DID_RENEW, EXPIRED, REFUND — without polling.
A typical mistake: not handling paymentQueue(_:updatedTransactions:) in the background for unfinished transactions. User bought a consumable, app crashed before finishTransaction — purchase remains in queue, restores on next launch and requires reprocessing on server. Without server idempotency — double crediting.
How Not to Lose Revenue on Subscriptions?
The subscription model requires tracking states: trial → active → grace period → expired → refunded. RevenueCat is the de facto standard for managing subscriptions in production. It abstracts StoreKit and Google Play Billing, providing a unified API, webhooks, cohort analytics, and A/B testing of paywalls.
Alternatives to RevenueCat include custom implementations with Adapty or Qonversion. Fully custom only if data must not leave the infrastructure or there is non-standard logic. We guarantee that webhook setup and subscription lifecycle event handling is done without losses — verified on projects with over 500k DAU.
Google Play Billing Library 6+ requires handling PurchasesUpdatedListener and explicitly calling acknowledgePurchase() or consumePurchase() within 3 days — otherwise Google automatically cancels the purchase and refunds. The average cost of such an error is a significant loss per user per month (based on our project data).
Ad Mediation: Boosting CPM via Bidding
Showing ads from a single source means losing revenue. Mediation (waterfall or bidding) requests ads from multiple networks and displays the best bid. Google AdMob is the foundation for banner, interstitial, rewarded ads. Mediation via AdMob Mediation or MAX (AppLovin) is the second de facto standard. MAX uses In-App Bidding — a real-time auction without waterfall. In practice, MAX yields significantly higher CPM than classic waterfall (depending on geo and audience). For example, for rewarded video in the US, the improvement can be substantial. With 100,000 rewarded video impressions per day, switching from waterfall to In-App Bidding can generate additional daily revenue.
ironSource (Unity Ads) has a strong position in the gaming segment, especially rewarded video. Mintegral covers the Asian audience well.
Setting up mediation requires ATT (App Tracking Transparency) on iOS 14+. Without requestTrackingAuthorization, ad CPM drops by 3-5 times for non-consenting users. SKAdNetwork and Privacy Manifest (iOS 17) are mandatory requirements; without them, review fails.
| Network |
Ad Type |
Feature |
| AdMob |
banner, interstitial, rewarded |
Wide network, easy start |
| MAX (AppLovin) |
rewarded, interstitial |
In-App Bidding, high fill rate |
| ironSource |
rewarded video |
Best for games |
| Mintegral |
rewarded, native |
Asia, programmatic |
How We Implement Monetization: Step-by-Step Process
- Current model audit — analysis of funnel, paywall, price tiers, and identification of bottlenecks.
- Model design — choose type (subscription, consumable, non-consumable) and optimize price points.
- IAP integration — set up StoreKit 2 / Google Billing 6, receipt validation, webhooks.
- Ad mediation — connect 3-6 networks, configure waterfall or In-App Bidding, test fill rate.
- Analytics and cohorts — integrate RevenueCat, Amplitude, or Firebase for LTV tracking.
- A/B testing of paywall — use Remote Config for experiments without a release.
- Launch and monitoring — 2 weeks of free support after launch, bug fixes by 24-hour SLA.
How to Design a Freemium Model and Paywall?
Freemium works when the boundary between free and paid is properly drawn. Too strict a paywall at the start — users delete. Too generous a free tier — no incentive to pay.
A technically sound pattern: server-side feature flags (Remote Config in Firebase or LaunchDarkly) control access to features. This allows A/B testing of paywall without a release, changing trial conditions, and running promotions.
Implementation at the code level: EntitlementManager — a single point for checking access to features, aware of subscription status, flags, and promos. No scattered isPremium checks throughout the code. Experience shows this approach reduces paywall-related bugs by 80% (confirmed on 30+ projects).
Checklist of Typical Monetization Mistakes
- Missing handling of
unfinished transactions — revenue loss of 5-10%.
- No server-side idempotency for consumable processing — double crediting.
- Forgot to call
acknowledgePurchase() on Android — purchase cancelled after 3 days.
- Not handling
REFUND and DID_RENEW events — incorrect subscription status.
- Paywall without A/B testing — leaving 20-40% of monetization potential.
- Ads from a single source (e.g., AdMob without mediation) — CPM 15-30% lower.
Scope of Monetization Work
- Current model audit — analysis of funnel, paywall, price tiers.
- IAP integration — StoreKit 2 / Google Billing 6, receipt validation, webhooks.
- Ad mediation — configure MAX / AdMob, connect 3-6 networks, test fill rate.
- Analytics setup — RevenueCat, Amplitude / Firebase, cohort analysis.
- Documentation — description of entitlements, restoration procedure, review checklist.
- Team training — analysis of typical mistakes, support recommendations.
- Guarantee — 2 weeks free support after launch, bug fixes by 24-hour SLA.
Estimated Timelines
| Stage |
Duration |
| Basic IAP (one store) |
1–2 weeks |
| Subscription system + RevenueCat + paywall |
3–5 weeks |
| Ad mediation (MAX + 3 networks) |
1–2 weeks |
| Full cycle (IAP + ads + analytics) |
4–8 weeks |
Cost is calculated individually. We have been working in this field for over 8 years and have implemented monetization in over 40 projects — many of which passed App Store Review without a single rejection. Contact us for an audit or order a consultation — we'll tell you what growth points exist in your app.