Stripe Subscription Churn + Intercom Conversation History: Weekly At-Risk Account Brief to Microsoft Teams via Make
Every Monday at 8 AM, your CS team gets a list of every account that canceled or downgraded in the last 7 days — with their last Intercom conversation attached — before standup.
The stack in the order it runs — data flows from the source through to where it lands.
The real failure mode: an account churns, someone fires off a win-back email, and nobody checked that there's an open Intercom thread from 3 days ago where the user reported a bug and got no reply. That win-back email lands tone-deaf. The conversation is already dead before it starts.
Make is the right tool here because it has native Stripe and Intercom modules with pre-built pagination — no custom HTTP calls, no auth plumbing. The array-iteration pattern (loop over churned accounts, fetch Intercom thread per account, post once) is exactly what Make's iterator + aggregator combo handles cleanly. Zapier breaks this on lower tiers due to multi-step limits.
Teams over Slack because enterprise CS teams live in Teams. The Make → Teams path uses the Incoming Webhook connector, which doesn't require IT admin approval on most tenants. That matters if you're inside a corporate environment where Slack isn't the standard.
One honest tradeoff on Make's free tier: 1,000 operations/month. This scenario costs roughly 3 operations per churned account — Stripe fetch, Intercom fetch, Teams post. 50 churns/week is ~600 operations/month, fine on free. Over 100 churns/week, move to the Core plan at $9/mo. Skip this entire playbook if your Stripe billing emails don't match your Intercom user emails. The join between the two systems is email address. Mismatched emails mean empty conversation lookups on most accounts.
The stack (4)
Chat + channels for Microsoft-365 shops.
If the company is on Outlook/365, Teams is where reports get read — push there, not a separate tool.
How it runs
- 1
Create a Make scenario with a weekly schedule trigger
Create a new scenario in Make. Add a Schedule module set to run every Monday at 8:00 AM in your team's timezone. Name it `weekly-churn-intercom-brief`. Running at 8 AM means the brief hits before Monday standup — not buried mid-afternoon when nobody acts on it.
- 2
Fetch Stripe subscriptions canceled in the last 7 days
Add a Stripe → Search Subscriptions module. Set the filter: `status = canceled` and `canceled_at gte [7 days ago as Unix timestamp]`. In Make, generate that timestamp with `{{subtractDays(now; 7)}}` wrapped in `{{toUnix(...)}}`. Set the limit to 100. Map these output fields: `id`, `customer`, `plan.nickname`, `canceled_at`, and `metadata.email` if you store email there — or plan to resolve it in the next step via a Get Customer call.
- 3
Resolve customer email from Stripe customer ID
Add a Stripe → Get a Customer module inside the iterator. Pass the `customer` ID from the previous step. Pull the `email` field — this is your join key to Intercom. If `email` is empty (common in B2B accounts using a generic billing address), fall back to `metadata.account_email`. If you don't already have that convention in your Stripe metadata schema, define it now before you build further.
- 4
Fetch the last Intercom conversation for each customer
Add an HTTP module — Make's generic HTTP action. Call `GET https://api.intercom.io/conversations?query=email:[customer_email]&order=desc&sort=created_at&per_page=1`. Set the Authorization header to `Bearer [your_intercom_access_token]`. Extract: `conversations[0].id`, `conversations[0].created_at`, `conversations[0].statistics.last_contact_reply_at`, and the first message body from `conversation_parts`. If no conversation comes back, set a placeholder string: `No Intercom history`.
- 5
Build the account summary object
Add a Set Variable module to assemble a per-account object: `{ email, plan, canceledAt (formatted date), lastConvoDate, lastConvoSnippet (first 200 chars of the last message body), intercomLink: 'https://app.intercom.com/a/apps/[workspace_id]/conversations/[convo_id]' }`. Hard cap the snippet at 200 characters — anything longer turns the Teams card into a wall of text. Format `canceledAt` as `YYYY-MM-DD` using Make's `{{formatDate()}}` function.
- 6
Aggregate all accounts into a single array
Add an Array Aggregator module after the iterator. Aggregate all per-account summary objects into one array. This is the most common mistake people make in Make scenarios: skipping the aggregator and posting one Teams message per account. That's notification spam. The aggregator collapses the loop so you post once.
- 7
Format the Teams Adaptive Card payload
Add a Make → Microsoft Teams → Send a Message via Incoming Webhook module. Build an Adaptive Card JSON payload with a `TextBlock` header reading `🔴 Churned Accounts This Week — [date]`, a `FactSet` per account showing Plan, Canceled Date, and Last Intercom Message Date, and an `Action.OpenUrl` button linking to the Intercom conversation. Adaptive Cards render natively in Teams and are far more readable than plain text. Prototype the layout in the Adaptive Card Designer at adaptivecards.io/designer before wiring it into Make.
- 8
Post to Microsoft Teams #customer-success channel
Set up the Incoming Webhook URL in Teams under Channel → Connectors → Incoming Webhook. Paste that URL into the Make module. Set the fallback text field to `Weekly churn brief — [N] accounts` for notifications that render without card preview. Before locking in the 7-day weekly schedule, run the scenario manually with a 30-day lookback window to validate that the output looks right end to end.
Want me to build this for you instead?
Product Audit and CTO Mode run out of this same thinking. If you’re reading this thinking “I want this, but in my product” — let’s talk.
See servicesMore like this
Gmail Thread Aging + Stripe Invoice Overdue: Unified AR Follow-Up Digest to Slack via Zapier
Surface overdue Stripe invoices and the exact age of your last Gmail thread with that customer — every morning at 8:30, automatically — so AR follow-up stops living in someone's head.
Intercom Ticket Volume + Razorpay Failed Payments: Daily Support-Cost-per-Revenue Alert to Slack via Zapier
Catch the support cost blowout from Razorpay failed payments before your agents are already buried.
Outlook Calendar Load + HubSpot Deal Velocity: Weekly Ops Digest to Microsoft Teams
Every Monday at 07:30, your revenue team gets one Teams card: last week's deal pipeline movement next to each rep's actual meeting load — so you stop guessing whether low close rates are a pipeline problem or a capacity problem.