URL: /code/apps/crm/nurture · Id: `page:/code/apps/crm/nurture`

# Lead.nurture

> Takes a lead that is not ready to buy off its owner’s queue and onto a Sequence, until it raises a hand again.

POST https://api.sb/&#123;your-domain&#125;/leads/&#123;lead&#125;/nurture

Takes a [lead](https://startupbuilder.dev/business/nouns/lead) that is not ready to buy off its owner’s queue and onto a [Sequence](https://startupbuilder.dev/business/nouns/sequence), until it raises a hand again.

- **Action class:** `send`
- **Approval:** Sends on its own
- **Emits:** `Lead.nurtured`
- **Price:** Free

```text title="Run it · Ask"
Rosa said “next quarter”: put her on the monthly rent-tips sequence until she raises a hand.
```

```ts title="Run it · SDK"
import { $ } from 'startup-builder'

const result = await $.try.Lead.nurture({ lead: 'https://api.sb/leaseline.app/leads/lead_Ro5aL2vZ1e', sequence: 'https://api.sb/leaseline.app/sequences/sequence_Mn4tH8rT2p' })
```

```json title="Run it · Response"
{
  "api": "https://api.sb/leaseline.app",
  "lead": {
    "$id": "https://api.sb/leaseline.app/leads/lead_Ro5aL2vZ1e",
    "$type": "Lead",
    "status": "nurturing"
  },
  "action": {
    "operation": "Lead.nurture",
    "mode": "try",
    "status": "done"
  }
}
```

Its Inputs, Outputs, Effects and guards quote [the hub’s `Lead.nurture`](https://startupbuilder.dev/business/nouns/lead/nurture); this page adds what each Venue honors, its limits and a worked call. It is one of the [Verbs](https://startupbuilder.dev/business/nouns/verb) of [CRM](/code/apps/crm#verbs).

## Inputs
| Name | Type | Meaning |
| --- | --- | --- |
| `lead` | `Lead` | Required. The lead to nurture. |
| `sequence` | `Sequence` | The Sequence to enroll it in. Optional. |

## Outputs
| Field | Type | What `null` means |
| --- | --- | --- |
| `lead` | `Lead` | Never null: the lead, now in `nurture`. |

## Effects
**Action class**

`send`: an approval rule on `send` can make it wait for your OK

**Modes**

- `try`: Runs every check and returns what would go out, as it would go out; nothing is sent, posted or spent.
- `send`: Returns a pending Action at once; `Lead.nurtured` fires when it is done.
- `do`: Waits for the Action to finish and returns the record.

**Idempotency**

Only with a key: the same `Idempotency-Key` and input return the first Action, and the same key with other input returns `409`.

**Saved or shared**

Enrolls the lead in the Sequence when one is given. Its next reply or form puts it back on a queue through `Lead.assign`.

**Emits**

`Lead.nurtured` with `{ lead }`

**Performed by**

[Sales lead](https://startupbuilder.dev/agents/sales/sales-lead)

**Price**

Free on your own account: the platform charges nothing for the call.

**Standing approval**

It goes out on its own, inside the Limits of your standing approval: a [`Mandate`](https://startupbuilder.dev/business/nouns/mandate) you grant once with [`Mandate.authorize`](/code/integrations/calls/authorize). One approval rule makes it wait for your OK.

## On each Venue
It acts on your own records and reaches no Venue, so every account answers the same way.

## What try does
Runs every check the call meets and returns the record as it would be; nothing is stored, sent or posted.

## Refuses when
The hub sets no guard of its own on this call: it refuses only on the shared checks every write meets (a missing record, a Permission the seat lacks).

## When it waits
Returns in one response; nothing waits.

## Example
In `send` mode the call returns its pending Action at once, and `Lead.nurtured` delivers the result.

**Ask**

```text
Rosa said “next quarter”: put her on the monthly rent-tips sequence
until she raises a hand.
```

**API**

```bash
curl -X POST "https://api.sb/leaseline.app/leads/lead_Ro5aL2vZ1e/nurture?mode=send" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "sequence": "https://api.sb/leaseline.app/sequences/sequence_Mn4tH8rT2p"
}'
```

**CLI**

```bash
npx startup-builder do Lead.nurture --send --data '{
  "sequence": "https://api.sb/leaseline.app/sequences/sequence_Mn4tH8rT2p"
}'
```

`--send` returns the pending Action at once.

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "mode": "send",
    "code": "return await $.Lead.nurture({ sequence: 'https://api.sb/leaseline.app/sequences/sequence_Mn4tH8rT2p' })"
  }
}
```

**SDK**

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

const result = await $.send.Lead.nurture({
  lead: 'https://api.sb/leaseline.app/leads/lead_Ro5aL2vZ1e',
  sequence: 'https://api.sb/leaseline.app/sequences/sequence_Mn4tH8rT2p',
})
```


```json title="Response, in send mode"
{
  "mode": "send",
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_Sd3kQ9vT2w",
    "operation": "Lead.nurture",
    "status": "pending",
    "reason": "running"
  }
}
```

To retry, send the same `Idempotency-Key`: the retry returns the first answer for $0. A new key reads again.

## Used by
None.

## Related
[`Lead.qualify`](/code/apps/crm/qualify) · [`Lead.assign`](/code/apps/crm/assign-lead) · [`Deal.advance`](/code/apps/crm/advance) · [`Deal.win`](/code/apps/crm/win) · [`Deal.lose`](/code/apps/crm/lose) · [`Lead.convert`](/code/apps/crm/convert) · [`Lead.disqualify`](/code/apps/crm/disqualify) · [`Deal.assign`](/code/apps/crm/assign-deal) · [`Deal.propose`](/code/apps/crm/propose) · [`Contact.merge`](/code/apps/crm/merge-contact) · [`Organization.merge`](/code/apps/crm/merge-organization)