## The numbers to price against

| Channel | Commission |
|---|---|
| App Store, small business programme | 15% |
| App Store, standard | 30% |
| Play, first million per year | 15% |
| Play, above that | 30% |
| Stripe on the web | roughly 2.9% plus a fixed fee |

Rates and thresholds change, and they have changed more than once recently. Check the current terms
before you set a price rather than trusting a number in any article, including this one.

## Apply to the programmes

Both reduced rates require enrolment. Missing it is a five-figure mistake at moderate revenue, and
nothing prompts you.

## What this means for pricing

You have three options and they are all legitimate:

- **One price everywhere**, and absorb the difference on mobile.
- **A higher price in the app**, which both stores permit.
- **Web only for purchase**, with the app read-only for subscribing.

The third is what many products do, and the rules on what you may say about it inside the app are the
part that moves. Check the current guidelines before writing that copy.

## Your code does not care

```ruby
Subscription.activate!(account, plan: :pro)
```

Whether a Stripe webhook or a verified App Store receipt made that call, the same row is written in
`app/models/subscription.rb` and `app/models/entitlement.rb` reads it the same way. So the commission is a pricing decision,
not an architectural one, and changing your mind later does not mean changing gated controllers.

## Model it before you ship

```bash
bin/rails runner 'puts KitPrice.current.cents'
```

Take your intended price, remove 15 percent, and check the result is still a business. If most of
your customers will come through mobile, that number is your real revenue per customer.
