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

# campaign.approval.approved

> Fired when an approver grants approval for a campaign

All webhook payloads follow a consistent top-level structure with event-specific data nested within the `data` object.

<ResponseField name="type" type="string" required>
  The event type (e.g. `campaign.approval.approved`).
</ResponseField>

<ResponseField name="data" type="object" required>
  Event-specific payload for this webhook.

  <Expandable title="Data object parameters">
    <ResponseField name="approval" type="object" required>
      The approval that was granted.

      <Expandable title="Approval object parameters">
        <ResponseField name="id" type="string" required>
          Approval ID.
        </ResponseField>

        <ResponseField name="isBlocking" type="boolean" required>
          Whether this approval blocked the campaign until granted.
        </ResponseField>

        <ResponseField name="message" type="string">
          Optional message attached to the approval request.
        </ResponseField>

        <ResponseField name="dueDate" type="string">
          ISO 8601 due date for the approval, if set.
        </ResponseField>

        <ResponseField name="createdAt" type="string" required>
          ISO 8601 timestamp when the approval was created.
        </ResponseField>

        <ResponseField name="status" type="string" required>
          Always `Approved` for this event.
        </ResponseField>

        <ResponseField name="approvedAt" type="string" required>
          ISO 8601 timestamp when the approver granted approval.
        </ResponseField>

        <ResponseField name="approvedBy" type="object" required>
          User who approved. Contains `id`, `firstName`, `lastName`, and `email`.
        </ResponseField>

        <ResponseField name="requestedBy" type="object" required>
          User who originally requested approval. Contains `id`, `firstName`, `lastName`, and `email`.
        </ResponseField>

        <ResponseField name="campaign" type="object" required>
          Campaign that was approved. Contains `id`, `name`, `startDate`, and `endDate`.
        </ResponseField>

        <ResponseField name="workspace" type="object" required>
          Workspace the campaign belongs to. Contains `id`, `slug`, and `name`.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="createdAt" type="string" required>
  ISO 8601 timestamp when the webhook event was created.
</ResponseField>

<ResponseExample>
  ```json Example theme={null}
  {
    "type": "campaign.approval.approved",
    "data": {
      "approval": {
        "id": "550e8400-e29b-41d4-a716-446655440710",
        "isBlocking": true,
        "message": "Legal sign-off needed for this campaign.",
        "dueDate": "2025-03-05T17:00:00.000Z",
        "createdAt": "2025-02-26T14:00:00.000Z",
        "status": "Approved",
        "approvedAt": "2025-02-26T16:15:00.000Z",
        "approvedBy": {
          "id": "550e8400-e29b-41d4-a716-446655440021",
          "firstName": "Sam",
          "lastName": "Chen",
          "email": "sam@example.com"
        },
        "requestedBy": {
          "id": "550e8400-e29b-41d4-a716-446655440010",
          "firstName": "Jane",
          "lastName": "Doe",
          "email": "jane@example.com"
        },
        "campaign": {
          "id": "550e8400-e29b-41d4-a716-446655440003",
          "name": "Launch 2025",
          "startDate": "2025-01-01",
          "endDate": "2025-12-31"
        },
        "workspace": {
          "id": "550e8400-e29b-41d4-a716-446655440000",
          "slug": "acme",
          "name": "Acme Inc"
        }
      }
    },
    "createdAt": "2025-02-26T16:15:00.000Z"
  }
  ```
</ResponseExample>
