list_cancellation_feedback
List the cancellation screens a project's members reached — the reason they gave, their own words, the offer shown and whether they took it, and where they answered. Read-only. Paginated, narrowed by reason or surface.
Read what members said on the way out. Every cancellation screen a member reached is one record:
the member, the plan they were on, the reason they picked, their sentence in feedback, the offer
the screen made and whether they took it, where they answered (portal or bot), and the dates of
a pause they took. Narrow by reason or surface; the counts and the shares are on
get_retention_stats.
Read-only. Never mutates anything.
Only members who reached the screen are here
A member whose card lapsed, or whom a connector banned, left without a screen and has no record.
reason is null for a project that switched the question off.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Annotations
It reads and never changes anything.
Arguments
project_id*stringUUID of the project whose cancellation screens to list.
reasonstringoptionalOptional: keep the records whose member gave this reason, such as "too_expensive" or "other".
surfacestringoptionalOptional: "portal" for screens answered on the portal, "bot" for screens answered in a connector chat.
limitintegeroptionalMaximum records to return per page (1..100).
1max100pageintegeroptional1-indexed page number.
1What it returns
{ "data": [ { "id": "5c1d9e2f-7a3b-4c84-9d6e-1f2a3b4c5d6e", "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "subscription_id": "2e4f6a8c-1b3d-4e5f-8a9b-0c1d2e3f4a5b", "member": { "id": "a7b8c9d0-e1f2-4a3b-8c4d-5e6f7a8b9c0d", "name": "Ada Lovelace" }, "plan": { "id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80", "name": "Premium" }, "reason": "too_expensive", "feedback": "Rent went up this month.", "offer_shown": "pause", "offer_taken": "pause", "surface": "portal", "offer_resumes_at": "2026-11-12T09:00:00+00:00", "offer_resumed_at": null, "created_at": "2026-10-12T09:00:00+00:00" } ], "meta": { "page": 1, "limit": 25, "total": 1, "has_more": false }}How it fails
VALIDATION_FAILEDa reason or surface that is not one of the values, or limit outside 1..100.
RESOURCE_NOT_FOUNDunknown project_id, or the project is outside the token's scope.
AUTHENTICATION_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks project-subscription:view-any.
How is this guide?
Last updated on
get_retention_stats
Read what Revenue Recovery did on a project over a window — failed renewals, reminders, pauses, recoveries with their US dollars, win-back messages and members won back, the cancellation screens with their offers, and why members cancelled. Read-only.
list_retention_activity
List a project's Revenue Recovery ledger — one row per notice, offer, feedback and win-back message, with the member, the channel, and whether a charge settled afterwards. Read-only. Paginated, narrowed by kind.