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

# Permissions catalog

> Every per-site permission key, what it lets a person do, and which underlying role it requires.

Every member has a **role** (Admin, Dev, Viewer) and a set of **per-site
permission keys**. This page is the full inventory of the keys.

Toggle keys from **Team & access → Manage access** on a member row. See
[Members and roles](/team/members-and-roles) for the drawer and the
presets.

## Building

| Key                  | What it lets a person do                               | Requires |
| -------------------- | ------------------------------------------------------ | -------- |
| **Code editor**      | Edit variant JavaScript and CSS in the editor          | Dev      |
| **Edit assets**      | Upload, rename, and soft-delete files under **Assets** | Dev      |
| **Edit goals**       | Create, edit, clone, and delete goals in the library   | Dev      |
| **Edit locations**   | Create, edit, delete saved Locations                   | Dev      |
| **Edit audiences**   | Create, edit, delete saved Audiences                   | Dev      |
| **Exclusion groups** | Create and manage mutual exclusion groups              | Dev      |
| **Dev libraries**    | Register, approve, deprecate curated libraries         | Dev      |

## Publishing

| Key                      | What it lets a person do                    | Requires      |
| ------------------------ | ------------------------------------------- | ------------- |
| **Publish experiments**  | Start experiments, resume, republish        | Dev           |
| **Pause experiments**    | Pause a running experiment                  | Dev           |
| **Schedule experiments** | Set a start date, end date, or max run days | Dev + Publish |
| **Archive experiments**  | Archive or restore an experiment            | Dev           |

## Site shape

Changes to any of these change what the snippet does for every visitor.
They all require publish because none of them go live otherwise.

| Key                    | What it lets a person do                                   | Requires      |
| ---------------------- | ---------------------------------------------------------- | ------------- |
| **Global JS**          | Edit the site-wide JS that runs before every variant       | Dev + Publish |
| **SPA**                | Turn SPA mode on/off, edit apply/cleanup/waitFor templates | Dev + Publish |
| **Analytics adapters** | Turn GA4/Segment/RudderStack/Amplitude/Mixpanel on/off     | Dev + Publish |
| **Timezone**           | Change the site's project timezone                         | Admin         |
| **Currency**           | Change the site's reporting currency                       | Admin         |

## Data and security

| Key               | What it lets a person do                | Requires |
| ----------------- | --------------------------------------- | -------- |
| **Activity log**  | Read the audit trail                    | Any role |
| **IP block list** | Edit the list of blocked IPs and ranges | Admin    |

## Sensitive

These prompt for confirmation each time.

| Key                    | What it lets a person do                             | Requires |
| ---------------------- | ---------------------------------------------------- | -------- |
| **Delete experiments** | Permanently delete an experiment and its data        | Admin    |
| **Danger zone**        | Delete a site (removes all its experiments and data) | Admin    |

## Presets, again

For quick setup the drawer has:

* **Full access**, every key on.
* **Standard dev**, building + publish + pause + schedule; not IP block
  list, not danger zone.
* **View only**, nothing on. For a stakeholder who reads results.
* **Clear all**, every key off. Starting point for a bespoke role.

## Companion enforcement

The drawer will refuse to save an invalid combination. Concretely:

* Turning on **Global JS** without **Publish experiments** is impossible.
  the drawer flips Publish on with it.
* Same for **SPA**, **Analytics adapters**, and **Schedule experiments**.

If someone had Global JS on without Publish before this rule was added
(unlikely, but possible on old workspaces), the next save on their record
promotes Publish and warns you.

## Enforcement is server-side

The dashboard hides buttons a member does not have permission for. The
worker also refuses the API call. A malicious client cannot bypass the
UI to publish an experiment they do not have the key for.

## Where the rest of this fits

* The **role** is the ceiling. A Viewer cannot be granted publish, ever.
* Site scope decides which sites the keys apply to. A member scoped to
  one site cannot publish on another, no matter what keys they have.
* Admins have every key on every site by definition. Toggling keys on an
  Admin's row is a no-op.
