Docs · SDK facts

The SDK, without the sales pitch

The things a developer checks before letting an SDK into a production app.

Pure Swift Zero dependencies iOS 16+ Swift Package Manager Version-pinned releases Fire-and-forget — never blocks the main thread

The SDK's module is called FolioKit — renamed from AppCoreKit in 0.5.0. A deprecated AppCore typealias (and a legacy AppCoreKit product target) ship alongside it through the 0.x line, so apps integrated before the rename keep compiling unchanged. It's distributed via Swift Package Manager and pinned to version tags, never a moving branch.

You don't integrate it — your agent does

Adding an app in the dashboard produces one self-contained prompt. Paste it into Claude Code, Cursor, or whatever agent you build with: it adds the package, starts the SDK, wires the RevenueCat handshake, instruments your screens and key events, then calls a live verification endpoint with your app's own credentials and reports "you're live — events are flowing". The integration rules the agent follows are strict: events fire once per user action, paired events must have similar counts, and no PII goes into properties.

Automatic events

Tracked without any code:

EventWhen
app_openedlaunch and foreground (a new session starts after a background gap)
session_endapp backgrounded; session length recorded
screen_vieweach screen marked with .folioKitScreen("Name")
ad_attributionApple Search Ads attribution via AdServices, when present

Standard events

Instrumented by the agent at the moments that matter — the dashboard's funnel, the SKAdNetwork mapping, and the weekly brief all expect these exact names:

EventWhen
onboarding_stepeach onboarding step, with the step number
onboarding_completeduser finishes onboarding
paywall_shownthe paywall becomes visible, any trigger
trial_starteda trial begins
purchase_completeda purchase goes through

Plus a handful of app-specific events for your core value loop (scan_completed, book_finished, …) — moments a user gets value, not UI minutiae. There is deliberately no autocapture.

Delivery: offline queue, batched uploads

Events are queued on the device and uploaded in batches — roughly every 15 seconds and immediately when the app goes to the background. No network, no problem: the queue persists and retries on the next flush. Server errors are retried; permanently rejected batches are dropped rather than wedging the queue. All calls are fire-and-forget and never block the main thread.

Remote config — change behavior without an app update

"No ATT prompt" — what that means, exactly

This claim gets abused in analytics marketing, so here is the precise version:

Nothing the SDK does is "tracking" in Apple's definition — no IDFA, no fingerprinting, no cross-app device graphs — which is why no ATT prompt is required. The full list of what's collected is on the data & privacy page.

Honest limits

FolioKit — one SDK your agent installs in an afternoon, verified against a live endpoint before anyone calls it done.

Get early access