Version
READ

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.

Read the ledger every figure of get_retention_stats is counted from: each notice of the grace ladder, each offer shown and taken, each answer to the cancellation question and each win-back step sent, with the member it reached, the channel that carried it, when it went out and, once a charge settled for the member after it, converted_at and the payment_id that counted it. Narrow to one kind.

Read-only. Never mutates anything.

A converted row preceded a payment; it did not cause it

converted_at is stamped on every open row of a member when their next charge settles. It is how the figures count a recovery and a member won back, not a claim that the notice worked on its own.

The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.

The REST endpoint and this tool share one action, so validation, permissions and events are identical.

Annotations

Read-only

It reads and never changes anything.

Arguments

project_id*string

UUID of the project whose ledger to list.

kindstringoptional

Optional: keep one kind of row, such as "payment_recovered" or "sequence_step".

limitintegeroptional

Maximum rows to return per page (1..100).

min1max100
pageintegeroptional

1-indexed page number.

min1

What it returns

{  "data": [    {      "id": "8f0a2b4c-6d8e-4f1a-9b2c-3d4e5f6a7b8c",      "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",      "subscription_id": null,      "member": { "id": "a7b8c9d0-e1f2-4a3b-8c4d-5e6f7a8b9c0d", "name": "Ada Lovelace" },      "kind": "sequence_step",      "channel": "chat",      "sent_at": "2026-10-10T09:00:00+00:00",      "converted_at": "2026-10-12T09:00:00+00:00",      "payment_id": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f",      "coupon": { "id": "3b7c9d1e-5f24-4a86-9c0b-2d4e6f8a1b3c", "code": "COMEBACK20" },      "step": { "id": "b1c7e9f3-2a4d-4e86-9b0c-5d7f8a2e1c43", "sequence_id": "9d2f4b6a-1c3e-4f58-8a7b-6e5d4c3b2a19", "position": 2 },      "meta": { "sequence_id": "9d2f4b6a-1c3e-4f58-8a7b-6e5d4c3b2a19", "enrollment_id": "d4e5f6a7-b8c9-4d0e-8f1a-2b3c4d5e6f7a" }    }  ],  "meta": { "page": 1, "limit": 25, "total": 1, "has_more": false }}

kind is one of payment_failed_notice, grace_reminder, grace_final_warning, access_suspended, access_restored, payment_recovered, offer_shown, offer_taken, feedback or sequence_step. coupon and step are set on a win-back message; meta carries what else the row knows by kind, or null.

How it fails

VALIDATION_FAILED

a kind that is not one of the values, or limit outside 1..100.

RESOURCE_NOT_FOUND

unknown project_id, or the project is outside the token's scope.

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks project-subscription:view-any.

How is this guide?

Last updated on