Auto-survey churned users and read the answers in chat

Stop guessing why customers leave. Trigger a 3-question survey on cancellation, then ask the agent to summarize the responses weekly.

Published

difficulty intermediate · time to value 5 minutes · tools used 3

Just say this

Create a survey that fires for users who just canceled their subscription, asking why they left, what would have changed their mind, and whether they'd come back. Then set up a weekly Routine that summarizes the responses for me.

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_users updated daily
  • A weekly Routine that summarizes new responses and DMs you the highlights

Walk through it

You

Create a survey for users who just canceled. Three questions:

  1. What’s the main reason you canceled?
  2. What would have made you stay?
  3. 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.

Agent

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" }
Agent

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?”

Try this recipe in your own agent.

Paste the prompt above into your agent. It'll set up Agentry against your data, then run the recipe and show you the real output.

Install https://agentry.sh/agentry.md and set it up