> For the complete documentation index, see [llms.txt](https://developer.paddle.com/llms.txt).

# Paddle for mobile

How Paddle helps mobile app developers sell outside the App Store, with tax, chargebacks, and compliance out-of-the-box.

---

With [developments in legislation around the App Store](https://www.paddle.com/blog/apple-vs-epic-app-store-changes), you can now link users in the United States to an external checkout for purchases in iOS apps. But, selling outside the App Store comes with complexity: payments, currency conversion, refunds, chargebacks, sales tax, and compliance become your responsibility.

Paddle is a merchant of record platform for mobile app developers. As a merchant of record, you can integrate with Paddle and we take care of payments, tax, fraud, and compliance for you.

Companies like [HubX](https://www.paddle.com/customers/hubx-sells-mobile-apps-on-the-web-with-paddle), [Runna](https://www.paddle.com/customers/how-mobile-app-runna-monetized-on-the-web), [PhotoMyne](https://www.paddle.com/customers/how-paddle-enhanced-photomynes-web2app), and [Letterboxd](https://www.paddle.com/customers/letterboxd) use Paddle to power their business.

## Key features for mobile app developers

{% card-group cols=2 %}
{% card title="Lower fees than IAPs" icon="carbon:piggy-bank" %}
Go directly to your users and save on App Store fees, while boosting customer lifetime value.
{% /card %}
{% card title="Full pricing customization" icon="carbon:currency" %}
Reach price points and markets the app stores can't. Set your own prices, offer discounts, and offer custom plans.
{% /card %}
{% card title="Seamless integration experience" icon="carbon:data-share" %}
Open a URL, then listen for a deeplink return. Paddle handles the entire checkout — no billing stack to maintain.
{% /card %}
{% card title="Integration with RevenueCat" icon="revenuecat" %}
Handle fulfillment and entitlements with RevenueCat, or build your own workflow with webhooks.
{% /card %}
{% /card-group %}

## The link-out architecture

When you integrate with Paddle, you don't need to plug in an entirely new billing stack or build a custom checkout page. Instead, you link out to a checkout and bounce users back to your app when they complete their purchase.

A typical flow looks like this:

```mermaid
sequenceDiagram
    participant App as Your app
    participant Browser as Checkout
    participant Paddle as Paddle
    participant Backend as Backend/RevenueCat

    App->>Browser: 1. Open checkout URL
    Browser->>Paddle: 2. Customer pays
    Paddle-->>Browser: Checkout completed
    Browser->>App: 3. Redirect back to your app
    App->>Backend: 4. Verify purchase
    Backend-->>App: Entitlement granted, feature unlocked
```

The work splits cleanly:

- Paddle handles the entire checkout process, including payment processing, tax, fraud, and compliance.
- RevenueCat or your backend handles entitlement, using webhooks or your own database.
- Your app handles opening a URL and listening for the return deeplink.

## Integration options

Depending on your needs, you can choose to host the entire checkout with Paddle, or build your own checkout page with Paddle.js.

{% card-group cols=3 %}
{% card title="Hosted checkout" icon="paddle" url="/build/mobile-apps/link-out-mobile-app-hosted-checkout-app" %}
Paddle hosts the entire checkout. You configure a checkout link in the dashboard and open it from your app. Lowest setup.

{% badge label="Recommended" type="success" /%}
{% /card %}
{% card title="Starter kit" icon="carbon:rocket" url="/get-started/starter-kits/web-monetization" %}
A Next.js app you deploy to Vercel — includes pricing, marketing, and legal pages. Ready to brand up for building a Web2App sales motion.

{% badge label="Low code" type="default" variant="outline" /%}
{% /card %}
{% card title="Custom workflow" icon="carbon:code" url="/build/mobile-apps/link-out-mobile-app-custom-workflow" %}
Build your own checkout page with Paddle.js, your own backend creating transactions, and your own entitlements workflow.

{% badge label="Most control" type="default" variant="outline" /%}
{% /card %}
{% /card-group %}

You can always start with a hosted checkout, then build your own checkout page using the starter kit or Paddle.js if you need more control.

## Identity across the boundary

While mobile users are signed into your app, the browser they open for checkout is anonymous. You can pass identity information through [URL parameters](https://developer.paddle.com/paddle-js/about/hosted-checkout.md) when you open the checkout, so you can match the purchase back to the right user on your side.

If you're using RevenueCat, you can pass the `app_user_id` (or a custom RevenueCat ID) through the checkout URL, and RevenueCat receives the entitlement event from Paddle. Your app uses the standard RevenueCat SDK to check entitlements on resume.

When the customer returns via deeplink, include a `transactionId` query parameter on the redirect URL so your app can match the return to the original checkout. The Paddle.js [`checkout.completed`](https://developer.paddle.com/paddle-js/events/checkout-completed.md) event exposes this transaction ID.

## Grant entitlements

### Using RevenueCat

If your team already manages entitlements through RevenueCat, the [RevenueCat x Paddle integration](https://www.paddle.com/revenuecat-integration-beta) syncs Paddle purchases automatically.

### Using Paddle webhooks and your backend

If you're not using RevenueCat, or you want complete control over the entitlement workflow, you can use webhooks and your own backend to handle entitlement.

Your backend listens for [`transaction.completed`](https://developer.paddle.com/webhooks/transactions/transaction-completed.md), updates your database, and exposes an entitlement endpoint your app calls on resume:

1. The app opens the checkout URL with `app_user_id` set to your user ID.
2. The customer pays. `transaction.completed` occurs in Paddle.
3. Your webhook handler matches the customer to the user and updates entitlements in your database.
4. The app resumes via deeplink and calls your entitlement endpoint.
5. Your backend returns the current entitlement state. The app unlocks features.

Paddle has [webhooks](https://developer.paddle.com/webhooks.md) for the full subscription lifecycle, so you can use webhooks to handle subscription creation, updates, and cancellations, too.

## Next steps

{% card-group cols=3 %}
{% card title="Hosted checkout" icon="carbon:rocket" url="/concepts/sell/hosted-checkout-mobile-apps" %}
Learn about how hosted checkout works in more detail and how to set it up.
{% /card %}
{% card title="Web monetization starter kit" icon="carbon:cloud" url="/get-started/starter-kits/web-monetization" %}
Explore our starter kit for Vercel that includes everything you need to monetize on the web.
{% /card %}
{% card title="Integrate with AI" icon="sparkles" url="/get-started/ai" %}
Install the Paddle MCP or skills to add Paddle to your mobile app.
{% /card %}
{% /card-group %}