app.* events for every charge, and pays you 80% of each charge. Prices are integers in USD minor units (cents).
Create a plan
In the Developer Area, open your app, go to Store listing, then Pricing, and click Add plan.
An app holds at most 5 plans that are not withdrawn. Once a plan is active its price, currency, interval and plan type are locked, while the name and description stay editable.
Plan lifecycle
GET /apps/{appUuid}/subscription-status returns the same lifecycle as each plan’s status (pending_setup, active, withdrawn), plus an app-level overallStatus. Read a creator’s app subscription has the response.
Plan IDs
Every plan has a UUID, shown in the Plan ID column of the pricing table. Click it to copy the value. You’ll use the UUID in three places:- Deeplinks.
?plan=<planUuid>preselects the plan on your listing, and&action=checkoutskips the picker. See App Store deeplinks. - Webhooks. The plan arrives as
item.uuidonapp.payment.*and asplan.uuidonapp.subscription.*events. - Entitlement.
GET /apps/{appUuid}/subscription/mereturns the buyer’splanUuid, which you compare against your feature tiers.
Checkout URL
Every active paid plan has a Fanvue-hosted checkout URL of the formhttps://www.fanvue.com/checkout/app_<id>, where <id> is derived from the plan UUID. Read it as checkoutUrl on each plan in GET /apps/{appUuid}/subscription-status rather than copying it from the Developer Area. checkoutUrl is null for free, pending setup and withdrawn plans, and for a plan whose link you have disabled.
Disable link on a plan’s row closes its public checkout URL without withdrawing the plan. Only the shared URL stops working, and the plan stays purchasable from your listing and through deeplinks.
How buyers subscribe
A creator reaches checkout for a plan in one of three ways:- The plan picker on your listing.
- A deeplink with the plan preselected, or straight into checkout.
- The plan’s
checkoutUrl. The buyer must be signed in to Fanvue.
Change plan
A subscribed creator can move between your plans with Change plan. Fanvue classifies the move by monthly price and handles it as follows:
A yearly plan is compared at its monthly equivalent, so a yearly plan can rank as a downgrade from a dearer monthly one.
What fires when someone subscribes
Money and access arrive as separate events.
Branch on
cancel_at_period_end to learn that access ends at the period end, and read live state from GET /apps/{appUuid}/subscription/me (hasActiveSubscription, currentPeriodEnd, cancelAtPeriodEnd). Payload fields are in App events: subscriptions.
Tracking revenue
Subscriber counts appear in the pricing table, and earnings on your app’s Revenue tab. To reconcile in code, readGET /apps/{appUuid}/payments. The invoice number on each payment matches data.id on the app.payment.* event.