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:

  1. Claim the normal LifeBet Daily Reward.
  2. Tap Watch Ad - Get Another Reward.
  3. Complete the rewarded ad.
  4. Receive the second reward.
  5. 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

Share this project:

Updates

Submission history