← Files CheerfulARCHIVED FILE

skills/cheerful-campaign-pulse/SKILL.md

4.12 KB · Nov 2, 2026 · 13:08 UTC

↓ Download file

---
name: cheerful-campaign-pulse
description: "Show how the user's Cheerful influencer campaigns are doing: emails sent, replies, reply rate and opt-ins per campaign, which campaign is behind and why, and how many replies are waiting on the user. Read-only. Use when the user asks \"how are my campaigns doing\", \"campaign report\", \"which campaign has the lowest reply rate\", \"which campaign is behind\", \"how many opt-ins do I have\", \"what's my reply rate\", or \"give me a campaign update\"."
---

# Campaign pulse

Sends, replies and opt-ins across the user's campaigns, the one that is behind, and what is
waiting on them. Read-only: it changes nothing and spends no credits.

## Step 0: Check the connection

If a Cheerful tool is unavailable, or a call answers "Tool not found" or asks to reconnect, stop
and tell the user: "Connect Cheerful from the plugin page, then ask me again." Don't retry.

## Read this first: what the data can and can't tell you

- **Rates need a base.** A campaign with 2 sent and 0 replies is "too early to tell", not "the
  worst". Call a campaign behind only when it has sent enough to compare (about 10+), and say how
  many were sent either way.
- **Paused is not broken.** A paused campaign stopped sending; its replies still count.
- **Teammates' campaigns are included.** If a campaign carries `owner_email`, say whose it is.
- **"Not found" can mean "not yours".** If a campaign can't be opened, list the campaigns again
  instead of guessing; it may belong to someone who hasn't shared it.
- **These are outreach numbers, not spend.** For credits use `billing_usage`, and report credits,
  never dollars.

## Workflow

1. **All campaigns.** Call `campaign_read` with `action="index"` and `include_stats=true`. For each
   campaign take sent, replies, opt-ins and status, and work out the reply rate (replies ÷ sent).
2. **Account totals.** Call `campaign_report` with `action="account"` for the account-wide reply
   rate, opt-in rate and recent opt-ins.
3. **The one that matters.** If the user named a campaign, use it. Otherwise pick the campaign
   with the lowest reply rate among those with enough sends (see above). Call `campaign_report`
   with `action="campaign"` and its `campaign_id` for the funnel and the sending timeline. For
   "give me a summary of <campaign>", use `action="summary"` instead: the same report plus the
   replies waiting on the user and the top posts, in one call.
4. **Why.** Explain from the numbers only: few emails sent yet, sending stopped (paused, or the
   timeline goes flat), replies but few opt-ins (the offer), or no replies at all (the opener or
   the creator fit). Don't invent causes the data doesn't show.
5. **Waiting on the user.** Call `inbox_read` with `action="counts"` (and the `campaign_id` if one
   campaign is in focus). `pending` is replies waiting on the user; `outbox` is sent and waiting
   on the creator. If `capped` is true, say "100+". A missing count means "couldn't count right
   now".

## Output layout

In ChatGPT the report appears as a campaign card automatically. After the card, write at most 2
sentences: the campaign that is behind and the likeliest reason, then one next step. Don't repeat
the card's numbers in prose.

Where no card is shown (for example in Codex), use this layout:

```
**2 campaigns · 6 emails sent · 50% reply rate · 2 opted in**

| Campaign | Status | Sent | Replies | Reply rate | Opted in |
|---|---|---|---|---|---|
| Spring Skincare Seeding | paused | 4 | 3 | 75% | 2 |
| Vegan Snacks Launch | paused | 2 | 0 | 0% | 0 |

**Behind:** Vegan Snacks Launch — 2 sent and no replies yet, so it's too early to judge; sending stopped on Sep 25.
**Waiting on you:** 0 replies need an answer.
**Next:** "Who replied to Spring Skincare Seeding?"
```

## Rules

- Plain language: no ids, field names, status codes or "tool" in the reply.
- Pausing, resuming or editing a live campaign happens in Cheerful at https://app.cheerful.ai.
  Point there for those, without promising anything will be sent. A new campaign can be set up
  here when `create_campaign_draft` is listed.
- Don't promote plans or purchases.
- Don't round 0 replies into "low"; say "no replies yet".

SHA-256: 27440cbb36d8bafa8d33ba6e2024858e947051261c457dcfc651fbcca23cde2b