app.ski

Sell your app's subscriptions on the web, and keep what the stores used to take.

app.ski is a checkout for iOS and Android apps. Your paywall opens it, the buyer pays by card, Apple Pay or USDC, and they're back in your app with the purchase unlocked. List your app in the app.ski Store and new customers can find it and subscribe there too.

A purchase, start to finish. Under each screen: what your app and server see.

Powder
Go Pro
  • Offline trail maps
  • Unlimited tracking
  • Friend finder
Yearly$29.99
Monthly$4.99
Continue on web
App Store · $37.99
1. Your paywallOffer a web price next to the store one.
GET /v1/products 200
pro_yearly $29.99
🔒 app.ski/c/cs_8fK2x
Powder
Powder Pro
$29.99 / year
Pay
4242 4242 4242 4242
Renews yearly. Cancel any time.
Pay $29.99
2. CheckoutOpens over your app in a browser sheet.
POST /v1/checkout/sessions 201
open app.ski/c/cs_8fK2x
✓
You're Pro

Back in Powder.

Offline mapsOn
Unlimited trackingOn
Friend finderOn
3. UnlockedThe sheet closes; the app is already Pro.
checkout.session.completed
mint pass #1042 → custody
POST /your/webhook 200
Held for you
Your pass
POWDERNo. 1042
Pro · Yearly
Valid until Oct 30, 2027
Holdercustody
StandardERC-5643
AccessHolder
4. The passOptional: the subscription as an NFT on Base.
GET /v1/customers/u_42/entitlements
pro.active = true

What you keep from $100

One $100 sale, after everyone's fees. Your price, your customer, your payout schedule.

Sold throughFeesYou keep
App Store or Google Play, standard30% commission$70.00
App Store or Google Play, small business program15% commission$85.00
app.ski, card or Apple Pay3% + Stripe (2.9% + 30¢)$93.80
app.ski, USDC3%; the buyer pays a few cents of gas$97.00

Store programs and Stripe pricing vary by region and volume. Check the current rates for yours.

Your numbers

Extra kept per year, before Stripe's card fee$97,200

Setup

Most apps finish in an afternoon. Everything works in test mode first, with no Stripe account and no wallet.

  1. Create a productSubscription, lifetime unlock or coin pack.
  2. Add the SDKSwift, Kotlin or React Native.
  3. Call purchase()It opens checkout and waits for the buyer to come back.
  4. Check the entitlementOn launch, and after purchase.
import AppSki

AppSki.configure(apiKey: "pk_live_…", appUserID: user.id,
                 returnURL: "powder://purchased")

let result = try await AppSki.shared.purchase("pro_yearly")
if result.isActive("pro") { unlockPro() }

Get found in the Store

The app.ski Store is where people browse apps they can subscribe to on the web. List yours from the dashboard; it's free.

Browse the Store →

Your page
Icon, tagline, description, your plans and prices, and links to the App Store, Google Play and your website.
Discovery
Search, categories, a top chart from real sales, and shelves for new apps, NFT passes and lifetime unlocks.
Checkout
Buyers pick a plan, enter their email and pay with the same checkout your app uses. You keep 97%.
Your users
Purchases are linked to email:<address>, so they work in your app when people sign in with that email.

NFT passes

Optional, per product. The subscription becomes a token on Base, and whoever holds it has access until it expires.

Card buyers
Never see a wallet. Their pass is held for them and works like any subscription. They can claim it to a wallet later.
Crypto buyers
Pay USDC from their wallet. The contract mints the pass to them and sends 97% to your payout address in the same transaction.
Resale
Passes can be gifted or sold. We watch the chain, so access moves to the new holder within seconds.
Token gating
GET /v1/wallets/:address/entitlements tells you what a wallet unlocks.
Standards
ERC-721 with ERC-5643 expiry. Each pass has a ticket image that wallets and marketplaces show.

Included

The parts of app billing you'd otherwise build yourself.

Hosted checkout
Fast on phones, in your app's brand color.
Subscriptions
Weekly, monthly or yearly. Renewals, failed payments, cancel-at-period-end, expiry.
Entitlements
One call per user or per wallet, keyed to your own user ID.
Webhooks
HMAC-signed, retried for 15 hours, with a delivery log.
Refunds
From the dashboard or API. Access and passes update immediately.
Payouts
To your own Stripe account, and to your wallet for USDC.
Dashboard
Revenue, conversion, iOS / Android split, and what you kept from the stores.
Store listing
A page in the app.ski Store with your plans, links and a web checkout.
SDKs
Swift, Kotlin, React Native / Expo.

Where it's allowed

Court rulings and the EU's Digital Markets Act opened up link-outs. Rules differ by store and country and keep changing, so check each store's current guidelines.

Store and regionStatusNotes
App Store, United StatesAllowedSince the April 2025 Epic v. Apple injunction; no Apple commission on web purchases.
Google Play, United StatesAllowedUnder the Epic v. Google remedies.
Both stores, EU / EEAVia programsDMA link-out and alternative-billing programs, with the stores' own fees and disclosures.
ElsewhereVariesReader apps and some markets allow it. Show the web option only where permitted.

Common questions

Can I keep in-app purchases too?

Yes. Many apps offer both. Entitlements are keyed to your user ID, so you can merge them with StoreKit or Play Billing.

Who is the merchant of record?

You are, through your connected Stripe account. Turn on Stripe Tax for VAT and sales tax.

Do I need a backend?

No. The SDK reads entitlements with your publishable key. If you have a server, use webhooks and the secret key.

Do buyers need to understand crypto?

No. USDC and NFT passes are optional. Card buyers never see a wallet.

What happens when a pass is resold?

Access moves to the new holder and the seller loses it. A wallet links to one account at a time.

How do Store purchases reach my app?

Store buyers enter an email, so the purchase belongs to email:<address>. Use that as the user ID, or match it on your server.

What does test mode do?

Everything, simulated: checkout, renewals, refunds and passes. No card or wallet needed.

Try the whole flow in test mode, then list your app.

Start freeContact