# Production Readiness Checklist (/docs/sdk/production)



<Callout type="warn">
  The Layers SDKs are currently in **alpha**. Pin to an exact version
  and test thoroughly before production rollout — breaking changes can
  still land in 2.x before a stable 1.0 API is committed.
</Callout>

## Pre-release checklist [#pre-release-checklist]

* [ ] `appId` matches the intended production Layers project.
* [ ] `environment` is `production` for release builds (`development`
  for debug).
* [ ] `enableDebug` is OFF in release builds.
* [ ] SDK version pinned in your package manager.
* [ ] ATT prompt (iOS) fires at a sane moment — NOT on first launch —
  and `NSUserTrackingUsageDescription` is set.
* [ ] Consent wiring: `setConsent({ advertising, analytics })` is
  called from your CMP's grant / revoke callbacks.
* [ ] `setAppUserId(...)` is called on sign-in; `setAppUserId(undefined)`
  (or `clearAppUserId()`) is called on logout.
* [ ] For advanced matching, `setUserProperties({ email, phone })` or
  pre-hashed equivalents fire at sign-in.
* [ ] Canonical event names from [standard events](/docs/sdk/standard-events)
  are used where applicable.
* [ ] Test event end-to-end: fire → Events page → (if mapped) Meta Test
  Events / TikTok Events Debugger.
* [ ] Network confirms events hit `in.layers.com` (or your custom
  domain).

## Performance [#performance]

The SDK batches events and flushes them via `queueOptions`. If you have
very high event volume (e.g., per-frame game events), throttle /
aggregate client-side before calling `track` — per-event sampling is
NOT configured via the SDK today.

## Release-specific considerations [#release-specific-considerations]

### iOS [#ios]

Via React Native / Expo: handle ATT at the right moment. There is no
native Swift SDK, so no `PrivacyInfo.xcprivacy` manifest entry ships
from Layers — consult your privacy-manifest aggregator.

### Android [#android]

Via React Native / Expo: declare the Play Services ads identifier
dependency if you need GAID (the current RN module's podspec and
`peerDependencies` do not hard-require it).

## Consent & regional behaviors [#consent--regional-behaviors]

There is no `defaultConsent` or auto EU-detection today. If you serve
EU traffic, gate event firing behind your CMP's response:

```ts
if (userHasConsented) {
  await layers.setConsent({ advertising: true, analytics: true });
} else {
  await layers.setConsent({ advertising: false, analytics: false });
}
```

## Monitoring in production [#monitoring-in-production]

Watch these for the first 7 days of rollout:

* **Events page** — event volume tracks the expected curve.
* **Per-layer CAPI delivery** — no "degraded" warnings on the ad layer
  overview tab.
* **Attribution reconciliation** — compare Layers' Events page counts
  against Meta / TikTok dashboards for in-map events. ±20% is typical
  variance; anything larger deserves investigation.

## Rollback [#rollback]

To hot-disable ingestion for a project, pause the SDK app in the
Layers dashboard (Project → Layers SDK → Pause). The relay then drops
events for that `app_id` server-side. Re-enable when the client issue
is fixed. Paused events are lost for attribution purposes.
