# SDKs (https://www.getfounderhq.com/docs/analytics/sdks)

One capture protocol, five SDKs. Pick the one that matches where your
code runs, then follow that page.

<Callout title="Before you start">
You need a brand and its keys. Copy a publishable key (`fhq_pk_...`) for
browsers and apps. Copy a secret key (`fhq_sk_...`) for servers. See
[Getting started](/analytics/getting-started).
</Callout>

## Pick an SDK

| SDK | Package | Key | Use it for |
| --- | --- | --- | --- |
| [Web](/analytics/sdks/web) | `@founderhq/events` | publishable | Websites and web apps |
| [React Native](/analytics/sdks/react-native) | `@founderhq/events-react-native` | publishable | React Native and Expo apps |
| [iOS](/analytics/sdks/ios) | `FounderHQEvents` (SwiftPM, CocoaPods) | publishable | Swift and SwiftUI apps |
| [Android](/analytics/sdks/android) | `com.getfounderhq:events` | publishable | Kotlin and Compose apps |
| [Node](/analytics/sdks/node) | `@founderhq/events-node` | secret | Your backend |

## What every client SDK does

The web, React Native, iOS, and Android SDKs share one surface.

| You call | It does |
| --- | --- |
| `capture` | Records one event with your own properties |
| `identify` | Ties the visitor to a contact you know |
| `setAccount` | Says which account the activity belongs to |
| `setPersonProperties` | Updates contact properties |
| `register` / `registerOnce` / `unregister` | Adds properties to every later event |
| `optIn` / `optOut` / `isOptedOut` | Controls capture consent on the device |
| `getDistinctId` / `getSessionId` | Reads the current identity and session |
| `reset` | Clears identity and account on logout |
| `flush` / `close` | Sends queued events now |

Every client SDK queues events, persists them across restarts, retries
failures, and sends them in batches. Each one also captures screens or
pageviews, sessions, and app or page lifecycle on its own.

## What the Node SDK does instead

The Node SDK carries no device state. It has no sessions, no automatic
capture, and no consent switches. You name the contact on every call, and
you use a secret key. It is also the only SDK that can record account
membership changes and send revenue commands.

## The protocol underneath

Client SDKs send `POST /i/v2/e` with a publishable key. The Node SDK sends
`POST /api/events` with a secret key. Both use one property namespace, one
event shape, and per-event acknowledgements.

Read the [protocol reference](/analytics/protocol-reference) when you need the
wire format, the reserved event names, or the campaign property list.
