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

# Configure an inactive campaign

> Select senders, templates, sequence steps, reply owners and sending windows for an inactive Emailx campaign, with protection against stale edits.

Configure an Emailx draft after creating it and selecting its audience. Read the saved setup, change the fields you need, then read it back. Saving configuration keeps the campaign inactive.

> [!NOTE]
>
> Configuration requires package 0.4.0 or newer, a matching API host and a newly issued `campaigns:configure` grant. Existing keys retain their current grants. [Discover capabilities](https://docs.emailx.ai/en/api-reference/start/check-permissions.md) to check request permissions.

## Read before editing

```bash theme={null}
emailx campaigns configuration 456 --workspace 123 --channel linkedin --json
```

Use the returned `revision` as `expected_revision` in your next edit. It changes when saved setup or selected email template content changes. Treat the revision as opaque. The response reports `editable` and `edit_blockers` for stored campaign state; sender permissions and API scopes are checked separately.

IDs in this guide are examples. Discover [senders](https://docs.emailx.ai/en/api-reference/senders/list-senders.md) and [reply owners](https://docs.emailx.ai/en/api-reference/team/get-reply-notifications.md) in the selected workspace. `sender_ids` uses Emailx sender IDs, not provider account IDs or email addresses. Disconnected senders may be saved for later repair; selection is not a readiness guarantee.

## Configure LinkedIn

Create `setup.json` with your actual revision and sender IDs:

```json setup.json theme={null}
{
  "expected_revision": "COPY_THE_REVISION_FROM_YOUR_READ",
  "sender_ids": [903],
  "language": "English",
  "reply_routing": "sender",
  "steps": [
    {"type": "connection_request", "wait_days": 0},
    {"type": "message", "message": "Hello, I would like to discuss a partnership.", "wait_days": 2}
  ],
  "schedule": {
    "timezone": "Europe/Rome",
    "active_days": ["Mon", "Tue", "Wed", "Thu", "Fri"],
    "time_start": "09:00",
    "time_end": "17:00",
    "daily_connection_limit": 20,
    "daily_message_limit": 40
  }
}
```

```bash theme={null}
emailx campaigns configure 456 --workspace 123 --channel linkedin --file setup.json --idempotency-key setup-001 --dry-run --json
emailx campaigns configure 456 --workspace 123 --channel linkedin --file setup.json --idempotency-key setup-001 --json
emailx campaigns configuration 456 --workspace 123 --channel linkedin --json
```

The dry run validates locally and makes no HTTP call. It cannot check the revision, sender ownership or campaign eligibility. Replace the revision placeholder before running it.

This configuration supports normal, manual-source drafts with autopilot disabled. AI sourcing, shared-pool workflows and special campaign modes still require the app. You can change `audience` and `sender_context` as text context; these fields do not run a search or qualify leads.

Use at most one connection request, first, and five message steps. Messages require nonempty text. Notes have at most 300 characters; provider account limits can be lower. Waits are integers from 0 to 14 days. Daily configuration allows 1 to 30 connection requests and 1 to 100 messages; these are validation bounds, not recommended volumes or provider guarantees. Follow [recommended sending limits](https://docs.emailx.ai/en/overview/sending-limits.md).

## Configure email

Use existing template IDs from your workspace. A selected template may be a regular or smart template already created in Emailx; saving its reference does not generate or approve personalized content.

```json setup.json theme={null}
{
  "expected_revision": "COPY_THE_REVISION_FROM_YOUR_READ",
  "sender_ids": [904, 905],
  "reply_owner_subclient_id": null,
  "steps": [
    {"template_id": 601, "label": "Introduction", "wait_days": 0},
    {"template_id": 602, "label": "Follow-up", "wait_days": 3}
  ],
  "schedule": {
    "timezone": "Europe/Rome",
    "active_days": ["Mon", "Tue", "Wed", "Thu", "Fri"],
    "time_start": "09:00",
    "time_end": "17:00",
    "daily_volume_per_mailbox": 30,
    "initial_wait_days": 0
  }
}
```

Run the same configure/read commands with `--channel email`. This endpoint supports up to ten template steps, waits of 0 to 90 days, daily volume of 1 to 100 per mailbox and an initial wait of 0 to 90 days. These are API configuration bounds. Mailbox health, warmup, subscription and delivery budgets still apply before sending.

Your selected contacts remain unchanged. Add subscribed contacts using the [email prospects endpoint](https://docs.emailx.ai/en/api-reference/prospects/add-email-prospects.md). Legacy graph sequences and campaigns with preview, scheduled or sent execution records require the app.

## Replacement and recovery rules

Send only the top-level fields you want to change. An omitted field stays unchanged. `sender_ids` and `steps` replace their complete lists; an empty list clears that draft selection. `schedule` replaces the entire schedule and requires every channel-specific schedule field. Use an IANA timezone, unique weekday names and `HH:MM` start/end within one day, with start before end.

When changing existing steps, include their returned `id` to keep their identity. LinkedIn attachments stay with that ID; changing a step's type or removing an attached step through this endpoint is rejected. Manage those attachments in Emailx first. Unknown or other-workspace IDs are rejected rather than silently replaced with defaults.

For email, `reply_owner_subclient_id=null` means the workspace owner; a teammate ID must identify an active real teammate. LinkedIn supports `reply_routing=sender` for the sending profile owner, or `person` for the selected reply owner. These configure notifications, not an automated reply sender.

On `stale_revision`, read again and reconcile your intended change before submitting a new logical edit with a new idempotency key. After a timeout or uncertain result, reuse the exact original key and body; a revision change under the same key conflicts. Read back after replay because its saved response can describe an earlier revision.

`approval_status=not_evaluated` and `activation_status=not_requested` make the boundary explicit. Review the audience, generated content and sender settings in Emailx before activation. These configuration endpoints do not launch campaigns or send messages.


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