Getting started
Set up the project, register your apps, and verify the first signal.
Install the SDK once. Verify revenue across Apple, Google Play, and Stripe. Capture behavioural events, sessions, and runtime errors — all attached to the same customer record. Setup is layered, evidence-based, and observable end-to-end.
Pick the surface you're shipping. Each guide takes about ten minutes and ends with a verified signal in the Crossdeck dashboard — covering all three pillars: subscriptions, analytics, and errors.
Install @cross-deck/web, identify the user, capture your first error, and check an entitlement — all from one snippet.
Add the Swift Package, configure with your public SDK key, send your first event, capture an error, and verify entitlement state.
StartSet up the project, register your apps, and verify the first signal.
One mental model across browser, server, and CI. Same lifecycle, same API shape.
Pattern docs that turn the SDK from "events landing" into bank-grade observability.
Connect Apple, Google, and Stripe with verified webhooks and signed events.
Products are what users buy. Entitlements are what your app unlocks.
Track revenue state in real time as it changes — across every rail.
Query your payment rails directly and read their authoritative truth — live, precise, read-only.
Privacy-safe product behaviour — sessions, page views, custom events — joined to revenue and errors.
Capture uncaught exceptions, network failures, and runtime errors — with the paying customer attached. Real-time on every tier.
Billing, answers to the questions developers actually ask, and the fastest route to a human.
Configure once. Identify users. Track behaviour. Capture errors. Ask Crossdeck for entitlement state. Same shape on iOS, Android, web — and the server when v2.0 ships.
Crossdeck SDKs expose the same lifecycle in platform-native syntax. Learn it once, recognise it everywhere.
init (Web) / start (iOS, Android) — initialise with your app ID, public SDK key, and environmentidentify — link the current user to your auth IDtrack — send a behavioural event (page view, action, custom)captureError — report an exception with optional contextisEntitled — ask for the verified access statesyncPurchases — forward purchase evidence for verificationimport Crossdeck
// Auto-tracks app lifecycle + screen views and uncaught errors.
// start() throws on misconfig; degrade rather than crash launch.
let cd = try? Crossdeck.start(options: CrossdeckOptions(
appId: "app_ios_acme01",
publicKey: "cd_pub_live_xxx",
environment: .production
))
if let userId = AuthService.shared.currentUser?.id {
await cd?.identify(userId)
}
// Behavioural event
cd?.track("checkout_started", properties: ["product": "annual_pro"])
// Manually report a caught error
do { try await processCheckout() }
catch { cd?.captureError(error) }
// isEntitled is sync — microsecond cache read
if cd?.isEntitled("pro") == true {
showProFeatures()
}
import { Crossdeck } from "@cross-deck/web"
// One init. Subscriptions + analytics + errors all activate together.
// Auto-tracks page.viewed, sessions, and uncaught errors.
Crossdeck.init({
appId: "app_web_acme01",
publicKey: "cd_pub_live_xxx",
environment: "production",
})
// After your auth resolves the signed-in user
if (session?.user?.id) await Crossdeck.identify(session.user.id)
// Behavioural event
Crossdeck.track("checkout_started", { product: "annual_pro" })
// Manually report a caught error
try { await processCheckout() }
catch (err) { Crossdeck.captureError(err) }
// Real-time entitlement check — under 50ms, no await.
if (Crossdeck.isEntitled("pro")) showProFeatures()
Pick your stack — we generate a phased install prompt with your App ID and publishable key prefilled. Paste into Cursor, Claude Code, Gemini, or any AI tool that takes Markdown. The AI installs one phase at a time, you verify the dashboard gate, then continue. No big-bang failures.
The Crossdeck team helps developers verify SDK heartbeat, payment-rail credentials, product mappings, entitlement projections, and the sandbox-to-production handover.