Ads.
Optional AdMob banner and interstitials.
Ads are off by default and never shown to Pro users.
01Set it up
Ads run on your own Google AdMob account; AdMob pays you directly. Nothing about ads is included in the item price.
- Create an AdMob app for Android and one for iOS, and a banner and an interstitial unit for each.
- Replace Google's test app id (
ca-app-pub-3940256099942544~…) with yours inapp/android/app/src/main/AndroidManifest.xml(com.google.android.gms.ads.APPLICATION_ID) andapp/ios/Runner/Info.plist(GADApplicationIdentifier). - Enter the four unit ids in the console (Ads), set "Interstitial after every N replies" (0 = never), and switch on Show ads.
- Check:
bash tool/check_ad_ids.sh --releasepasses once your app id is in place.
02Consent (EEA, UK and privacy-law regions)
Before the first ad the app runs Google's User Messaging Platform: ConsentInformation.requestConsentInfoUpdate, then ConsentForm.loadAndShowConsentFormIfRequired, and it requests ads only when canRequestAds() is true (lib/platform/real_services.dart, AdMobAds). Create and publish your consent message in AdMob > Privacy & messaging; without a published message no form is shown.
03Where ads appear
- Banner under the chat and the history list.
- Interstitial after every N finished replies in a session (0 = never).
- Never for Pro users, never while the paywall gives the user Pro.
04Test ids and empty ids
Only Google's public test ids ship. An empty unit id shows Google's test ad in a debug build and no ad in a release build, so a release cannot show test ads or someone else's units. bash tool/check_ad_ids.sh proves no other AdMob id is hard-coded.
05Ads do not show
- Show ads is on in the console, and the app reads that console (
API_BASE_URL). - The user is not Pro.
- The four unit ids are set (Status names missing ones).
- Your own AdMob app id replaced the test id in the manifest and Info.plist.
- New AdMob units can take hours to serve; check the AdMob dashboard.
- The privacy screen lists AdMob only while ads are on: if it does not, the app has not loaded the new config yet (it refreshes at start).