Amplitude Cohort Retention Drop + Stripe MRR Shrinkage: Correlated Weekly Alert to Slack via Make

Auto-correlate Amplitude retention drops with Stripe MRR shrinkage every Monday morning — so you know which cohort is churning and what it's costing before standup starts.

The flow
Amplitude logo
Source
Amplitude
Stripe logo
Process
Stripe
Make logo
Process
Make
Slack logo
Destination
Slack

The stack in the order it runs — data flows from the source through to where it lands.

Why this stack

The actual problem: retention data lives in Amplitude, revenue data lives in Stripe, and the people watching each tool rarely talk. By the time someone manually connects 'week 6 retention dropped 8 points for the March cohort' to 'MRR is down $3,200 this week', it's Wednesday. The intervention window is gone.

Make (formerly Integromat) is the right glue because it handles a sequential HTTP → transform → HTTP chain with visual debugging — which matters when you're joining two data sources with mismatched schemas. Amplitude's Behavioral Cohort API and Stripe's Subscription API both return paginated JSON. Make's iterator module eats that without a single line of custom code.

Stripe's `/v1/subscriptions` endpoint filters by `status=canceled` and a `canceled_at` range, so you can tie cancellations directly back to cohort signup dates. The match isn't perfect — a March cohort user might churn in August — but it's strong enough to trigger an investigation. That's all an alert needs to do.

Two cases where you should skip this entirely: first, if you haven't set up cohort analysis in Amplitude — specifically weekly retention by signup week — this workflow produces noise, not signal. Fix that first. Second, if your Stripe MRR is below $5K/month, individual cancellations are better handled manually. The automation earns its complexity at scale.

The stack (4)

  1. Amplitude logo

    Product analytics with strong cohorting.

    Great when retention/cohort questions drive the reporting cadence.

  2. Stripe logo

    Global payments with first-class APIs.

    Events + Sigma let you wire billing into any ops report or alert.

  3. Make logo

    No-code automation builder. Visual scenarios that chain APIs and AI calls.

    Per-operation pricing is cheaper than Zapier at the volumes I run, and the visual editor handles branching cleanly.

  4. Slack logo

    Team chat where most ops alerts and reports land.

    The default place a small team already lives — pipe reports here instead of email nobody opens.

How it runs

  1. 1

    Configure the Amplitude Cohort Export API

    In Amplitude, go to project settings and generate an API key + secret key pair. Identify the cohort ID for your 'Active Users — Last 30 Days' cohort — or create one: Behavioral Cohorts → New Cohort → users who performed any event in the last 30 days. Pull the cohort ID from the URL. You'll call `POST https://amplitude.com/api/2/cohorts/request/{cohort_id}` to trigger an async export, then poll `GET https://amplitude.com/api/2/cohorts/request-export-id/{requestId}` until status returns 'SUCCESS'.

  2. 2

    Build the Make scenario with a weekly schedule

    In Make, create a new scenario. Add a Schedule module — set it to run every Monday at 07:00 in your team's timezone. That gives the scenario enough runway to pull data before standup. Name it 'Weekly Retention-MRR Correlation'. Under Scenario Settings, set Max execution time to 300 seconds and enable 'Sequential processing'. That last setting matters: it prevents duplicate runs if the previous week's job is still polling Amplitude.

  3. 3

    Fetch this week's and last week's retention from Amplitude

    Add two HTTP modules in sequence. Both call Amplitude's Chart API: `GET https://amplitude.com/api/2/retention?e={event_filter}&rm=rolling&interval=7&limit=8`. Use Basic Auth with your API key and secret. The response returns a `data.xValues` array (weeks) and `data.series[0]` array (retention percentages). Extract week N-1 and week N-2. Calculate the delta — if current week retention is more than 5 percentage points below the prior week, set a variable `retentionAlertTriggered = true`. Store both values and the delta for use downstream.

  4. 4

    Pull canceled Stripe subscriptions from the past 7 days

    Add an HTTP module: `GET https://api.stripe.com/v1/subscriptions?status=canceled&created[gte]={7_days_ago_unix}&limit=100`. Authenticate with your Stripe secret key via HTTP Basic Auth — key as username, blank password. Use Make's Iterator module to loop over the returned `data` array. For each canceled subscription, extract: `id`, `customer`, `plan.amount`, `canceled_at`, and `metadata.signup_cohort` (if you tag cohorts in metadata — if not, approximate using the `created` date). Sum the total MRR lost into a variable called `mrrShrinkage`.

  5. 5

    Correlate cohort overlap between Amplitude and Stripe

    Add a Tools → Set Multiple Variables module. Compute two things: `affectedCohortWeek` = the ISO week of the Amplitude retention drop. `stripeChurnsInCohort` = count of Stripe cancellations where `canceled_at` falls within ±14 days of that cohort's retention drop week. This is a directional signal, not a precise match. If `stripeChurnsInCohort > 0` AND `retentionAlertTriggered = true`, set `correlationDetected = true`. If only one condition is true, the alert still fires — but with a lower severity tag.

  6. 6

    Format the Slack message payload

    Add a Make Tools → Create JSON module. Build a Slack Block Kit payload with four blocks: a header block reading '📉 Weekly Retention-MRR Correlation Alert'; a section block with the retention delta ('Week-over-week retention dropped from X% to Y% — a Z point decline'); a section block with MRR impact ('{{stripeChurnsInCohort}} cancellations in the correlated cohort — estimated MRR impact: ${{mrrShrinkage}}'); and a context block with timestamp and the note 'Correlation is directional — verify in Amplitude before actioning'. Color the attachment red if `correlationDetected = true`, yellow if only one signal fired.

  7. 7

    Post to Slack with conditional routing

    Add a Router module with two routes. Route 1: if `correlationDetected = true`, post to both #product-health and #finance-ops using the Slack 'Create a Message' module with your Bot Token. Route 2: if only `retentionAlertTriggered` fired but no Stripe correlation, post to #product-health only with: 'Retention dip detected — no corresponding Stripe churn signal yet. Monitor for 48 hours.' Finance doesn't need noise from blips that never show up in revenue.

  8. 8

    Add a no-alert confirmation on clean weeks

    Add a final Slack module on the 'all clear' path. If neither alert triggered, post one line to #ops-digest: '✅ Retention-MRR check passed — no correlated drop this week. Retention: X%, cancellations: Y.' A scheduled job that only posts on failures creates anxiety when it goes quiet. The weekly green check trains the team to trust the system — they know silence means the job broke, not that everything is fine.

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 services

More like this