Churn reasons summary (AI)
The /reports/churn-reasons-summary endpoint returns an AI-generated, founder-facing summary of the freetext cancellation comments left by customers who churned in a given period. It clusters comments by underlying dynamic (lost to bundled competitor, pricing fatigue, specific feature gaps, business closure, etc.), quotes concrete examples, and links each cluster to the specific customers behind it.
💡 Use case: Skip reading 50 individual cancellation comments to find the patterns. Get one paragraph with quotable customer examples and links to drill into each cluster.
GET /reports/churn-reasons-summary
Returns a one-paragraph markdown summary of cancellation comments in the period. Results are cached in KV for 24 hours per (account, date range).
Authentication
Required
Include your API key in the Authorization header:
curl https://api.growpanel.io/reports/churn-reasons-summary \
-H "Authorization: Bearer YOUR_API_KEY"Query parameters
| Parameter | Type | Description |
|---|---|---|
date (optional) | string | Date range to summarise. Standard GrowPanel date string (e.g., last-6-months, YYYYMMDD-YYYYMMDD). Defaults to current period. |
regenerate (optional) | boolean | Set to true to bypass the 24-hour cache and regenerate the summary. |
Response
200 OK — summary generated or returned from cache
{
"summary": "Out of 426 cancellations this period, 61 customers wrote a comment when they left ...",
"comment_count": 61,
"generated_at": "2026-05-27T08:14:22.001Z",
"model": "claude-haiku-4-5-20251001",
"cached": false
}200 OK — too few comments to generate a useful summary
{
"summary": null,
"comment_count": 1,
"generated_at": "2026-05-27T08:14:22.001Z",
"reason": "too_few_comments"
}Response fields
| Field | Type | Description |
|---|---|---|
summary | string | null | Markdown paragraph with inline tooltip links ([label](url "tooltip")) pointing to the customers behind each pattern. null if there are fewer than 3 comments. |
comment_count | number | Number of cancellation comments included in the summary |
generated_at | string | ISO timestamp when this summary was generated |
model | string | Claude model used to generate the summary |
cached | boolean | true if served from the 24-hour KV cache, false if freshly generated |
reason | string (optional) | When summary is null: no_comments or too_few_comments |
Example requests
Default period
curl https://api.growpanel.io/reports/churn-reasons-summary \
-H "Authorization: Bearer YOUR_API_KEY"Last 12 months
curl "https://api.growpanel.io/reports/churn-reasons-summary?date=last-12-months" \
-H "Authorization: Bearer YOUR_API_KEY"Force regenerate (bypass cache)
curl "https://api.growpanel.io/reports/churn-reasons-summary?regenerate=true" \
-H "Authorization: Bearer YOUR_API_KEY"Notes
Source data: The summary only sees the freetext
cancel_commentfield from cancellations in the period. The structuredcancel_reasonenum is also provided to the model as context but the summary focuses on what customers actually wrote in their own words.
Stripe-only today: Only Stripe currently provides a customer-facing freetext cancellation comment field (
cancellation_details.comment). Chargebee, Recurly, and Alunta cancellations will show empty comments and won't contribute to the summary.
Caching: Results are cached in KV for 24 hours, keyed by account and date range. Use
regenerate=trueto bypass.