How to Monetize Your App on Jest

Monetizing your app on Jest is as simple as creating SKUs and connecting a few SDK calls. Learn how to set up purchases and subscriptions while Jest handles checkout, payments, and payouts.

by Michelle Ames in Developers

Monetizing your app on Jest is mostly a matter of deciding what you want to sell. Create a product or subscription in the Developer Console, give it a price, and Jest handles the rest — checkout, Apple Pay and Google Pay, purchase state, and payouts. Your app just calls the SDK when it’s time to show an offer or grant an entitlement.

We support one-off purchases and subscriptions across HTML5 and Unity. And because Jest handles the payment infrastructure, you don’t need to open a merchant account, manage PCI compliance, or build your own checkout.

One-off purchases

Products are the familiar in-app purchase model: currency packs, consumables, permanent unlocks, premium items, and anything else a user might buy once.

Configure products under Manage > Products. Each product has:

  • SKU — a unique identifier that can’t be changed after creation, so choose carefully.
  • Name — shown to the user.
  • Description — optional text shown at checkout.
  • Price — in USD, starting at $0.99.

Products can be archived when you no longer want to sell them. Archiving preserves the purchase history for users who already bought them.

Guests can buy products without registering first. Jest prompts them to sign up after checkout, and the purchase carries over.

A product checkout sheet inside the game Orbo: Idle RPG, offering a Chest of Gems for $19.99 with Apple Pay, Link and Stripe options.

Checkout being initiated in Orbo.

In the SDK, getProducts() reads your catalog and beginPurchase({ productSku }) starts checkout. A successful checkout hands you a purchaseToken: grant the item first, then call completePurchase({ purchaseToken }) to confirm it.

The In-App Purchase Products table in the Developer Console, listing gem packs, a battle pass and a starter bundle with their SKUs, prices and status.

Example product SKUs as seen in the Developer Console.

Subscriptions

Subscriptions turn premium tiers, memberships, and season passes into recurring revenue. Configure them under Manage > Subscriptions.

The Subscriptions table in the Developer Console, showing yearly and monthly passes with their trial and retention offers, plus an archived subscription.

Example subscription SKUs as seen in the Developer Console.

Along with a SKU, a price (from $0.99), a name (up to 32 characters), and a description (up to 110), you can also configure:

  • Billing period — monthly or yearly. This is fixed when the subscription is created.
  • Free trial — optionally offer up to 14 days to wallets that have never subscribed to that SKU.
  • Intro offer — optionally offer a lower price for the first 1–12 billing periods. The intro price must be at least $0.50 and lower than the standard price. Monthly subscriptions only.
  • Retention offer — optionally let a cancelling subscriber claim a discount, once, that runs for a set number of renewals before the standard price resumes automatically. Your app decides when to show it as part of your cancellation flow; Jest never applies it automatically. Monthly subscriptions only.
The Offers panel in the Developer Console, with free trial, intro offer and retention offer each toggled on and showing their duration and price limits.

Optional incentives you can configure for subscribers.

In the SDK, getSubscriptions() returns your subscriptions along with the user’s current entitlement and offer eligibility, and beginSubscription({ subscriptionSku }) starts checkout. cancelSubscription({ subscriptionSku }) opens the platform’s cancellation dialog, and claimRetentionOffer({ subscriptionSku }) applies the retention discount instantly, with no second checkout.

Before you ship

The payment flow is simple, but a few details are worth getting right.

  1. Grant first, then complete. When beginPurchase succeeds the user has paid, but they do not have their item until your app grants it. Grant it durably, then call completePurchase({ purchaseToken }). Confirming first and crashing before you grant leaves the user paid and empty-handed, with nothing left to recover from. That’s a particularly bad bug.
  2. Recover interrupted purchases. Call getIncompletePurchases() when your app starts, so a checkout cut short by a crash or a dropped connection still gets delivered.
  3. Verify purchases server-side when you have a backend. Purchases and subscriptions include signed JWTs that you can verify with your app’s shared secret before granting entitlements.
  4. Test the real flow with sandbox users. Sandbox users run through the real checkout experience, including free trials, and are charged $0.

A few subscription gotchas

  1. Treat monthly and yearly subscriptions as separate SKUs. Jest considers each SKU independent, so a user could technically have both premium_monthly and premium_yearly active at the same time. Check getSubscriptions() and hide an equivalent offer while another cadence is active. If you offer a free trial on a tier, configure it on only one of that tier’s SKUs.
  2. Show users the offers they’re actually eligible for. trialEligible and introOffer tell you whether the current wallet qualifies. Use those fields to avoid showing a free trial or introductory price that the user can’t actually claim.
  3. Guests can buy, but they can’t subscribe. A guest can complete a one-off purchase and is prompted to register afterwards. Subscriptions need a registered account up front: if a guest tries to start one, Jest shows the signup gate and returns guest_not_allowed, so you don’t need to build your own signup prompt.
A subscription checkout sheet inside the game This or That, offering the Gold Pass free for one week then $2.99 a month.

Subscription checkout being initiated in This or That.

  1. Changing a subscription price means creating a new subscription. Existing subscribers keep the price they signed up at. To change pricing, archive the old subscription and create a new one.
  2. Archived subscriptions still appear for existing subscribers. getSubscriptions() keeps returning an archived SKU while a user is still entitled to it, so your paywall needs to honor an entitlement for a SKU you no longer sell.

What you keep

Jest takes 10% of net revenue, where net revenue is gross net of payment processing fees, VAT or any equivalent sales taxes or duties, and any refunds, chargebacks and fraudulent purchases that may occur. Of the remaining 90%, 70% goes to the app that generated the purchase and 20% goes to whoever acquired the user.

If you acquired and monetized the user yourself, you keep the full 90%. If Jest or another developer acquired the user, they receive the 20% acquisition share. Revenue attribution is calculated per transaction and shown in the Developer Console. For more details, see platform economics.

Payouts are sent monthly, typically on the 15th of the following month.

A sample Jest earnings statement for Studio XYZ, showing gross revenue, Stripe fees, the 10% platform fee, no acquisition fees, and the final developer payment.

A sample earnings statement with Jest.

What’s next

Products and subscriptions are just the beginning. We’re adding more ways for developers to turn their audience into revenue, including in-app advertising (IAA).

The goal is simple: bring your app to Jest, choose how you want to monetize it, and let us handle the payment and platform plumbing. You build the experience; we make it easy to make money from it.


For the full implementation details, see our monetization guide, products and subscriptions documentation.

More posts in Developers