Inspiration
LifeBet started from a simple idea: self-improvement is easier when progress feels measurable, social, and rewarding.
The goal is to turn everyday habits and personal goals into challenges people actually want to stick with. Users can join challenges, build streaks, earn Life Points, and track their progress over time.
Rather than making LifeBet feel like another checklist or habit tracker, I wanted it to feel more like a game built around becoming a better version of yourself.
What LifeBet Does
LifeBet lets users participate in structured personal-improvement challenges centered around things like activity, consistency, learning, and healthy habits.
Core features include:
- Daily and multi-day challenges
- Progress tracking and streaks
- Life Point rewards
- Entry Passes for joining eligible challenges
- Daily rewards
- Optional rewarded ads for an additional daily bonus
- Social and competitive challenge mechanics
The long-term goal is to make positive habits more engaging without making the app feel punishing when users miss a day.
How I Built It
LifeBet is built with Flutter and Dart, with Firebase providing much of the backend infrastructure.
The project currently uses:
- Flutter
- Dart
- Firebase Authentication
- Cloud Firestore
- Firebase Cloud Functions
- Google AdMob
- RevenueCat
- App Store Connect / TestFlight
- Google Play infrastructure
One of my goals during the Shipaton is to improve LifeBet's monetization without making the experience more intrusive.
Shipaton Development Journey
Week 1 - Rewarded Ads and RevenueCat
The first major Shipaton feature I worked on was rewarded advertising.
LifeBet already had a normal Daily Reward that users can claim once per reward cycle. I wanted to preserve that reward exactly as it was while adding a second, completely optional opportunity:
Watch an ad and receive another reward.
Google AdMob handles the rewarded ad itself, while RevenueCat Ads receives the ad lifecycle and monetization events.
The RevenueCat placement is:
daily_reward_bonus
The integration reports events including:
- Ad loaded
- Ad displayed
- Ad revenue
- Ad failure
The reward itself is only granted after AdMob reports that the user completed the rewarded ad. Simply opening, displaying, or closing an ad does not grant the bonus.
What Went Wrong
The first TestFlight version of the rewarded-ad feature did not work.
The UI appeared correctly, but tapping the button resulted in an unavailable-ad message.
After inspecting the device logs, I found the AdMob error:
Publisher data not found
The problem turned out to be that my TestFlight build was using the production AdMob ad unit even though the AdMob account and app were not yet ready for production ad serving.
I changed the configuration so that development and TestFlight builds currently use Google's official rewarded test ads.
After that change, the complete flow worked:
- Claim the normal LifeBet Daily Reward.
- Tap Watch Ad - Get Another Reward.
- Complete the rewarded ad.
- Receive the second reward.
- RevenueCat records the sandbox ad events.
What I Learned
One lesson from this integration was that test-ad behavior should be explicit rather than inferred only from debug versus release builds.
TestFlight builds are release builds, but that does not necessarily mean they should use production advertising.
LifeBet now has a clear configuration switch controlling whether AdMob test or production units are used. This makes it much harder to accidentally test against live ads.
I also learned that RevenueCat Ads works well alongside an existing ad network rather than replacing it. AdMob serves the advertisement, while RevenueCat gives me a unified view of ad activity alongside the rest of the app's monetization.
Building in Public
I am documenting LifeBet's development throughout the Shipaton, including features that work, bugs that do not, and decisions that change along the way.
I am also actively asking for feedback on decisions like:
- How optional rewarded ads should be presented
- What rewards users should receive
- How much monetization is appropriate for a productivity app
- Which features make challenges more motivating
- What parts of the user experience need more polish
The goal is not just to show the finished app, but to show how the app changes during development.
What's Next
Upcoming areas I plan to work on include:
- Improving LifeBet's retention and notification systems
- Continuing UI and UX polish
- Expanding challenge and reward mechanics
- Improving monetization without making it intrusive
- Using feedback from public development posts to guide feature decisions
- Preparing LifeBet for a wider public release
LifeBet is still evolving, and I plan to keep updating this story throughout the Shipaton.
Built With
- android
- cloud-firestore
- cloud-functions
- dart
- firebase
- firebase-authentication
- flutter
- google-admob
- ios
- revenuecat
- testflight
Log in or sign up for Devpost to join the conversation.