No app code. No backend code. No SDK. No app release.
Apple Retention Messaging is triggered by Apple during the cancellation flow. Apple calls the realtime URL you configured. The app does not call RetainKit, does not embed a RetainKit SDK, and does not need a new release just to serve cancellation-time messages or promotional offers.
This is why the API is operationally interesting. The subscriber can see a retention message inside Apple's cancellation UI even if your current app build knows nothing about Retention Messaging.
What setup is still required
No SDK does not mean no setup. It means the setup is server-side and App Store Connect-side.
- Request Apple Retention Messaging API access.
- Add App Store Connect API credentials for sync and configuration.
- Add StoreKit/In-App Purchase key material for promotional-offer signing.
- Sync apps, subscription groups, products, and promotional offers.
- Upload Retention Messaging messages and wait for production approval.
- Configure sandbox and production realtime URLs.
- Run and pass the sandbox performance test.
What RetainKit hosts for you
RetainKit hosts the Apple-facing runtime and the operational control plane around it. That is the part most teams would otherwise build as a mix of scripts, environment variables, spreadsheets, and a small service no one wants to own during a cancellation spike.
Cloudflare Workers endpoint per app and environment: runtime.retainkit.dev/apple/retention/{appId}/{environment}.
Published retention flows compiled into immutable runtime configs.
Server-side promotionalOfferSignatureV2 generation using encrypted StoreKit key material.
Validation, sandbox testing support, rollout, rollback, simulator flows, and runtime logs.
Simple architecture
The request path is direct. Apple owns the cancellation UI. RetainKit owns the hosted response runtime. Your app remains outside the loop.
Apple cancellation UI
-> Apple StoreKit server
-> RetainKit realtime URL
-> published retention flow snapshot
-> message / signed promotional offer / alternate product responseBecause the runtime is server-side, teams can change retention behavior without waiting for app review. A product or growth operator can publish a new approved message, change rollout percentage, or roll back a flow while the app binary stays untouched.
Where no-code stops
No SDK integration applies to the Apple Retention Messaging callback. It does not remove Apple's access requirements, message review, promotional offer setup, or performance testing. It also does not replace your entitlement system, purchase handling, App Store Server Notifications, or subscription analytics.
If you self-host runtime evaluation instead of using RetainKit-hosted endpoints, you will need backend code for the realtime URL. RetainKit can still act as the control plane and export runtime configs, but the no-backend-code claim applies to the hosted runtime path.