# SDK — Expo (/docs/sdk/expo)



<Callout type="warn">
  **Status: alpha.** `@layers/expo` is published to npm (current version
  at the time of writing: `2.2.0`). It is a convenience wrapper that
  depends on `@layers/react-native` and ships an Expo config plugin.
</Callout>

## Install [#install]

```bash
npx expo install @layers/expo
```

## Configure the plugin [#configure-the-plugin]

Add to `app.json` / `app.config.ts`:

```json
{
  "expo": {
    "plugins": [
      ["@layers/expo", {
        "appId": "app_xxx",
        "iosUserTrackingUsageDescription": "We use this to personalize your experience."
      }]
    ]
  }
}
```

The plugin wires the iOS `NSUserTrackingUsageDescription`
`Info.plist` key and the Android permissions required by the underlying
`@layers/react-native` native module.

## Use the SDK [#use-the-sdk]

Initialization and runtime APIs come from `@layers/react-native` — see
the [React Native guide](/docs/sdk/react-native) for the full API
surface.

```ts
import Layers from '@layers/expo';

await Layers.init({
  apiKey: 'unused-but-required-by-type',
  appId: 'app_xxx',
  environment: __DEV__ ? 'development' : 'production',
});

await Layers.track('purchase_success', { revenue: 9.99, currency: 'USD' });
```

## ATT [#att]

```ts
import Layers from '@layers/expo';
await Layers.requestTracking();
```

## Expo Go [#expo-go]

The underlying React Native package has native modules (ATT, SKAN), so
full functionality requires a **development build**. Expo Go can still
run `track`, `screen`, and `setUserProperties` — anything that doesn't
touch native APIs.

## EAS Build [#eas-build]

EAS Build picks up the config plugin automatically — no extra steps.

```bash
eas build --platform ios
eas build --platform android
```
