material3 gives you parts, not a paywall
Compose has buttons, cards and sheets. A paywall also needs plan selection, a trial explanation, the auto-renew text and a restore path. These templates put all of that on one screen, already wired together.

Add one line to your app module (JitPack, minSdk 26):
implementation("com.github.sanikantv:m3-expressive-paywall:v1.0.0")material3 gives you parts, not a paywall
Compose has buttons, cards and sheets. A paywall also needs plan selection, a trial explanation, the auto-renew text and a restore path. These templates put all of that on one screen, already wired together.
Expressive, without the research
ButtonGroup, MaterialShapes morphing, LinearWavyProgressIndicator and spring motion
are new in material3 1.5. The paywalls use them, so you see working examples instead of
API reference pages.
Disclosures come with every screen
The price, billing period, trial terms and auto-renew line sit next to the button, which is what Google Play’s subscription policy asks for. Restore, Terms and Privacy links are in the same footer.
No billing lock-in
Each paywall takes a list of PaywallPlans and three callbacks. Connect it to
Google Play Billing,
RevenueCat or your own backend. No API keys, no dashboard.
Add JitPack and the dependency, then show a paywall:
@Composablefun UpgradeScreen(onBuy: (planId: String) -> Unit, onRestore: () -> Unit, onDismiss: () -> Unit) { ClassicPlansPaywall( plans = listOf( PaywallPlan(id = "monthly", title = "Monthly", price = "$4.99", period = "per month"), PaywallPlan( id = "yearly", title = "Yearly", price = "$29.99", period = "per year", trialText = "7-day free trial", badge = "Best value", ), ), features = listOf( PaywallFeature("Unlimited projects", icon = PaywallIcons.Sparkle), PaywallFeature("No ads", icon = PaywallIcons.Block), ), legal = PaywallLegal(termsUrl = "https://example.com/terms", privacyUrl = "https://example.com/privacy"), onPurchase = { plan -> onBuy(plan.id) }, onRestore = onRestore, onClose = onDismiss, )}Prices are strings, so you pass the localized price from the store. Every snippet on this site is compiled against the library on each build.
Classic plansHero, plan cards with a “Best value” badge, features.
Free vs Pro tableA comparison grid with a highlighted Pro column.
Trial timelineToday, reminder, billing. Trust for free trials.
Plan pickerConnected button group with a morphing card.
Limited-time offerDiscount sheet, countdown, wavy progress bar.
Onboarding endBenefit pages that end in the plan selection.1.5.0-beta02 or newer, because the Expressive APIs it uses are not in 1.4. Read the FAQPaywallPlans. Read the FAQMaterialTheme. Read the FAQimplementation("com.github.sanikantv:m3-expressive-paywall:v1.0.0")Built by Sanikant. Set in Google Sans Flex (SIL Open Font License). Not affiliated with Google.