# Announce every release

URL: /workflows/guides/announce-every-release · Id: `guide:announce-every-release`

> Every deployed Version gets changelog notes, and everyone who asked for what shipped gets an email.

Every deployed [Version](/business/nouns/version) gets release notes on the changelog. Each [Customer](/business/nouns/customer) or [Lead](/business/nouns/lead) who asked for what shipped gets an email.

Needs: [Ship my changes](/code/ship-my-changes)

**Before it runs**

- You leave the chat: Never: it all happens in the chat.

## What you get
- 1 changelog entry per release, written from its Changes (Post)
- 1 email per Customer or Lead whose request shipped (Message)
- 1 Workflow with three steps, each retried up to three times (Workflow)
- 1 trigger on every deployed Version (Trigger)

## Your agent does
**For agents**

- Guide: `guide:announce-every-release`, status `live`. Page: [/workflows/guides/announce-every-release.md](/workflows/guides/announce-every-release.md).
- Approval: none. Run it when the founder asks.
- Leaves the chat: never.
- Needs first: [Ship my changes](/code/ship-my-changes).
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Workflow.create`](/business/nouns/workflow/create) (`verb:Workflow.create`) | `steps` json, required: example `{"notes":"Write release notes from the Changes in the Version.","post":"Publish them to the changelog.","tell":"Email each Customer and Lead who asked for a shipped feature."}`; `retries` integer: example `3` | `workflow` Workflow |
| 2 | [`Trigger.create`](/business/nouns/trigger/create) (`verb:Trigger.create`) | `event` string: example `"Version.deployed"` | `trigger` Trigger |

Returns: the last call answers with `trigger` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

```json
{
  "api": "https://api.sb/leaseline.app",
  "trigger": {
    "$id": "https://api.sb/leaseline.app/triggers/trigger_1",
    "$type": "Trigger",
    "event": "Version.deployed"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_1",
    "operation": "Trigger.create",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/leaseline.app/actions/action_1"
  }
}
```

Next: offer “Skip releases that only fix bugs”, or “Post to our social accounts too”.

Calls: `Workflow.create` → `Trigger.create`

Ask:

```text
Announce every release.
Post what shipped each time we deploy.
Tell customers when the feature they asked for ships.
```

API:

```bash
# 1. Workflow.create
curl -X POST https://api.sb/leaseline.app/workflows \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"steps":{"notes":"Write release notes from the Changes in the Version.","post":"Publish them to the changelog.","tell":"Email each Customer and Lead who asked for a shipped feature."},"retries":3}'

# 2. Trigger.create
curl -X POST https://api.sb/leaseline.app/triggers \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event":"Version.deployed"}'
```

SDK:

```ts
import { $ } from 'startup-builder'

await $.Workflow.create({ steps: { notes: 'Write release notes from the Changes in the Version.', post: 'Publish them to the changelog.', tell: 'Email each Customer and Lead who asked for a shipped feature.' }, retries: 3 })
await $.Trigger.create({ event: 'Version.deployed' })
```

CLI:

```bash
npx startup-builder do Workflow.create --json '{"steps":{"notes":"Write release notes from the Changes in the Version.","post":"Publish them to the changelog.","tell":"Email each Customer and Lead who asked for a shipped feature."},"retries":3}'
npx startup-builder do Trigger.create --json '{"event":"Version.deployed"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "await $.Workflow.create({ steps: { notes: 'Write release notes from the Changes in the Version.', post: 'Publish them to the changelog.', tell: 'Email each Customer and Lead who asked for a shipped feature.' }, retries: 3 })\nreturn await $.Trigger.create({ event: 'Version.deployed' })"
  }
}
```

## Change it
- Skip releases that only fix bugs.
- Post to our social accounts too.
- Batch it into one email a week.

## Under the hood
- Systems: [Changelog](/code/systems/changelog), [Mailboxes](/systems/mailboxes)
- Nouns: [Version](/business/nouns/version), [Change](/business/nouns/change), [Post](/business/nouns/post), [Message](/business/nouns/message), [Workflow](/business/nouns/workflow), [Trigger](/business/nouns/trigger)
- Events: [`Version.deployed`](/business/events/Version.deployed), `Workflow.created`, `Trigger.created`

Telling people their request shipped is the cheapest retention there is. The [Workflow](/business/nouns/workflow) reads each [Change](/business/nouns/change) in the release, so the notes describe what shipped, not what was promised.