← KensoCONTENT HISTORY

Update to Kenso

Snapshot Nov 3, 2026 · 12:13 UTC · version 1.3.4

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Kenso and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Diagnose a campaign - how it is doing, why replies dropped, or how two campaigns compare. Checks reply classification first, then sending, bounces, human clicks, steps and segments, and proposes one change. Also reads experiment findings.",
  "included_files": [],
  "name": "campaign-diagnosis",
  "skill_md_contents": "---\nname: campaign-diagnosis\ndescription: Diagnose a campaign - how it is doing, why replies dropped, or how two campaigns compare. Checks reply classification first, then sending, bounces, human clicks, steps and segments, and proposes one change. Also reads experiment findings.\n---\n\n# Campaign diagnosis\n\nThis skill answers the three questions people ask most about a campaign: how is it doing, why did replies drop, and how do two campaigns compare. You read the numbers in a fixed order, prove each one is real before you lean on it, and end with one change to try and the reason for it.\n\nThis skill only reads. When the fix is a copy change, hand it to `campaign-improvement`, which asks the user before it writes anything. When it is a sending, bounce or inbox problem, give the user the numbers and say the fix is in their sending setup in Kenso, not in the copy.\n\nEvery call takes an optional `workspace_id`. Send it when the user can see more than one workspace: `list_workspaces()` lists them. Dates are ISO-8601 instants (`2026-10-01T00:00:00Z`). Rates come back as fractions from 0 to 1.\n\n## The rules for numbers\n\n- A reply is a person, not a message: every count here is distinct contacts. Out-of-office is not a reply.\n- Never report opens. Open tracking is off for deliverability, so open numbers mean nothing.\n- Put the counts next to every rate: \"2.1% reply rate (21 of 1,004 contacted)\". With fewer than about 100 contacted, give the counts and leave the rate out.\n- Missing data is N/A, never 0. A metric that did not load is unknown, not zero.\n- Clicks are human clicks. Use `clickCount` and the returned `clickRate`. `botClickCount` counts scanners and never shows interest.\n- Say what the numbers show first. Then say what you think caused it, and mark that part as your read.\n\n## Step 0 - Find the campaign and the window\n\n1. `list_campaigns(q=\"Acme\")` finds the campaign by name. `get_campaign(campaign_id=42)` gives its status, schedule and launch date.\n2. Pick the window. The default is the last 30 days. For \"why did replies drop\", compare two windows of the same length: the last 14 days against the 14 days before.\n\nIf an operation this skill names is not listed for you, or a campaign the user named answers 404, stop and say: \"I can't read that campaign's analytics from here. You can see it in Kenso at https://app.ken.so/<workspace id>/campaigns/<id>.\" A 404 means the campaign is not in this workspace or the read is not on for you. Do not retry it, and do not tell the user the campaign does not exist.\n\n## Step 1 - Check reply classification first\n\nThe interested count is only as good as the classifier behind it, and the classifier has failed silently before: replies arrived for weeks without being classified, so interested counts read near zero while real interest sat in the inbox. Check it before you blame copy or targeting.\n\n`get_reply_breakdown(from_time=\"2026-10-01T00:00:00Z\", to_time=\"2026-10-27T23:59:59Z\", campaign_id=42, by_segment=True)`\n\n`totalCount` is the people who replied and `interestedCount` the positive ones. `counts` splits them by class (`interested`, `not_interested`, `out_of_office`, `automated`, `unclassified` and others), and each person counts once.\n\n- Replies are `totalCount` minus the `out_of_office` count.\n- Classification is behind when `unclassified` holds a large share of the replies, or when a campaign that had interested replies shows none for several days while replies keep arriving. Spot-check with `list_inbox_threads(campaign_id=42, interest=\"unclassified\", limit=20)` and read a few.\n- If classification is behind, stop the diagnosis there. Tell the user the positive-reply numbers for this window are not reliable, give the reply count, and say the Kenso team needs to look at classification. Do not explain a drop the classifier made.\n\nDone when you know whether the interested count can be trusted.\n\n## Step 2 - Did it send?\n\n`get_campaign_performance(from_time=\"2026-10-01T00:00:00Z\", to_time=\"2026-10-27T23:59:59Z\", campaign_id=42, group_by=\"day\")`\n\nRead `sentCount` and `contactedCount` by day. Fewer sends come before fewer replies, so a reply drop that follows a send drop is a sending question, not a copy question.\n\n- Status: a paused, completed or errored campaign stops sending. `get_campaign(campaign_id=42)` says which.\n- Holds: `list_auto_pauses()` lists the inboxes, domains and campaigns Kenso paused on its own, with the reason and the rate that tripped it. `isActive` true means the hold still blocks sending.\n- Leads: `get_campaign_weekly_report(campaign_id=42)` returns `next`, which says how many leads are left and when the last one starts. A campaign with no leads left stops sending.\n\nReport any sending, hold or inbox problem with its numbers, and say the fix is in the sending setup in Kenso.\n\n## Step 3 - Bounces\n\nThe same performance read carries `bounceCount`, `bounceRate` and `bounceBreakdown` (hard, soft and the reasons). A bounce rate near 3%, or near 100 bounces, is a list or domain problem that hurts every later send. Raise it with the user before you judge the copy. `get_deliverability(from_time=\"2026-10-01T00:00:00Z\", to_time=\"2026-10-27T23:59:59Z\", group_by=\"domain\")` shows whether one domain carries the bounces.\n\n## Step 4 - Human clicks\n\nClicks show that people read past the first lines. Many clicks with few replies points at the call to action or the page behind the link. No clicks on a campaign with links points at the opening or at tracking. Step rows carry raw click volume but no unique clickers, so compare clicks between steps only as volume.\n\n## Step 5 - Steps and segments\n\n- By step: the same performance call with `group_by=\"step\"` shows which email gets the replies. A step with no replies after a few hundred sends is a candidate for `campaign-improvement`.\n- By segment: `group_by=\"segment\"`, and the classification read's `bySegment`, show which audience answers. Different segments are different people, so a gap between segments is a targeting finding, not a copy finding.\n- By variant: there is no per-variant read here. The diagnosis works without it.\n\n## Step 6 - What already changed\n\nRead what was tried before you suggest anything.\n\n- The weekly report's `changed` lists the newest sequence versions, paused or resumed variants and added segments, with their dates.\n\nNever suggest an angle the record shows already failed. If the drop lines up with a change, name the change and its date, and keep it a read, not a proof: the leads and the weeks changed too.\n\n## Step 7 - One change, with a hypothesis\n\nPropose one change: what to change, the numbers behind it, and the result that would prove it right (\"If the step 2 rewrite works, step 2 gets at least 4 interested replies in the next 600 sends, against 1 in the last 600\"). One change at a time, so the next read can credit it.\n\n| Finding | Hand to |\n|---|---|\n| A weak step, opening or call to action | `campaign-improvement` |\n| Sends, bounces, holds, inbox health | the user, in the sending setup in Kenso |\n| One audience answers and another does not | a new segment for that audience, after the user's yes |\n\nA pause, volume or schedule change on a client campaign needs a yes that names that client. Report the order you checked, each finding with its numbers, the change, and when to read the result again.\n\n## Compare two campaigns\n\nWhen the user names two or three campaigns:\n\n- Read each one with `get_campaign_performance(from_time=\"2026-10-01T00:00:00Z\", to_time=\"2026-10-27T23:59:59Z\", campaign_id=12)` over the same window and set them side by side. Their leads differ, so any gap is a hunch: say which campaign got more interested replies per person contacted, with the counts, and never say one won.\n\n## Answer cards\n\nThree tools show the diagnosis as a card with charts, or as text where cards are not on for the workspace. Each takes a `window` (`{\"preset\": \"last_30_days\"}`, or `from` and `to` dates):\n\n- How one campaign is doing: `show_campaign_health` with `campaign_id`.\n- Why one campaign's replies dropped: `explain_reply_drop` with `campaign_id`.\n- Two or three campaigns side by side: `compare_campaigns` with `campaign_ids`, the first one the baseline.\n\nEach also returns a text summary. Quote its figures as they are. Run Step 1 anyway: the card does not check classification for you.\n\n## Experiments\n\nExperiment findings are not readable here. When the user asks about tests, findings, a winning version or making a version the default, say those are in Kenso, and never call a version a winner from the reads above.\n\n## What this skill cannot do yet\n\n- Test significance between two arms. There is no significance helper, so never call one arm a winner.\n- Count held meetings. Meetings booked are on the performance rows. Meetings held are not tracked yet.\n- Split steps by variant.\n"
}

SHA-256 of public snapshot: 9441fb4ad734a97418415e661b143aa0729c9418138fb90791766ee1d050e421