Stripe + Google Sheets: churn reasons you can act on
Churn data is everywhere and nowhere at the same time. Stripe tells you someone canceled, but the “why” lives in a messy inbox thread, a support ticket, or (most often) not at all.
If you run retention as a product manager, you’re stuck guessing which fixes matter. A founder sees revenue dip and wants answers now. And customer success teams end up doing awkward, manual follow-ups that customers ignore. This churn feedback automation collects reasons automatically, then organizes them so you can actually use them.
You’ll set up an n8n workflow that emails an exit survey on cancellation, logs every cancellation to Google Sheets, and routes replies into separate tabs by churn reason.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Stripe + Google Sheets: churn reasons you can act on
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Survey Response Webhook"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Feedback Type", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Log Price Concerns", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Log Feature Requests", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Log Other Feedback", pos: "b", h: 48 }
n5 --> n6
n5 --> n7
n5 --> n8
n4 --> n5
end
subgraph sg1["Stripe Subscription Canceled Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/stripe.svg' width='40' height='40' /></div><br/>Stripe Subscription Canceled"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/stripe.svg' width='40' height='40' /></div><br/>Get Customer Details"]
n2@{ icon: "mdi:message-outline", form: "rounded", label: "Send Feedback Survey Email", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Log to Cancellations Sheet", pos: "b", h: 48 }
n1 --> n2
n2 --> n3
n0 --> n1
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n5 decision
class n6,n7,n8,n3 database
class n4 api
classDef customIcon fill:none,stroke:none
class n4,n0,n1 customIcon
Why This Matters: You Can’t Fix Churn You Can’t Categorize
Cancellations feel “normal” until you try to explain them. One customer leaves because pricing is too high. Another churns because a feature is missing. A third had a bad onboarding week and never recovered. When those reasons aren’t captured consistently, you get the worst kind of product signal: loud, anecdotal, and hard to prioritize. Someone forwards a cancellation email. A Slack message gets lost. The team argues in circles because there’s no shared view of what’s happening.
It adds up fast. Here’s where it usually breaks down.
- You only see a cancellation event in Stripe, so you’re left inferring the “why” from plan type or tenure.
- Manual follow-up emails take time, and the longer you wait, the less likely customers are to respond.
- Feedback gets logged inconsistently, which means you can’t compare one month to the next with confidence.
- Even when you do collect reasons, they’re scattered across tools, so nobody reviews them weekly.
What You’ll Build: Stripe Cancellation → Exit Survey → Sorted Sheets
This workflow turns every Stripe cancellation into a simple, repeatable feedback loop. The moment a subscription is canceled, n8n catches the event through a Stripe webhook and pulls the customer profile (email, name, and plan details) from Stripe’s API. Then it emails a short exit survey link that already “knows” who the customer is, because those details are embedded in the URL as hidden fields. At the same time, the workflow logs the cancellation into a Google Sheets “Cancellations” tab so you always have a complete record. When the customer submits the survey, another webhook receives the response and routes it into the right Google Sheets tab based on the reason they chose.
The workflow starts with Stripe, moves through a personalized email touchpoint, and ends with clean, categorized data in Google Sheets. Pricing complaints land in one place, feature requests in another, and everything else stays searchable without polluting the main view.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you average 15 cancellations a week. Manually, even a “quick” process is about 10 minutes to look up the customer, write an email, paste a survey link, and log it somewhere, which is roughly 2.5 hours weekly. With this workflow, the send-and-log part happens automatically in seconds, and you only spend time reviewing replies. If you do a 30-minute weekly review of categorized feedback in Google Sheets, you’ve bought back about 2 hours and you’re making sharper decisions.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Stripe to detect cancellations and fetch customer data.
- Google Sheets to store, filter, and sort churn reasons.
- Email service credentials (get it from Gmail, Outlook, or your SMTP provider).
Skill level: Beginner. You’ll copy a webhook URL, connect accounts, and edit a few text fields in an email template.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
Stripe cancellation triggers the workflow. When a subscription is canceled in Stripe, the Stripe webhook node fires immediately so you don’t have to monitor anything manually.
Customer details are pulled from Stripe. n8n uses the cancellation event to fetch the customer profile (name, email, plan), which means your survey request can be personal and relevant instead of generic.
The survey email is sent and the cancellation is logged. The workflow sends a feedback email through your chosen email node, then appends a row to a Google Sheets “Cancellations” tab so you have a clean ledger of churn events.
Survey responses come back and get sorted automatically. When the customer submits your form (Tally, Typeform, or another webhook-friendly tool), the response webhook receives it and a routing step sends the row into “Price Concerns”, “Feature Requests”, or “Other Feedback” tabs.
You can easily modify the routing categories to match your product (for example, “Onboarding”, “Performance”, or “Switching to competitor”) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Stripe Trigger
This workflow starts when a Stripe subscription is canceled.
- Add the Stripe Cancel Trigger node and set Events to
customer.subscription.deleted. - Credential Required: Connect your Stripe credentials in Stripe Cancel Trigger.
- Verify the webhook ID is created for Stripe and map it in your Stripe dashboard for subscription cancellation events.
Step 2: Retrieve the Customer and Send the Survey Email
Use Stripe to fetch customer details and send a survey email to the canceled user.
- Add Retrieve Client Profile and set Resource to
customer. - Set Customer ID to
{{ $json.data.object.customer }}. - Credential Required: Connect your Stripe credentials in Retrieve Client Profile.
- Add Dispatch Survey Email and set To Email to
{{ $json.email }}. - Set Subject to
We're sorry to see you go — Quick 1-min survey. - Set From Email to
[YOUR_EMAIL]and paste the provided HTML into HTML, including the survey URL and dynamic fields. - Credential Required: Connect your SMTP/Email credentials in Dispatch Survey Email.
[SURVEY_URL] and [YOUR_EMAIL] in Dispatch Survey Email before testing, or the link and sender will be invalid.Step 3: Log the Cancellation in Google Sheets
After the email is sent, the workflow logs the cancellation details to a spreadsheet.
- Add Append Cancellation Log and set Operation to
append. - Select your Google Sheet in Document ID and target the sheet with Sheet Name set to
gid=0. - Map columns using the existing expressions like
{{ $('Dispatch Survey Email').item.json.accepted ? 'Success' : 'Failed' }}and{{ new Date().toISOString() }}. - Credential Required: Connect your Google Sheets credentials in Append Cancellation Log.
Step 4: Collect Survey Responses and Route Feedback
A webhook receives survey responses, then a switch routes them to the right feedback sheet.
- Add Survey Reply Hook and set HTTP Method to
POSTwith Path set tosurvey-response. - Add Route Feedback Reasons and configure rules to check Left Value as
{{ $json.reason }}with Right Value set toexpensiveandfeature, using Contains. - Keep Fallback Output set to
extraso other reasons still route.
reason, plan, name, email, and comments so the routing and logging work correctly.Step 5: Configure Feedback Logging Sheets
Each feedback category appends its data to a separate sheet.
- In Record Price Issues, set Operation to
appendand Sheet Name toPrice Concerns. - In Record Feature Requests, set Operation to
appendand Sheet Name toFeature Requests. - In Record Other Feedback, set Operation to
appendand Sheet Name toOther Feedback. - Confirm each node maps columns using expressions like
{{ $json.plan }},{{ $json.comments || 'N/A' }}, and{{ new Date().toISOString() }}. - Credential Required: Connect your Google Sheets credentials in Record Price Issues, Record Feature Requests, and Record Other Feedback.
Step 6: Test and Activate Your Workflow
Run end-to-end tests to validate both the cancellation flow and the survey response logging.
- Manually trigger Stripe Cancel Trigger using a test cancellation in Stripe, then confirm Retrieve Client Profile and Dispatch Survey Email execute successfully.
- Verify a row is appended in Append Cancellation Log with the correct customer and plan fields.
- POST a sample payload to the Survey Reply Hook endpoint and confirm Route Feedback Reasons routes to the correct sheet node.
- Successful execution looks like a new row in Record Price Issues, Record Feature Requests, or Record Other Feedback based on the reason.
- Turn the workflow to Active for production use.
Troubleshooting Tips
- Stripe webhooks are picky about endpoints. If cancellations aren’t triggering, check the Stripe Dashboard → Developers → Webhooks to confirm the event type is customer.subscription.deleted and deliveries aren’t failing.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Google Sheets writes can fail when sheet names or columns don’t match. Confirm your spreadsheet has the four tabs (“Cancellations”, “Price Concerns”, “Feature Requests”, “Other Feedback”) and that the connected Google account has edit access.
Quick Answers
About 20 minutes if your Stripe, email, and Sheets are ready.
No. You’ll connect accounts, paste webhook URLs, and edit an email template.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in survey tool costs (Tally can be free, Typeform is usually paid).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Most teams change the “Route Feedback Reasons” switch conditions to match their exact survey options, then add or rename Google Sheets tabs to keep categories clean. You can also adjust the “Dispatch Survey Email” content by plan type, or insert a short Wait before emailing so it doesn’t feel too immediate. If you later want follow-ups, trigger a second workflow when the “Survey Reply Hook” receives a response.
Usually it’s a webhook mismatch or API permissions. Confirm the Stripe trigger is listening for the correct event (customer.subscription.deleted), then re-check your Stripe credentials in n8n. Also look at the most recent webhook delivery in Stripe to see the exact error message. If you’re testing, make sure you’re in Stripe test mode end-to-end, because mixing live and test data can look like “nothing is happening.”
It can handle typical SMB churn volumes easily. On n8n Cloud, capacity depends on your plan’s monthly executions, while self-hosting has no fixed execution cap (it’s mainly your server). Practically, each cancellation and each survey submission is an execution, so 200 cancellations a month with 50 survey responses is roughly 250 runs. If you’re routing into multiple Sheets or doing extra enrichment, plan for a bit more.
Often, yes, if you care about routing logic and control. n8n makes it straightforward to branch based on churn reason and write to different Google Sheets tabs without turning your automation into a pile of separate Zaps or scenarios. Self-hosting is also a big deal if you want unlimited runs without worrying about task pricing. Zapier and Make can still be fine when you want the simplest setup and you’re only doing one write to one sheet. If you’re torn, Talk to an automation expert and describe your churn volume and tooling.
You don’t need more churn anecdotes. You need organized churn reasons you can review weekly, act on, and measure against the next month’s cancellations.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.