---
name: diagnose-flat-reply-rate
description: Work out why a CampaignStack campaign is sending but getting no replies. Use when reply rate is near zero, when a campaign that used to work stopped, or when someone asks whether the messages are the problem.
---

# Diagnose a flat reply rate

Three things produce silence and they need different fixes: nobody is receiving
the messages, the wrong people are, or the messages are not worth answering.
Establish which one before touching any copy.

## 1. Are messages actually going out?

```
campaignstack_get_workflows(ids: [workflowId], include: {stats: {}})
campaignstack_get_workflows(ids: [workflowId], nodes: {ids: [nodeId]},
  include: {nodeActivity: {}})
```

Leads piled at one node are not a message problem. Read the wait reason:

- budget or pacing - the safety system is spacing sends to protect the account.
  That is working as intended; the fix is time or another account, never a
  bypass.
- awaiting enrichment - profiles have not been scraped, so the gate is holding
  them.
- pending review - drafts are waiting for a human. The queue IS the bottleneck.
- failed - read the error; a run of the same one is a structural problem.

If sends are healthy, continue.

## 2. Are they reaching the right people?

```
campaignstack_get_campaigns(ids: [campaignId], include: {icp: {}, icpScores: {icpId}})
campaignstack_diagnose_workflow_sourcing(workflowId, leadId)
```

A campaign contacting everyone it sourced has no ICP threshold doing any work.
Reply rate on an off-ICP list cannot be fixed by writing.

## 3. Read what was actually sent

Take a dozen entry ids from `nodeActivity` on the send node and read what went
out for each:

```
campaignstack_explain_draft(entryId)
```

Each call spends one model generation. Look for the shape across drafts, not
one message: convergence, twenty drafts with the same opening move, the same
question, the same length. That is a house formula, and it is a
configuration problem, not a model problem.

Each result also attributes every sentence to the setting that produced it.
If the formula traces to a playbook section or an agent script, that is your
answer.

## 4. Check the review decisions

Clean-approval rate is the honest measure of draft quality: what fraction of
drafts a human sent without editing. The app's Draft Checkup reports it; when it
is low, the checkup proposes one change to the workspace's own data rather than
to the prompt.

## 5. Fix the setting, not the message

Use `campaignstack_get_craft_config_tree` for the warnings, change one field,
then `campaignstack_preview_craft_prompt` to confirm the prompt moved. Re-read
reply rate after a real batch, not after three sends: at normal volumes a reply
rate needs dozens of messages before a change in it means anything.

## The uncomfortable answer

Sometimes the messages are fine and the offer is not interesting to that
audience. Sourcing, timing and copy are all downstream of whether the person has
a reason to care. Say so plainly rather than tuning the sixth version of an
opener.
