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 AppCoreKit — FolioKit's original working name, kept so shipped apps never need a rename. 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 .appCoreScreen("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