> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pushnotif.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Core concepts

> The handful of ideas everything else builds on.

## Workspace, app, member

A **workspace** is your company. It holds your team and your APNs key. An
**app** is one iOS app in one environment: production and staging are two apps.
Everything else (events, users, flows, sends) belongs to exactly one app.

**Members** have one of three roles:

| Role | Can |
| - | - |
| Owner | Everything, including managing other owners |
| Admin | Author and activate flows, invite teammates |
| Viewer | Read everything, change nothing |

## Events

An event is something a user did in your app, with a name and optional
properties: `lesson_completed` with `{"lesson_id": "abc"}`. The SDK also
reports [some events on its own](https://docs.pushnotif.ai/sdk/automatic-events.md), all starting with `$`.

Events are idempotent: each carries an id, and sending the same id twice
counts once. That is what makes the SDK's retries safe.

## Users and devices

The SDK knows a **device** from the moment it starts. When you call
`identify`, that device is linked to your **user** id, and events it sent
before then are attributed to the user too. One user can have many devices.
Flows reason about users. Sends go to their devices.

## Flows

A [flow](https://docs.pushnotif.ai/strategy/flows.md) is one notification rule: a pattern over a single
user's events, a message, and the limits it respects. Flows are
`proposed`, `active`, `paused` or `retired`. Only active flows send.

## Proposals

The [Composer](https://docs.pushnotif.ai/strategy/composer.md) suggests changes to your flows as
**proposals**: create, adjust, pause or retire. Each carries its diagnosis, the
evidence for it, and a confidence level. A proposal changes nothing until a
person approves it.

## Decisions and sends

Every time a flow matches, the engine records a **decision**: it sent, or it
suppressed the send and why (over a cap, in a cooldown, no device, held out).
A **send** then moves through:

```
scheduled -> sent -> accepted by APNs -> delivered -> opened / dismissed
```

**Quiet hours defer a send. Caps and cooldowns cancel it.** A push that lands
in a user's quiet hours goes out when they end, because the user still wants
it, just not at 3am.

## The holdout

A fixed share of each app's users (10% by default) is in the
[holdout](https://docs.pushnotif.ai/strategy/holdout.md) and never receives notifications, from flows or broadcasts. Comparing
them with everyone else is how you tell whether notifications help.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.