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

ParameterTypeDescription
date (optional)stringDate range to summarise. Standard GrowPanel date string (e.g., last-6-months, YYYYMMDD-YYYYMMDD). Defaults to current period.
regenerate (optional)booleanSet 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

FieldTypeDescription
summarystring | nullMarkdown paragraph with inline tooltip links ([label](url "tooltip")) pointing to the customers behind each pattern. null if there are fewer than 3 comments.
comment_countnumberNumber of cancellation comments included in the summary
generated_atstringISO timestamp when this summary was generated
modelstringClaude model used to generate the summary
cachedbooleantrue if served from the 24-hour KV cache, false if freshly generated
reasonstring (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_comment field from cancellations in the period. The structured cancel_reason enum 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=true to bypass.