Test your paywall’s headline without shipping a build.

Xee is the subscription backend for iOS apps. It checks every purchase with Apple, keeps each user’s access current, and runs A/B tests on the values in your SwiftUI paywall. Claude sets it up from your editor.

Swift Package Manager · iOS 13+ · StoreKit 2 · App Store only

A Unlock every feature · 50%B Write without limits · 50%

Paywalls

Your paywall stays your code.

It remains a normal SwiftUI view in your app. Xee keeps the values you might want to change without a release: the headline, the button text, which products show, whether the trial toggle is on. The value on screen today becomes the default in your Swift code, so the paywall still works offline.

Prices, trial lengths and legal text stay with the product and the code, where they are always right.

How Claude turns a paywall into variables
// The values come from Xee; the defaults are today's screen.
let paywall = try await Xee.getPaywallVariant(paywallId: "main")
let v = paywall.remoteConfig?.dictionary
let headline = v?["headline"] as? String ?? "Unlock every feature"
let button = v?["button_text"] as? String ?? "Continue"

// One access level for every product.
let profile = try await Xee.getProfile()
let isPremium = profile.accessLevels["premium"]?.isActive == true

What Xee does

Everything between the Buy button and Apple.

Purchases checked with Apple

When your app reports a purchase or a restore, Xee asks Apple about it with your In-App Purchase key. Premium is on as soon as the purchase returns.

Renewals, refunds and expiry

Apple's App Store Server Notifications reach Xee while your app is closed, so every profile knows about a renewal, a billing retry or a refund.

A/B tests on one value

Test a headline, the button text or which plan is preselected. Send 5 to 95% of users to B, watch who buys, and ship the winner from the dashboard.

Refund saver

When a customer asks Apple for a refund, Xee answers Apple's consumption request with how the purchase was used and the outcome you prefer.

Profiles and events

One timeline per user: every purchase, restore, renewal and notification from Apple, with what Xee did about it.

Revenue and retention

Revenue by product, the paywall funnel, refunds and retention, per app, without exporting anything.

Claude

Ask for a change in plain words.

Xee has an MCP server. Connected to Claude Code, Claude reads your paywalls, moves their values into Xee, pushes new versions and reads test results, without you leaving the editor. You start and ship tests yourself, in the dashboard.

Connect Claude to Xee
$ claude mcp add --transport http xee https://api.xee.ai/mcp
  • Make the paywall's button say “Start free trial” and push the new version to Xee.
  • Suggest a test for the headline.
  • How is the test doing? Can I ship B?

Migrate

Coming from Adapty or RevenueCat?

The calls map almost one to one, and the access level, the profile and the paywall-then-products flow work the way you know. Run both SDKs for a while, bring your subscribers into Xee, and remove the old one when your own numbers say it is safe.

Read the migration guide
AdaptyXee
Adapty.activateXee.activate(with:)
Adapty.getProfile()Xee.getProfile()
Adapty.getPaywall(placementId:)Xee.getPaywallVariant(paywallId:)
Adapty.getPaywallProducts(paywall:)Xee.getPaywallVariantProducts(paywallVariant:)
Adapty.logShowPaywallXee.logShowPaywallVariant(_:)

Set up

Four steps to your first verified purchase.

  1. Add the SDK

    Swift Package Manager, iOS 13 or later.

    Guide
  2. Activate it at launch

    One call with your app's SDK key.

    Guide
  3. Add your In-App Purchase key

    So Xee can check each purchase with Apple.

    Guide
  4. Paste the notification URL

    Into App Store Connect, for renewals and refunds.

    Guide

Your next button_text is a test away.