PRODUCT
One entitlement model in front of four billing systems.
Orca sits between your app, your server and the stores you sell through. It does not process payments and it does not replace your backend. It makes “does this customer have access?” a single question with a single answer, whichever store the money came from.
- Stores
- 4
- App Store, Play, Stripe, GoCardless
- Client SDKs
- 5
- Swift, Kotlin, Flutter, TS, Tauri
- Server SDKs
- 2
- TypeScript, Go
01 · ARCHITECTURE
How the pieces fit.
Every box below is named in the documentation. The purchase itself is always made in the store; Orca is told about it, maps it to an entitlement and tells you.
02 · COMPONENTS
What Orca is made of.
DASHBOARD
Organizations, apps, stores
Create an organization, then an app. Connect App Store Connect, Google Play Console, Stripe and GoCardless so Orca has permission to read purchases and receive notifications. Store integration guides.
ENTITLEMENTS
The abstraction your app gates on
An entitlement such as pro_tier groups one real product from each store. Three kinds: subscriptions, one-time non-consumables, and consumables. Offerings in the dashboard drive proration on plan changes. Entitlements & products.
CLIENT SDKS
Sell, in the store's own UI
orca-apple (StoreKit 2 on iOS and macOS), orca-android (Play Billing), flutter_orca (iOS, Android, macOS, Windows, Linux, Web), OrcaClient for the browser and a Tauri plugin for desktop. Configure with a public key, identify the customer by email, query products, purchase, read active entitlements. React Native SDK coming soon.
SERVER SDKS
Decide access with the private key
OrcaServerClient (TypeScript) and orca-server-sdk-go: getActiveEntitlements, customer lookup, cancel Stripe/GoCardless subscriptions, verify webhooks.
WEBHOOKS
Push on every change
Orca signs each webhook; the server SDKs verify x-orca-signature and x-orca-timestamp (rejecting anything older than five minutes) and return the customer's updated entitlement.
MCP SERVER
Agent access, experiments included
Hosted at mcp.orca.maxint.com. Read, write and destructive (cancellation) scopes are approved separately in a browser consent screen. Product creation, entitlement mapping and pricing experiments run through it. MCP server docs.
03 · RESPONSIBILITIES
Purchase, entitlement sync, paywall, analytics, who does what.
These are four different jobs. Being precise about which ones Orca does is how you avoid buying the wrong tool.
| Job | Who does it with Orca | Notes |
|---|---|---|
| Purchase processing | The store (Apple, Google, Stripe, GoCardless) | Orca never touches card or bank data. Store commissions and processor fees are unchanged. |
| Entitlement synchronisation | Orca | One entitlement, one customer email, every store. This is the core product. |
| Access decision | Your server, via a server SDK | Client SDKs can read entitlements for UI, but paid content should be gated server-side. |
| Paywall rendering | You today · Orca paywalls coming soon | Orca returns products with formatted prices; you build the screen. Hosted paywalls are in preparation. |
| Experimentation | Orca, via the MCP server | Pricing and entitlement experiments are run through the MCP server's write scope. |
| Analytics | Orca | MRR, churn and retention in the dashboard; funnel analytics and churn insights; raw data streams and SQL access for your own warehouse. |
| Subscription management UI | The store | App Store and Google Play customers manage subscriptions in store settings; the SDKs expose the management URLs. |
04 · IN CODE
The whole model in two calls.
Client identifies and sells; server verifies. The same customer email is the join key on both sides.
final orca = Orca(publicKey: 'pk_...', environment: OrcaEnvironment.sandbox);
await orca.identify('ada@example.com');
final entitlements = await orca.listEntitlements();
await orca.purchase(entitlements.first, externalStore: ExternalStore.stripe,
redirectUrl: 'https://yourapp.com/success',
failureRedirectUrl: 'https://yourapp.com/failure');const orca = new OrcaServerClient(process.env.ORCA_API_KEY!)
const active = await orca.getActiveEntitlements('ada@example.com', 'sandbox')
const isPro = active.some((e) => e.entitlement_id === 'pro_tier')05 · SCOPE AND ROADMAP
What Orca does today, and what is next.
TODAY
In production
Entitlement sync across App Store, Google Play, Stripe and GoCardless. Client SDKs for Swift, Kotlin, Flutter, TypeScript and Tauri; server SDKs for TypeScript and Go. Signed webhooks. Analytics dashboard. MCP server with experiments. Sandbox and production environments. Bulk import.
NEXT
On the roadmap
- React Native SDK (soon)
- Hosted paywalls (soon)
- Unity and Kotlin Multiplatform SDKs
NEXT