---
title: "feature.created"
source: GrowthBook
source_url: https://github.com/growthbook/growthbook
licence: MIT
domain: data-and-analysis
subdomain: growthbook-docs
date_added: 2026-04-25
---

| Event name | Description |
  |------------|-------------|
  | **[feature.created](#featurecreated)** | Triggered when a feature is created |
| **[feature.updated](#featureupdated)** | Triggered when a feature is updated |
| **[feature.deleted](#featuredeleted)** | Triggered when a feature is deleted |
| **[feature.saferollout.ship](#featuresaferolloutship)** | Triggered when a safe rollout is completed and safe to rollout to 100%. |
| **[feature.saferollout.rollback](#featuresaferolloutrollback)** | Triggered when a safe rollout has a failing guardrail and should be reverted. |
| **[feature.saferollout.unhealthy](#featuresaferolloutunhealthy)** | Triggered when a safe rollout is failing a health check and may not be working as expected. |
| **[feature.rampSchedule.created](#featurerampSchedulecreated)** | Triggered when a ramp schedule is created for a feature |
| **[feature.rampSchedule.deleted](#featurerampScheduledeleted)** | Triggered when a ramp schedule is deleted from a feature |
| **[feature.rampSchedule.actions.started](#featurerampScheduleactionsstarted)** | Triggered when a feature ramp schedule starts |
| **[feature.rampSchedule.actions.completed](#featurerampScheduleactionscompleted)** | Triggered when a feature ramp schedule completes all steps |
| **[feature.rampSchedule.actions.rolledBack](#featurerampScheduleactionsrolledBack)** | Triggered when a feature ramp schedule is rolled back or reset to start |
| **[feature.rampSchedule.actions.jumped](#featurerampScheduleactionsjumped)** | Triggered when a feature ramp schedule is jumped to a specific step |
| **[feature.rampSchedule.actions.step.advanced](#featurerampScheduleactionsstepadvanced)** | Triggered when a feature ramp schedule advances to the next step |
| **[feature.rampSchedule.actions.step.approvalRequired](#featurerampScheduleactionsstepapprovalRequired)** | Triggered when a feature ramp step is waiting for approval |
| **[feature.revision.created](#featurerevisioncreated)** | Triggered when a new draft revision is created for a feature |
| **[feature.revision.updated](#featurerevisionupdated)** | Triggered when a draft revision is modified (rules, default value, toggles, prerequisites, metadata, etc.). The `change` field indicates the specific kind of mutation. |
| **[feature.revision.reviewRequested](#featurerevisionreviewRequested)** | Triggered when a draft revision is submitted for review |
| **[feature.revision.approved](#featurerevisionapproved)** | Triggered when a draft revision is approved by a reviewer |
| **[feature.revision.changesRequested](#featurerevisionchangesRequested)** | Triggered when a reviewer requests changes on a draft revision |
| **[feature.revision.commented](#featurerevisioncommented)** | Triggered when a comment is added to a draft revision |
| **[feature.revision.discarded](#featurerevisiondiscarded)** | Triggered when a draft revision is discarded |
| **[feature.revision.rebased](#featurerevisionrebased)** | Triggered when a draft revision is rebased onto the latest published version |
| **[feature.revision.published](#featurerevisionpublished)** | Triggered when a draft revision is published. Overlaps with `feature.updated` but provides revision-specific context (base version, comment, author). |
| **[feature.revision.reverted](#featurerevisionreverted)** | Triggered when a feature is reverted to a previous published revision |
| **[experiment.created](#experimentcreated)** | Triggered when an experiment is created |
| **[experiment.updated](#experimentupdated)** | Triggered when an experiment is updated |
| **[experiment.deleted](#experimentdeleted)** | Triggered when an experiment is deleted |
| **[experiment.warning](#experimentwarning)** | Triggered when a warning condition is detected on an experiment |
| **[experiment.info.significance](#experimentinfosignificance)** | Triggered when a goal or guardrail metric reaches significance in an experiment (e.g. either above 95% or below 5% chance to win). Be careful using this without Sequential Testing as it can lead to peeking problems. |
| **[experiment.decision.ship](#experimentdecisionship)** | Triggered when an experiment is ready to ship a variation. |
| **[experiment.decision.rollback](#experimentdecisionrollback)** | Triggered when an experiment should be rolled back to the control. |
| **[experiment.decision.review](#experimentdecisionreview)** | Triggered when an experiment has reached the desired power point, but the results may be ambiguous. |
| **[user.login](#userlogin)** | Triggered when a user logs in |
  
### feature.created

Triggered when a feature is created

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.created";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            id: string;
            dateCreated: string;
            dateUpdated: string;
            archived: boolean;
            description: string;
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner: string;
            project: string;
            valueType: "boolean" | "string" | "number" | "json";
            defaultValue: string;
            tags: string[];
            environments: Record<string, any>;
            /** Feature IDs. Each feature must evaluate to `true` */
            prerequisites?: string[] | undefined;
            revision: {
                version: number;
                comment: string;
                date: string;
                createdBy: string;
                publishedBy: string;
            };
            customFields?: Record<string, {}> | undefined;
            holdout?: ({
                /** Holdout ID */
                id: string;
                /** The feature value assigned to users in the holdout treatment group */
                value: string;
            } | null) | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.updated

Triggered when a feature is updated

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.updated";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            id: string;
            dateCreated: string;
            dateUpdated: string;
            archived: boolean;
            description: string;
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner: string;
            project: string;
            valueType: "boolean" | "string" | "number" | "json";
            defaultValue: string;
            tags: string[];
            environments: Record<string, any>;
            /** Feature IDs. Each feature must evaluate to `true` */
            prerequisites?: string[] | undefined;
            revision: {
                version: number;
                comment: string;
                date: string;
                createdBy: string;
                publishedBy: string;
            };
            customFields?: Record<string, {}> | undefined;
            holdout?: ({
                /** Holdout ID */
                id: string;
                /** The feature value assigned to users in the holdout treatment group */
                value: string;
            } | null) | undefined;
        };
        previous_attributes: {
            id?: string | undefined;
            dateCreated?: string | undefined;
            dateUpdated?: string | undefined;
            archived?: boolean | undefined;
            description?: string | undefined;
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner?: string | undefined;
            project?: string | undefined;
            valueType?: ("boolean" | "string" | "number" | "json") | undefined;
            defaultValue?: string | undefined;
            tags?: string[] | undefined;
            environments?: Record<string, any> | undefined;
            /** Feature IDs. Each feature must evaluate to `true` */
            prerequisites?: string[] | undefined;
            revision?: {
                version: number;
                comment: string;
                date: string;
                createdBy: string;
                publishedBy: string;
            } | undefined;
            customFields?: Record<string, {}> | undefined;
            holdout?: ({
                /** Holdout ID */
                id: string;
                /** The feature value assigned to users in the holdout treatment group */
                value: string;
            } | null) | undefined;
        };
        changes?: {
            added: Record<string, unknown>;
            removed: Record<string, unknown>;
            modified: Record<string, unknown>;
        } | undefined;
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.deleted

Triggered when a feature is deleted

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.deleted";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            id: string;
            dateCreated: string;
            dateUpdated: string;
            archived: boolean;
            description: string;
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner: string;
            project: string;
            valueType: "boolean" | "string" | "number" | "json";
            defaultValue: string;
            tags: string[];
            environments: Record<string, any>;
            /** Feature IDs. Each feature must evaluate to `true` */
            prerequisites?: string[] | undefined;
            revision: {
                version: number;
                comment: string;
                date: string;
                createdBy: string;
                publishedBy: string;
            };
            customFields?: Record<string, {}> | undefined;
            holdout?: ({
                /** Holdout ID */
                id: string;
                /** The feature value assigned to users in the holdout treatment group */
                value: string;
            } | null) | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.saferollout.ship

Triggered when a safe rollout is completed and safe to rollout to 100%.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.saferollout.ship";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            featureId: string;
            safeRolloutId: string;
            environment: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.saferollout.rollback

Triggered when a safe rollout has a failing guardrail and should be reverted.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.saferollout.rollback";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            featureId: string;
            safeRolloutId: string;
            environment: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.saferollout.unhealthy

Triggered when a safe rollout is failing a health check and may not be working as expected.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.saferollout.unhealthy";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            featureId: string;
            safeRolloutId: string;
            environment: string;
            unhealthyReason: ("srm" | "multipleExposures")[];
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.created

Triggered when a ramp schedule is created for a feature

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.created";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            entityType: string;
            entityId: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.deleted

Triggered when a ramp schedule is deleted from a feature

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.deleted";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.actions.started

Triggered when a feature ramp schedule starts

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.actions.started";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            currentStepIndex: number;
            status: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.actions.completed

Triggered when a feature ramp schedule completes all steps

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.actions.completed";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            currentStepIndex: number;
            status: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.actions.rolledBack

Triggered when a feature ramp schedule is rolled back or reset to start

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.actions.rolledBack";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            currentStepIndex: number;
            status: string;
            targetStepIndex: number;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.actions.jumped

Triggered when a feature ramp schedule is jumped to a specific step

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.actions.jumped";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            currentStepIndex: number;
            status: string;
            targetStepIndex: number;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.actions.step.advanced

Triggered when a feature ramp schedule advances to the next step

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.actions.step.advanced";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            currentStepIndex: number;
            status: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.rampSchedule.actions.step.approvalRequired

Triggered when a feature ramp step is waiting for approval

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.rampSchedule.actions.step.approvalRequired";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            rampScheduleId: string;
            rampName: string;
            orgId: string;
            currentStepIndex: number;
            status: string;
            approvalNotes?: (string | null) | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.created

Triggered when a new draft revision is created for a feature

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.created";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.updated

Triggered when a draft revision is modified (rules, default value, toggles, prerequisites, metadata, etc.). The `change` field indicates the specific kind of mutation.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.updated";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
            change: "rule.add" | "rule.update" | "rule.delete" | "rule.reorder" | "rule.rampSchedule.set" | "rule.rampSchedule.remove" | "toggle" | "defaultValue" | "prerequisites" | "holdout" | "archive" | "metadata";
            environments?: string[] | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.reviewRequested

Triggered when a draft revision is submitted for review

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.reviewRequested";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
            reviewComment: string | null;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.approved

Triggered when a draft revision is approved by a reviewer

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.approved";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
            reviewer: {
                id?: string | undefined;
                name?: string | undefined;
                email?: string | undefined;
            };
            reviewComment: string | null;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.changesRequested

Triggered when a reviewer requests changes on a draft revision

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.changesRequested";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
            reviewer: {
                id?: string | undefined;
                name?: string | undefined;
                email?: string | undefined;
            };
            reviewComment: string | null;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.commented

Triggered when a comment is added to a draft revision

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.commented";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
            reviewer: {
                id?: string | undefined;
                name?: string | undefined;
                email?: string | undefined;
            };
            reviewComment: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.discarded

Triggered when a draft revision is discarded

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.discarded";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.rebased

Triggered when a draft revision is rebased onto the latest published version

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.rebased";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.published

Triggered when a draft revision is published. Overlaps with `feature.updated` but provides revision-specific context (base version, comment, author).

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.published";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### feature.revision.reverted

Triggered when a feature is reverted to a previous published revision

<details>
  <summary>Payload</summary>

```typescript
{
    event: "feature.revision.reverted";
    object: "feature";
    api_version: string;
    created: number;
    data: {
        object: {
            /** The feature this revision belongs to */
            featureId: string;
            baseVersion: number;
            version: number;
            comment: string;
            date: string;
            status: string;
            createdBy?: string | undefined;
            publishedBy?: string | undefined;
            /** The default value at the time this revision was created */
            defaultValue?: string | undefined;
            rules: Record<string, any[]>;
            definitions?: Record<string, string> | undefined;
            environmentsEnabled?: Record<string, boolean> | undefined;
            envPrerequisites?: Record<string, {
                /** Feature ID */
                id: string;
                condition: string;
            }[]> | undefined;
            prerequisites?: {
                /** Feature ID */
                id: string;
                condition: string;
            }[] | undefined;
            metadata?: {} | undefined;
            revertedToVersion: number;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.created

Triggered when an experiment is created

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.created";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            id: string;
            trackingKey: string;
            dateCreated: string;
            dateUpdated: string;
            name: string;
            type: "standard" | "multi-armed-bandit";
            project: string;
            hypothesis: string;
            description: string;
            tags: string[];
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner: string;
            ownerEmail?: string | undefined;
            archived: boolean;
            status: string;
            autoRefresh: boolean;
            hashAttribute: string;
            fallbackAttribute?: string | undefined;
            hashVersion: 1 | 2;
            disableStickyBucketing?: boolean | undefined;
            bucketVersion?: number | undefined;
            minBucketVersion?: number | undefined;
            variations: {
                variationId: string;
                key: string;
                name: string;
                description: string;
                screenshots: string[];
            }[];
            phases: {
                name: string;
                dateStarted: string;
                dateEnded: string;
                reasonForStopping: string;
                seed: string;
                coverage: number;
                trafficSplit: {
                    variationId: string;
                    weight: number;
                }[];
                namespace?: {
                    namespaceId: string;
                    enabled?: boolean | undefined;
                    range?: number[] | undefined;
                    ranges?: [
                        number,
                        number
                    ][] | undefined;
                } | undefined;
                targetingCondition: string;
                prerequisites?: {
                    id: string;
                    condition: string;
                }[] | undefined;
                savedGroupTargeting?: {
                    matchType: "all" | "any" | "none";
                    savedGroups: string[];
                }[] | undefined;
            }[];
            settings: {
                datasourceId: string;
                assignmentQueryId: string;
                experimentId: string;
                segmentId: string;
                queryFilter: string;
                inProgressConversions: "include" | "exclude";
                /** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
                attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
                /** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
                lookbackOverride?: {
                    type: "date" | "window";
                    /** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
                    value: number | string;
                    /** Used when type is "window". Defaults to "days". */
                    valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
                } | undefined;
                statsEngine: "bayesian" | "frequentist";
                regressionAdjustmentEnabled?: boolean | undefined;
                sequentialTestingEnabled?: boolean | undefined;
                sequentialTestingTuningParameter?: number | undefined;
                /** When null, the organization default is used. */
                postStratificationEnabled?: (boolean | null) | undefined;
                /** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
                decisionFrameworkSettings?: {
                    decisionCriteriaId?: string | undefined;
                    decisionFrameworkMetricOverrides?: {
                        /** ID of the metric to override settings for. */
                        id: string;
                        /** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
                        targetMDE?: number | undefined;
                    }[] | undefined;
                } | undefined;
                /** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
                metricOverrides?: {
                    /** ID of the metric to override settings for. */
                    id: string;
                    windowType?: ("conversion" | "lookback" | "") | undefined;
                    windowHours?: number | undefined;
                    delayHours?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
                    properPriorOverride?: boolean | undefined;
                    properPriorEnabled?: boolean | undefined;
                    properPriorMean?: number | undefined;
                    properPriorStdDev?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
                    regressionAdjustmentOverride?: boolean | undefined;
                    regressionAdjustmentEnabled?: boolean | undefined;
                    regressionAdjustmentDays?: number | undefined;
                }[] | undefined;
                goals: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                secondaryMetrics: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                guardrails: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                activationMetric?: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                } | undefined;
            };
            resultSummary?: {
                status: string;
                winner: string;
                conclusions: string;
                releasedVariationId: string;
                excludeFromPayload: boolean;
            } | undefined;
            shareLevel?: ("public" | "organization") | undefined;
            publicUrl?: string | undefined;
            banditScheduleValue?: number | undefined;
            banditScheduleUnit?: ("days" | "hours") | undefined;
            banditBurnInValue?: number | undefined;
            banditBurnInUnit?: ("days" | "hours") | undefined;
            banditConversionWindowValue?: number | undefined;
            banditConversionWindowUnit?: ("days" | "hours") | undefined;
            linkedFeatures?: string[] | undefined;
            hasVisualChangesets?: boolean | undefined;
            hasURLRedirects?: boolean | undefined;
            customFields?: Record<string, any> | undefined;
            /** Custom slices that apply to ALL applicable metrics in the experiment */
            customMetricSlices?: {
                slices: {
                    column: string;
                    levels: string[];
                }[];
            }[] | undefined;
            /** ID of the default dashboard for this experiment. */
            defaultDashboardId?: string | undefined;
            templateId?: string | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.updated

Triggered when an experiment is updated

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.updated";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            id: string;
            trackingKey: string;
            dateCreated: string;
            dateUpdated: string;
            name: string;
            type: "standard" | "multi-armed-bandit";
            project: string;
            hypothesis: string;
            description: string;
            tags: string[];
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner: string;
            ownerEmail?: string | undefined;
            archived: boolean;
            status: string;
            autoRefresh: boolean;
            hashAttribute: string;
            fallbackAttribute?: string | undefined;
            hashVersion: 1 | 2;
            disableStickyBucketing?: boolean | undefined;
            bucketVersion?: number | undefined;
            minBucketVersion?: number | undefined;
            variations: {
                variationId: string;
                key: string;
                name: string;
                description: string;
                screenshots: string[];
            }[];
            phases: {
                name: string;
                dateStarted: string;
                dateEnded: string;
                reasonForStopping: string;
                seed: string;
                coverage: number;
                trafficSplit: {
                    variationId: string;
                    weight: number;
                }[];
                namespace?: {
                    namespaceId: string;
                    enabled?: boolean | undefined;
                    range?: number[] | undefined;
                    ranges?: [
                        number,
                        number
                    ][] | undefined;
                } | undefined;
                targetingCondition: string;
                prerequisites?: {
                    id: string;
                    condition: string;
                }[] | undefined;
                savedGroupTargeting?: {
                    matchType: "all" | "any" | "none";
                    savedGroups: string[];
                }[] | undefined;
            }[];
            settings: {
                datasourceId: string;
                assignmentQueryId: string;
                experimentId: string;
                segmentId: string;
                queryFilter: string;
                inProgressConversions: "include" | "exclude";
                /** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
                attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
                /** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
                lookbackOverride?: {
                    type: "date" | "window";
                    /** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
                    value: number | string;
                    /** Used when type is "window". Defaults to "days". */
                    valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
                } | undefined;
                statsEngine: "bayesian" | "frequentist";
                regressionAdjustmentEnabled?: boolean | undefined;
                sequentialTestingEnabled?: boolean | undefined;
                sequentialTestingTuningParameter?: number | undefined;
                /** When null, the organization default is used. */
                postStratificationEnabled?: (boolean | null) | undefined;
                /** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
                decisionFrameworkSettings?: {
                    decisionCriteriaId?: string | undefined;
                    decisionFrameworkMetricOverrides?: {
                        /** ID of the metric to override settings for. */
                        id: string;
                        /** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
                        targetMDE?: number | undefined;
                    }[] | undefined;
                } | undefined;
                /** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
                metricOverrides?: {
                    /** ID of the metric to override settings for. */
                    id: string;
                    windowType?: ("conversion" | "lookback" | "") | undefined;
                    windowHours?: number | undefined;
                    delayHours?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
                    properPriorOverride?: boolean | undefined;
                    properPriorEnabled?: boolean | undefined;
                    properPriorMean?: number | undefined;
                    properPriorStdDev?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
                    regressionAdjustmentOverride?: boolean | undefined;
                    regressionAdjustmentEnabled?: boolean | undefined;
                    regressionAdjustmentDays?: number | undefined;
                }[] | undefined;
                goals: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                secondaryMetrics: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                guardrails: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                activationMetric?: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                } | undefined;
            };
            resultSummary?: {
                status: string;
                winner: string;
                conclusions: string;
                releasedVariationId: string;
                excludeFromPayload: boolean;
            } | undefined;
            shareLevel?: ("public" | "organization") | undefined;
            publicUrl?: string | undefined;
            banditScheduleValue?: number | undefined;
            banditScheduleUnit?: ("days" | "hours") | undefined;
            banditBurnInValue?: number | undefined;
            banditBurnInUnit?: ("days" | "hours") | undefined;
            banditConversionWindowValue?: number | undefined;
            banditConversionWindowUnit?: ("days" | "hours") | undefined;
            linkedFeatures?: string[] | undefined;
            hasVisualChangesets?: boolean | undefined;
            hasURLRedirects?: boolean | undefined;
            customFields?: Record<string, any> | undefined;
            /** Custom slices that apply to ALL applicable metrics in the experiment */
            customMetricSlices?: {
                slices: {
                    column: string;
                    levels: string[];
                }[];
            }[] | undefined;
            /** ID of the default dashboard for this experiment. */
            defaultDashboardId?: string | undefined;
            templateId?: string | undefined;
        };
        previous_attributes: {
            id?: string | undefined;
            trackingKey?: string | undefined;
            dateCreated?: string | undefined;
            dateUpdated?: string | undefined;
            name?: string | undefined;
            type?: ("standard" | "multi-armed-bandit") | undefined;
            project?: string | undefined;
            hypothesis?: string | undefined;
            description?: string | undefined;
            tags?: string[] | undefined;
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner?: string | undefined;
            ownerEmail?: string | undefined;
            archived?: boolean | undefined;
            status?: string | undefined;
            autoRefresh?: boolean | undefined;
            hashAttribute?: string | undefined;
            fallbackAttribute?: string | undefined;
            hashVersion?: (1 | 2) | undefined;
            disableStickyBucketing?: boolean | undefined;
            bucketVersion?: number | undefined;
            minBucketVersion?: number | undefined;
            variations?: {
                variationId: string;
                key: string;
                name: string;
                description: string;
                screenshots: string[];
            }[] | undefined;
            phases?: {
                name: string;
                dateStarted: string;
                dateEnded: string;
                reasonForStopping: string;
                seed: string;
                coverage: number;
                trafficSplit: {
                    variationId: string;
                    weight: number;
                }[];
                namespace?: {
                    namespaceId: string;
                    enabled?: boolean | undefined;
                    range?: number[] | undefined;
                    ranges?: [
                        number,
                        number
                    ][] | undefined;
                } | undefined;
                targetingCondition: string;
                prerequisites?: {
                    id: string;
                    condition: string;
                }[] | undefined;
                savedGroupTargeting?: {
                    matchType: "all" | "any" | "none";
                    savedGroups: string[];
                }[] | undefined;
            }[] | undefined;
            settings?: {
                datasourceId: string;
                assignmentQueryId: string;
                experimentId: string;
                segmentId: string;
                queryFilter: string;
                inProgressConversions: "include" | "exclude";
                /** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
                attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
                /** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
                lookbackOverride?: {
                    type: "date" | "window";
                    /** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
                    value: number | string;
                    /** Used when type is "window". Defaults to "days". */
                    valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
                } | undefined;
                statsEngine: "bayesian" | "frequentist";
                regressionAdjustmentEnabled?: boolean | undefined;
                sequentialTestingEnabled?: boolean | undefined;
                sequentialTestingTuningParameter?: number | undefined;
                /** When null, the organization default is used. */
                postStratificationEnabled?: (boolean | null) | undefined;
                /** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
                decisionFrameworkSettings?: {
                    decisionCriteriaId?: string | undefined;
                    decisionFrameworkMetricOverrides?: {
                        /** ID of the metric to override settings for. */
                        id: string;
                        /** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
                        targetMDE?: number | undefined;
                    }[] | undefined;
                } | undefined;
                /** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
                metricOverrides?: {
                    /** ID of the metric to override settings for. */
                    id: string;
                    windowType?: ("conversion" | "lookback" | "") | undefined;
                    windowHours?: number | undefined;
                    delayHours?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
                    properPriorOverride?: boolean | undefined;
                    properPriorEnabled?: boolean | undefined;
                    properPriorMean?: number | undefined;
                    properPriorStdDev?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
                    regressionAdjustmentOverride?: boolean | undefined;
                    regressionAdjustmentEnabled?: boolean | undefined;
                    regressionAdjustmentDays?: number | undefined;
                }[] | undefined;
                goals: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                secondaryMetrics: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                guardrails: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                activationMetric?: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                } | undefined;
            } | undefined;
            resultSummary?: {
                status: string;
                winner: string;
                conclusions: string;
                releasedVariationId: string;
                excludeFromPayload: boolean;
            } | undefined;
            shareLevel?: ("public" | "organization") | undefined;
            publicUrl?: string | undefined;
            banditScheduleValue?: number | undefined;
            banditScheduleUnit?: ("days" | "hours") | undefined;
            banditBurnInValue?: number | undefined;
            banditBurnInUnit?: ("days" | "hours") | undefined;
            banditConversionWindowValue?: number | undefined;
            banditConversionWindowUnit?: ("days" | "hours") | undefined;
            linkedFeatures?: string[] | undefined;
            hasVisualChangesets?: boolean | undefined;
            hasURLRedirects?: boolean | undefined;
            customFields?: Record<string, any> | undefined;
            /** Custom slices that apply to ALL applicable metrics in the experiment */
            customMetricSlices?: {
                slices: {
                    column: string;
                    levels: string[];
                }[];
            }[] | undefined;
            /** ID of the default dashboard for this experiment. */
            defaultDashboardId?: string | undefined;
            templateId?: string | undefined;
        };
        changes?: {
            added: Record<string, unknown>;
            removed: Record<string, unknown>;
            modified: Record<string, unknown>;
        } | undefined;
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.deleted

Triggered when an experiment is deleted

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.deleted";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            id: string;
            trackingKey: string;
            dateCreated: string;
            dateUpdated: string;
            name: string;
            type: "standard" | "multi-armed-bandit";
            project: string;
            hypothesis: string;
            description: string;
            tags: string[];
            /** The userId of the owner (or raw owner name/email for legacy records) */
            owner: string;
            ownerEmail?: string | undefined;
            archived: boolean;
            status: string;
            autoRefresh: boolean;
            hashAttribute: string;
            fallbackAttribute?: string | undefined;
            hashVersion: 1 | 2;
            disableStickyBucketing?: boolean | undefined;
            bucketVersion?: number | undefined;
            minBucketVersion?: number | undefined;
            variations: {
                variationId: string;
                key: string;
                name: string;
                description: string;
                screenshots: string[];
            }[];
            phases: {
                name: string;
                dateStarted: string;
                dateEnded: string;
                reasonForStopping: string;
                seed: string;
                coverage: number;
                trafficSplit: {
                    variationId: string;
                    weight: number;
                }[];
                namespace?: {
                    namespaceId: string;
                    enabled?: boolean | undefined;
                    range?: number[] | undefined;
                    ranges?: [
                        number,
                        number
                    ][] | undefined;
                } | undefined;
                targetingCondition: string;
                prerequisites?: {
                    id: string;
                    condition: string;
                }[] | undefined;
                savedGroupTargeting?: {
                    matchType: "all" | "any" | "none";
                    savedGroups: string[];
                }[] | undefined;
            }[];
            settings: {
                datasourceId: string;
                assignmentQueryId: string;
                experimentId: string;
                segmentId: string;
                queryFilter: string;
                inProgressConversions: "include" | "exclude";
                /** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
                attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
                /** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
                lookbackOverride?: {
                    type: "date" | "window";
                    /** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
                    value: number | string;
                    /** Used when type is "window". Defaults to "days". */
                    valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
                } | undefined;
                statsEngine: "bayesian" | "frequentist";
                regressionAdjustmentEnabled?: boolean | undefined;
                sequentialTestingEnabled?: boolean | undefined;
                sequentialTestingTuningParameter?: number | undefined;
                /** When null, the organization default is used. */
                postStratificationEnabled?: (boolean | null) | undefined;
                /** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
                decisionFrameworkSettings?: {
                    decisionCriteriaId?: string | undefined;
                    decisionFrameworkMetricOverrides?: {
                        /** ID of the metric to override settings for. */
                        id: string;
                        /** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
                        targetMDE?: number | undefined;
                    }[] | undefined;
                } | undefined;
                /** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
                metricOverrides?: {
                    /** ID of the metric to override settings for. */
                    id: string;
                    windowType?: ("conversion" | "lookback" | "") | undefined;
                    windowHours?: number | undefined;
                    delayHours?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
                    properPriorOverride?: boolean | undefined;
                    properPriorEnabled?: boolean | undefined;
                    properPriorMean?: number | undefined;
                    properPriorStdDev?: number | undefined;
                    /** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
                    regressionAdjustmentOverride?: boolean | undefined;
                    regressionAdjustmentEnabled?: boolean | undefined;
                    regressionAdjustmentDays?: number | undefined;
                }[] | undefined;
                goals: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                secondaryMetrics: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                guardrails: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                }[];
                activationMetric?: {
                    metricId: string;
                    overrides: {
                        delayHours?: number | undefined;
                        windowHours?: number | undefined;
                        window?: ("conversion" | "lookback" | "") | undefined;
                        winRiskThreshold?: number | undefined;
                        loseRiskThreshold?: number | undefined;
                        properPriorOverride?: boolean | undefined;
                        properPriorEnabled?: boolean | undefined;
                        properPriorMean?: number | undefined;
                        properPriorStdDev?: number | undefined;
                        regressionAdjustmentOverride?: boolean | undefined;
                        regressionAdjustmentEnabled?: boolean | undefined;
                        regressionAdjustmentDays?: number | undefined;
                    };
                } | undefined;
            };
            resultSummary?: {
                status: string;
                winner: string;
                conclusions: string;
                releasedVariationId: string;
                excludeFromPayload: boolean;
            } | undefined;
            shareLevel?: ("public" | "organization") | undefined;
            publicUrl?: string | undefined;
            banditScheduleValue?: number | undefined;
            banditScheduleUnit?: ("days" | "hours") | undefined;
            banditBurnInValue?: number | undefined;
            banditBurnInUnit?: ("days" | "hours") | undefined;
            banditConversionWindowValue?: number | undefined;
            banditConversionWindowUnit?: ("days" | "hours") | undefined;
            linkedFeatures?: string[] | undefined;
            hasVisualChangesets?: boolean | undefined;
            hasURLRedirects?: boolean | undefined;
            customFields?: Record<string, any> | undefined;
            /** Custom slices that apply to ALL applicable metrics in the experiment */
            customMetricSlices?: {
                slices: {
                    column: string;
                    levels: string[];
                }[];
            }[] | undefined;
            /** ID of the default dashboard for this experiment. */
            defaultDashboardId?: string | undefined;
            templateId?: string | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.warning

Triggered when a warning condition is detected on an experiment

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.warning";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            type: "auto-update";
            success: boolean;
            experimentName: string;
            experimentId: string;
        } | {
            type: "multiple-exposures";
            experimentName: string;
            experimentId: string;
            usersCount: number;
            percent: number;
        } | {
            type: "srm";
            experimentName: string;
            experimentId: string;
            threshold: number;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.info.significance

Triggered when a goal or guardrail metric reaches significance in an experiment (e.g. either above 95% or below 5% chance to win). Be careful using this without Sequential Testing as it can lead to peeking problems.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.info.significance";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            experimentName: string;
            experimentId: string;
            variationId: string;
            variationName: string;
            metricName: string;
            metricId: string;
            statsEngine: string;
            criticalValue: number;
            winning: boolean;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.decision.ship

Triggered when an experiment is ready to ship a variation.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.decision.ship";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            experimentName: string;
            experimentId: string;
            decisionDescription?: string | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.decision.rollback

Triggered when an experiment should be rolled back to the control.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.decision.rollback";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            experimentName: string;
            experimentId: string;
            decisionDescription?: string | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### experiment.decision.review

Triggered when an experiment has reached the desired power point, but the results may be ambiguous.

<details>
  <summary>Payload</summary>

```typescript
{
    event: "experiment.decision.review";
    object: "experiment";
    api_version: string;
    created: number;
    data: {
        object: {
            experimentName: string;
            experimentId: string;
            decisionDescription?: string | undefined;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>


### user.login

Triggered when a user logs in

<details>
  <summary>Payload</summary>

```typescript
{
    event: "user.login";
    object: "user";
    api_version: string;
    created: number;
    data: {
        object: {
            email: string;
            id: string;
            name: string;
            ip: string;
            userAgent: string;
            os: string;
            device: string;
        };
    };
    user: {
        type: "dashboard";
        id: string;
        email: string;
        name: string;
    } | {
        type: "api_key";
        apiKey: string;
        id?: string | undefined;
        name?: string | undefined;
        email?: string | undefined;
    } | {
        type: "system";
        subtype?: string | undefined;
        id?: string | undefined;
    } | null;
    tags: string[];
    environments: string[];
    containsSecrets: boolean;
}
```
</details>
