Why this matters
Email-based exit interviews get 15% response rates. People hate writing emails. They especially hate writing emails about why they left a product they don’t care about anymore.
In-app surveys get 60%+ response rates. Right place, right time, low friction, single click.
The problem is most teams have churn data in one system (Stripe), users in another (PostHog), surveys in a third (Typeform). Wiring them together is a project. Agentry has the cohort + survey + events all in one place — the agent stitches them in one prompt.
Then the reading of the responses is the second hurdle. 200 free-form text answers is a lot to wade through. Asking the agent to “summarize what people said this month” turns it into 5 bullet points you can actually act on.
What you get
- A 3-question survey that triggers when a user cancels
- A cohort
churned_usersupdated daily - A weekly Routine that summarizes new responses and DMs you the highlights
Walk through it
Create a survey for users who just canceled. Three questions:
- What’s the main reason you canceled?
- What would have made you stay?
- Would you come back if we fixed that?
Show it in-app the next time they visit, even if they’re already logged out. Then set up a weekly Routine that summarizes responses.
Building. First the cohort, then the survey, then the Routine.
agentry_create_cohort {
project_id: "default",
name: "churned_users",
filter: { has_event: "subscription_canceled", in_last_days: 30 }
}
{ "cohort_id": "co_churn30" }
agentry_create_survey {
project_id: "default",
name: "Cancellation feedback",
type: "popup",
targeting: { cohort: "co_churn30" },
display_conditions: {
show_when: "always", // show on next page load after cancellation
dismiss_after_responses: 1
},
questions: [
{
type: "single_choice",
question: "What's the main reason you canceled?",
choices: [
"Too expensive",
"Missing a feature I need",
"Found a better alternative",
"Not using it enough",
"Bugs / reliability issues",
"Other (please specify)"
]
},
{
type: "open_ended",
question: "What would have made you stay?",
placeholder: "One sentence is fine"
},
{
type: "rating",
question: "If we fixed that, would you come back?",
scale: 5,
labels: { 1: "Not a chance", 5: "Definitely" }
}
]
}
{ "survey_id": "sv_can1", "active": true }
/schedule "0 9 * * MON" "
Fetch responses to survey sv_can1 from the last 7 days.
Group by question 1 (cancellation reason).
For question 2, extract themes from the open-ended responses (cluster similar feedback).
For question 3, compute average willingness-to-return.
Format as a brief markdown report and DM it to me via Slack webhook
https://hooks.slack.com/services/.../...
"
{ "routine_id": "rt_chsm", "next_run_at": "2026-05-19T09:00:00Z" }
Done. Survey is live. Weekly Routine runs Monday at 9am.
The survey will appear in-app on the cancelled user’s next visit. Even if they don’t come back to your app, you can also email them the survey URL (agentry.sh/s/sv_can1) — though in-app gets ~4x response rate.
The output
A weekly Slack DM in your #me-only channel:
📋 Cancellation Survey — Week of 2026-05-19
Responses: 23 (out of 41 cancellations — 56% response rate)
WHY THEY CANCELED:
Missing feature 9 ████████ 39%
Not using enough 6 █████ 26%
Too expensive 4 ███ 17%
Found alternative 3 ██ 13%
Bugs / reliability 1 ▌ 4%
THEMES from "what would have made you stay" (open-ended):
• Want better Slack integration (5 mentions)
• Want native mobile app (4 mentions)
• Pricing should have an annual discount (3 mentions)
• UI is confusing during onboarding (3 mentions)
AVG willingness to return if we fixed it: 3.4 / 5
3 respondents said "Definitely (5)" — they're the highest-priority winbacks
ACTIONS THIS WEEK:
→ 3 hot winback candidates: [email protected], [email protected], [email protected]
(their reasons are addressable — DM in #cs to assign)
→ Top theme: Slack integration. Already on Q2 roadmap.
→ Top "easy" win: annual discount — talk to billing.
Setting it up
Three pieces:
1. Fire subscription_canceled on cancellation. Agentry has no SDK — this is a raw POST to /v1/analytics/:
// In your Stripe webhook handler or cancellation endpoint
await fetch(`https://api.agentry.sh/v1/analytics/${process.env.AGENTRY_PROJECT_ID}/`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.AGENTRY_DSN}`,
"Content-Type": "application/json",
"User-Agent": "myapp/1.0", // REQUIRED — Cloudflare 403s default UAs
},
body: JSON.stringify({
event: "subscription_canceled",
distinct_id: user.email,
properties: {
reason_self_reported: cancelReason, // from the cancel form, if any
plan: user.plan,
tenure_days: daysSince(user.subscription_started_at),
},
}),
});
2. Make sure the PostHog snippet is loaded on your app (this is what actually renders the survey in the user’s browser — surveys are PostHog-served). Agentry’s MCP wires this automatically via agentry_install_guide, but if you set up analytics manually, ensure the PostHog posthog-js snippet is loaded. The PostHog snippet handles the survey UI; Agentry is the brain that creates / targets / reads it.
3. (Optional) Add a manual cancellation page that links to the survey directly. For users who fully bounce from the app, an email with the survey URL gives a second shot:
Hi {{first_name}},
You canceled last week. We'd be grateful if you spent 60 seconds telling us why:
https://agentry.sh/s/sv_can1
It's three questions. Doesn't go to a marketing team — it goes to me directly.
— Henrik
In-app surveys outperform email, but the union of both maximizes response rate.
Variations
- “Create a survey for users who downgraded (not canceled) — different cohort, slightly different questions.”
- “Show a different survey to users who hit a specific error 3+ times — ‘is this stopping you from using us?’”
- “After we ship the Slack integration, survey the cohort of users who said that was their reason — ‘we built it, want to come back?’”
- “Group survey responses by company size — do enterprise churners say different things than indie hackers?”