---
title: "Publish an automation"
description: "Freezes the draft as the next version and turns the automation on. People enter from this moment, and nobody who met the trigger earlier is added."
url: "https://openemail.uk/docs/api/automations/publish"
area: "API"
category: "Mailbox"
---

# Publish an automation

Freezes the draft as the next version and turns the automation on. People enter from this moment, and nobody who met the trigger earlier is added.

`POST /automations/{id}/publish`

## POST /automations/{id}/publish

Freezes the draft as the next version and turns the automation on. People enter from this moment, and nobody who met the trigger earlier is added.

## Example

Needs `automations:write` and `emails:send`.

**curl**

```
curl -X POST "$OE/automations/aut_7c2e9a1f4b8d30c65e1a9f27/publish" -H "$AUTH"
```

**Response**

```
{
  "object": "automation",
  "id": "aut_7c2e9a1f4b8d30c65e1a9f27",
  "name": "Welcome series",
  "description": null,
  "status": "live",
  "triggerKind": "audience_joined",
  "stepCount": 4,
  "emailCount": 2,
  "hasUnpublishedChanges": false,
  "publishedVersion": 2,
  "pausedReason": null,
  "lastError": null,
  "counts": { "active": 38, "completed": 412, "exited": 9 },
  "createdBy": "q7Vd3kX9mT2pLw8RzN4bYc6HfJ1sGa5E",
  "publishedAt": "2026-10-02T09:14:00.000Z",
  "pausedAt": null,
  "archivedAt": null,
  "createdAt": "2026-10-01T16:40:12.000Z",
  "updatedAt": "2026-10-02T09:14:00.000Z",
  "definition": {
    "trigger": { "kind": "audience_joined", "audienceId": "aud_4c1b8e2a7d9f05c36b4e8a71", "includeImported": false },
    "entry": "welcome",
    "steps": [
      {
        "key": "welcome",
        "kind": "send_email",
        "next": "pause",
        "templateId": "tpl_9c1f0a4b7e05d3862c1f0a44",
        "templateVersion": null,
        "from": { "email": "news@acme.com", "name": "Acme" },
        "replyTo": null,
        "subject": null,
        "props": { "firstName": { "source": "contact", "field": "firstName" } }
      },
      { "key": "pause", "kind": "wait", "next": "opened", "wait": { "mode": "duration", "amount": 3, "unit": "days" } },
      {
        "key": "opened",
        "kind": "branch",
        "condition": { "kind": "email_opened", "stepKey": "welcome" },
        "yes": null,
        "no": "nudge"
      },
      {
        "key": "nudge",
        "kind": "send_email",
        "next": null,
        "templateId": "tpl_8f3a1c2e9b7d4a60",
        "templateVersion": null,
        "from": { "email": "news@acme.com", "name": "Acme" },
        "replyTo": null,
        "subject": "{{firstName|Hello}}, did you see this?",
        "props": {}
      }
    ]
  },
  "published": { "trigger": { "kind": "audience_joined", "…": "…" }, "entry": "welcome", "steps": ["…"] },
  "settings": {
    "timezone": "Europe/London",
    "sendWindow": { "days": [1, 2, 3, 4, 5], "startMinute": 540, "endMinute": 1020 },
    "reentryDays": null,
    "exitOnLeave": true,
    "listAudienceId": null
  },
  "problems": []
}
```

> A draft with a blocking problem is refused with 422 `invalid_automation`, and the answer lists every problem in `error.problems`.

> Every email step needs a published template with an unsubscribe link and a sender this key or app may send as. A template that cannot be filled in without a contact’s name is a problem too, because many contacts have no name: give the value a fallback.

> Publishing when the plan’s live automations are all in use answers 403 `automation_limit_reached`.

> Publishing an unchanged draft again makes no new version. It turns a paused automation back on.

## Reference

- [`POST /automations/{id}/publish`](https://openemail.uk/docs/api/reference/automations#post-automations-id-publish): full reference
