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

# campaign.completed

> Occurs when a campaign is completed

<ResponseExample>
  ```json Example payload theme={null}
  {
    "id": "ck9v2m5nj0xp4wq7ybftrae8",
    "seq": 312,
    "teamId": "hzcai5t59nn9vsck3rbuepyg",
    "type": "campaign.completed",
    "timestamp": "2025-01-20T08:00:00.000Z",
    "version": "1.0",
    "data": {
      "campaign": {
        "id": "n7kxqm5d9iu2sgdf6jbw4h36",
        "name": "Q1 Product Launch Outreach",
        "description": "Reach out to product managers about the new API release",
        "status": "completed",
        "dryRun": false,
        "targetsCount": 250,
        "contactedCount": 250,
        "repliesCount": 47,
        "completionRate": 1.0,
        "replyRate": 0.188,
        "createdAt": "2025-01-10T09:00:00.000Z",
        "updatedAt": "2025-01-20T08:00:00.000Z",
        "pausedAt": null,
        "completedAt": "2025-01-20T08:00:00.000Z",
        "lastStartedAt": "2025-01-12T08:00:00.000Z"
      }
    }
  }
  ```
</ResponseExample>

## When it fires

A campaign has finished contacting all of its targets — all scheduled messages (including follow-ups) have been sent. The campaign's `status` transitions to `"completed"` and `completedAt` is set.

<Tip>
  Use this event to trigger post-campaign workflows: generate performance reports, sync final metrics to your CRM, or notify your team that outreach is complete.
</Tip>

## Payload

<ResponseField name="campaign" type="Campaign" required>
  The campaign object.

  <Expandable title="properties">
    <ResponseField name="id" type="string">
      The Inbox campaign ID.
    </ResponseField>

    <ResponseField name="name" type="string">
      The campaign name.
    </ResponseField>

    <ResponseField name="description" type="string | null">
      The campaign description.
    </ResponseField>

    <ResponseField name="status" type="string">
      The campaign status. One of `draft`, `active`, `paused`, or `completed`.
    </ResponseField>

    <ResponseField name="dryRun" type="boolean">
      Whether the campaign is in dry run mode (no messages actually sent).
    </ResponseField>

    <ResponseField name="targetsCount" type="number">
      Total number of targets in the campaign.
    </ResponseField>

    <ResponseField name="contactedCount" type="number">
      Number of targets that have been contacted.
    </ResponseField>

    <ResponseField name="repliesCount" type="number">
      Number of targets that have replied.
    </ResponseField>

    <ResponseField name="completionRate" type="number">
      Percentage of targets contacted (0–1).
    </ResponseField>

    <ResponseField name="replyRate" type="number">
      Percentage of contacted targets that replied (0–1).
    </ResponseField>

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

    <ResponseField name="updatedAt" type="string | null">
      ISO 8601 timestamp of the last update, or `null`.
    </ResponseField>

    <ResponseField name="pausedAt" type="string | null">
      ISO 8601 timestamp of when the campaign was paused, or `null`.
    </ResponseField>

    <ResponseField name="completedAt" type="string | null">
      ISO 8601 timestamp of when the campaign completed, or `null`.
    </ResponseField>

    <ResponseField name="lastStartedAt" type="string | null">
      ISO 8601 timestamp of when the campaign was last started, or `null`.
    </ResponseField>
  </Expandable>
</ResponseField>
