# Customer research

URL: /workflows/processes/customer-research · Id: `process:customer-research`

> Customer research learns from what buyers did and paid, never from their predictions.

Customer research learns from what buyers did and paid, never from their predictions.

## Outcome
| Part | This Process |
| --- | --- |
| Outcome | Each new Customer’s reason for buying is graded Evidence, and each requester hears when their request ships. |
| Reads | [Customer](/business/nouns/customer), [Issue](/business/nouns/issue) |
| Leaves | [Interview](/business/nouns/interview), [Evidence](/business/nouns/evidence), [Message](/business/nouns/message) |
| Runs in | Each Startup |

## Accountable
[Product Lead](/agents/product/product-lead), [Product Team](/agents/product).

## Workflows
| Workflow | Runs | Team |
| --- | --- | --- |
| [Signal interview](/workflows/processes/customer-research/signal-interview) | on [`Offer.accepted`](/business/events/Offer.accepted) | [Product Team](/agents/product) |
| [Close the loop](/workflows/processes/customer-research/close-the-loop) | on [`Change.merged`](/business/events/Change.merged) | [Product Team](/agents/product) |

## Who does each step

| Workflow | Step | Role | Calls | Approval |
| --- | --- | --- | --- | --- |
| [Signal interview](/workflows/processes/customer-research/signal-interview) | 1. Ask one question about what the Customer did and paid before. | [Researcher](/agents/product/researcher) | [Interview.create](/business/nouns/interview/create) | None |
| [Signal interview](/workflows/processes/customer-research/signal-interview) | 2. Grade the answer as behavior, commitment, or opinion. | [Researcher](/agents/product/researcher) |  |  |
| [Signal interview](/workflows/processes/customer-research/signal-interview) | 3. Record it as Evidence in the ranked feedback list, with its origin. | [Researcher](/agents/product/researcher) | [Evidence.create](/business/nouns/evidence/create) | None |
| [Close the loop](/workflows/processes/customer-research/close-the-loop) | 1. Find the Issues the merged Change resolves and the Problems they address. | [Researcher](/agents/product/researcher) | [Issue.list](/business/nouns/issue/list) | None |
| [Close the loop](/workflows/processes/customer-research/close-the-loop) | 2. Message each outside Customer whose Evidence sits on those Problems, in their existing Thread. | [Researcher](/agents/product/researcher) | [Message.create](/business/nouns/message/create) | None |
| [Close the loop](/workflows/processes/customer-research/close-the-loop) | 3. After 14 days, record whether each one called the new or changed Verb, as Behavior-grade Evidence. | [Researcher](/agents/product/researcher) | [Evidence.create](/business/nouns/evidence/create) | None |
| [Close the loop](/workflows/processes/customer-research/close-the-loop) | 4. Lower the Problem’s rank when most requesters did not use it. | [Researcher](/agents/product/researcher) | [Problem.rank](/business/nouns/problem/rank) | None |

## Events
| Direction | When | What happens |
| --- | --- | --- |
| In | On [`Offer.accepted`](/business/events/Offer.accepted) | Starts [Signal interview](/workflows/processes/customer-research/signal-interview) |
| In | On [`Change.merged`](/business/events/Change.merged) | Starts [Close the loop](/workflows/processes/customer-research/close-the-loop) |
| Out | `Interview.created` | Raised by step 1 of [Signal interview](/workflows/processes/customer-research/signal-interview) |
| Out | `Evidence.created` | Raised by step 3 of [Signal interview](/workflows/processes/customer-research/signal-interview) |
| Out | `Message.created` | Raised by step 2 of [Close the loop](/workflows/processes/customer-research/close-the-loop) |
| Out | [`Problem.ranked`](/business/events/Problem.ranked) | Raised by step 4 of [Close the loop](/workflows/processes/customer-research/close-the-loop) |

## Plays
No Play names this Process.

## Controls
No Control names this Process or a Workflow of it.

## Settings
| Setting | Type | Default | Say | Set with |
| --- | --- | --- | --- | --- |
| `research.followUpDays` | `integer` | `14` | Check two weeks later whether customers used what shipped | [Setting.update](/business/nouns/setting/update) |

## Failure
A failed step retries; when retries run out, the Action goes to the [Product Lead](/agents/product/product-lead).

## Loop
| Step | Value |
| --- | --- |
| Hypothesis | Asking about the last time the Problem hit yields more Commitment-graded Evidence per Interview than asking about the future. |
| Measure | [Committed ICP members](/agents/founding#committed-icp-members) over 14d, at least 10 observations |
| Learn | The learn step reads the Readout, records Evidence and a Decision, and drafts the next Variant. |

## Code

**Ask**

```text
Turn on customer research
```

**API**

```bash
curl -X POST https://api.sb/leaseline.app/processes/process_1/enable \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

**SDK**

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

await $.Process.enable({ process: 'process_1' })
```

**CLI**

```bash
npx startup-builder do Process.enable --json '{"process":"process_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Process.enable({ process: 'process_1' })"
  }
}
```

## Enable
On by default for every Product Template. [Process.pause](/business/nouns/process/pause) stops new Actions; Actions in progress finish.

**Ask**

```text
Check two weeks later whether customers used what shipped
```

**API**

```bash
curl -X PATCH https://api.sb/leaseline.app/settings/setting_1 \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"value":14,"key":"research.followUpDays"}'
```

**SDK**

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

await $.Setting.update({ id: 'setting_1', value: 14, key: 'research.followUpDays' })
```

**CLI**

```bash
npx startup-builder do Setting.update --json '{"id":"setting_1","value":14,"key":"research.followUpDays"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Setting.update({ id: 'setting_1', value: 14, key: 'research.followUpDays' })"
  }
}
```

## Example
A home inspector accepts the $15 listing [Offer](/business/nouns/offer). [Signal interview](/workflows/processes/customer-research/signal-interview) asks what she paid before, and her answer, $300 a month for bought leads, is recorded as behavior [Evidence](/business/nouns/evidence). Forty such answers set the next [Price](/business/nouns/price) test, never a survey.