ads-and-iap-monetization

Enforces opt-in rewarded ads and non-consumable entitlement policies in Flutter apps.

Updated Aug 22, 2026
One-click install
npx skills add https://github.com/zakariaf/NearlyStop --skill ads-and-iap-monetization-zakariaf
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: ads-and-iap-monetization
Source: https://github.com/zakariaf/NearlyStop/tree/main/.claude/skills/ads-and-iap-monetization
Command: npx skills add https://github.com/zakariaf/NearlyStop --skill ads-and-iap-monetization-zakariaf

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes scripts (resource) and references (resource) components.

What problem does it solve? Monetizing a Flutter app with ads and in-app purchases is easy to get wrong: rewarded ads that auto-play, earn loops without caps, interstitials firing mid-task, and paying users still getting the ad SDK initialized all lead to bad reviews and App Store rejections. This Skill encodes the policy layer that keeps an ad-funded app honest and reviewable. ## Core Features & Use Cases - Rewarded earn loop policy: Opt-in rewarded views grant exactly one benefit, only on a genuine reward outcome modeled as a sealed type (Rewarded/Dismissed/NoFill), with a per-day cap enforced against an injected Clock. - Interstitial and banner placement rules: Interstitials fire only at natural breaks under a count-and-elapsed cap owned by the service, and banners never appear on the primary work surface. - Entitlement gating and launch order: One derived isEntitled provider gates everything, restore runs before the ad SDK initializes, and purchases commit through a single write path before the UI reacts. - Use Case: When adding a "watch to earn" credit system to a Flutter app, use this Skill to wire the rewarded flow so the earn button only appears when an ad is loaded, the daily cap holds, and a paying user never triggers the ad SDK or consent prompt. ## Quick Start Use the ads-and-iap-monetization skill to review my rewarded ads and in-app purchase implementation for policy violations before release.

Frequently Asked Questions about ads-and-iap-monetization

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I implement rewarded ads in Flutter without violating App Store guidelines?

Make rewarded ads strictly opt-in from an explicit tap, grant exactly one benefit only on a completed view, and hide the earn control unless an ad is actually loaded. An always-visible button that answers "no ads available" is a Guideline 2.1 rejection risk.

How do I cap a watch-to-earn loop in a Flutter app?

Enforce the daily cap in the app's policy layer against an injected Clock, keyed to a calendar day from clock.now(). Do not rely on the ad network console's frequency cap, since console-side no-fill silently hides the earn control from the user.

Should I initialize the ad SDK before or after restoring purchases?

Restore the entitlement first and initialize the ad SDK only for confirmed non-entitled users. If init runs first, a paying user still gets the SDK started, consent resolved, and a tracking prompt shown, which is exactly what they paid to avoid.

Why does my rewarded ad button show "no ads available" for new accounts?

New ad accounts have near-zero fill, so an always-visible earn control dead-ends. Preload the rewarded ad, expose availability as a stream, and show the control only while an ad is loaded or a redemption is in flight.

When should an interstitial ad fire in a mobile app?

Only at a natural break the user already expected, such as a task completion or transition, never mid-task, during onboarding, or in the first session. Enforce both a per-N-completions count and a minimum elapsed-seconds cap inside the service's maybeShowInterstitial method.

Can I ship sample AdMob ad unit ids in a release build?

No. Sample ids serve "test ad" creatives that earn nothing and read as broken to a store reviewer. Use compile-time constants for real ids and run the check-release-ad-ids.sh script as a release gate to catch empty or sample identifiers.