Pushlane overview
Pushlane is push-only lifecycle messaging for subscription apps. You send events from your iOS app; Pushlane decides who gets a push and when.
#What Pushlane does
Subscription apps live or die by a handful of moments — trial start, paywall view, first core action, day-7 lapse, renewal. Pushlane lets you build timed, branching push journeys that react to those moments without you running a backend scheduler.
The mental model has three moving parts:
- Events — your app calls
Pushlane.track(); every event arrives at the ingest endpoint and is stored in ClickHouse with a typed catalogue. - Flows — visual journeys you build on the canvas. A flow listens for an event (or audience membership, or a schedule) and steps a user through delays, branches, and push message nodes.
- Delivery — when a message node fires, Pushlane checks marketing consent, frequency caps, and time-window rules, then sends the push to Apple APNs via the Go sender on Fly.io.
#Key concepts at a glance
| Concept | What it is |
|---|---|
| Write-key | An lpk_live_… token that authenticates every SDK and API call. Your tenant is derived server-side from the key — it cannot be spoofed from the request body. Found under Settings → API keys. |
| External ID | Your own stable user ID (UUID, Supabase UID, etc.). Pass it to Pushlane.identify() before tracking events. Pushlane maps it to a dense internal surrogate and never re-resolves it per event. |
| Catalogue | The typed registry of event names and property types for your tenant. It fills in automatically as events arrive — no manual schema step required. Declare explicit types in the dashboard to lock them down. |
| Consent (R10) | Pushlane checks app.consent_current for a marketing opt-in before every send. No opt-in row = suppressed. The suppression is always logged — nothing is silently dropped. |
| Flow IR | The compiled representation of a flow. Every node type (entry, delay, branch, message, exit…) is validated against a Zod schema before a flow can be activated. The worker executes this IR inside a per-user Durable Object. |
| FlowUserDO | One Cloudflare Durable Object per user. It holds all flow instances, timers, frequency-cap sliding windows, and send dedup markers for that user — strongly consistent and serialised per user. |
#The ingest pipeline in one sentence
POST /v1/events → identity resolve → shard queue → dedup gate → catalogue coerce → ClickHouse insert → OTel spans → FlowUserDO → decision log → consent check → APNs.
Every step is observable: OTel traces span the full path from the SDK call to the APNs acknowledgement on a single W3C traceparent. The Logs tab in the dashboard shows the decision_log row for every send and every suppression.
#Push-only scope
Transactional emails (receipts, password reset, GDPR exports) are handled by your existing email provider and are explicitly outside Pushlane.
#Where to go next
- iOS Quickstart — install the SDK, register a device, and send your first push in under 10 minutes.
- How Pushlane works — the ingest → decision → delivery pipeline, step by step.
- Events & catalogue — what to track and how the catalogue builds itself.
- Building flows — the canvas, node types, and how to activate a flow.