Google Analytics 4 + Intercom CSAT + Stripe MRR: Monday Morning CEO Brief to Microsoft Teams via Make

One automated message, every Monday at 8 AM — traffic, support health, and revenue in a format a CEO can act on in 60 seconds.

The flow
Google Analytics logo
Source
Google Analytics
Intercom logo
Process
Intercom
Stripe logo
Process
Stripe
Make logo
Process
Make
Microsoft Teams logo
Destination
Microsoft Teams

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

Why this stack

Founders and small leadership teams burn 30–60 minutes every Monday pulling numbers from four different tabs before they can run a meaningful standup. GA4 for traffic, Intercom for support health, Stripe for revenue — none of these talk to each other natively. The manual aggregation is inconsistent, and when someone skips it, the team operates blind.

These three sources cover the minimum viable health dashboard for a SaaS product between $10K and $500K MRR. Acquisition (GA4 sessions and conversions), satisfaction (Intercom CSAT), revenue (Stripe MRR and new MRR) — they answer three questions: are people finding us, are we serving them well, are we getting paid? Everything else is optimization on top of those three.

Make's visual scenario builder handles three separate API sources, data transformation, and conditional formatting in one workflow without code. A non-technical ops hire can maintain it. If you want more control or self-hosting, use n8n — the steps are identical either way.

Two things to know before you start. GA4's Data API requires a Google Cloud project with the API enabled and OAuth2 credentials — that's the most annoying setup step, budget 45 minutes for it. Stripe and Intercom are straightforward by comparison. Also, CSAT data in Intercom only exists if you've enabled CSAT surveys — check Settings > Messenger > CSAT before you build anything. Don't build this if your team already runs a structured weekly metrics review in Notion or Metabase — it's redundant. Skip it too if you have more than 15 people on the leadership team; at that scale you need a proper BI layer, not a Teams message.

The stack (5)

  1. Google Analytics logo

    Web analytics most teams already run.

    The Data API makes traffic a free input for weekly ops digests.

  2. Intercom logo

    Customer messaging + support inbox.

    Conversation data surfaces churn/expansion signals worth routing to chat.

  3. Stripe logo

    Global payments with first-class APIs.

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

  4. 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.

  5. Microsoft Teams logo

    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. 1

    Set up a Make scenario with a Monday 8 AM schedule trigger

    Create a new scenario in Make. Set the trigger to Scheduler: every week on Monday at 08:00. Set the timezone explicitly — Make defaults to UTC, which will mis-time delivery if your team is in IST or PST. Name the scenario `CEO Monday Brief`. Turn on scenario logging so you can debug API failures in the run history.

  2. 2

    Pull last week's GA4 key metrics via the Data API

    Add an HTTP module in Make. Method: POST. URL: `https://analyticsdata.googleapis.com/v1beta/properties/{GA4_PROPERTY_ID}:runReport`. Auth: OAuth2 with your Google Cloud credentials. Body: `{ "dateRanges": [{"startDate": "7daysAgo", "endDate": "yesterday"}], "metrics": [{"name": "sessions"}, {"name": "newUsers"}, {"name": "conversions"}], "dimensions": [{"name": "date"}] }`. Parse the response to get totals: `total_sessions`, `total_new_users`, `total_conversions`. For WoW delta, make a second identical call with `startDate: 14daysAgo, endDate: 8daysAgo` and compute the difference.

  3. 3

    Fetch Intercom CSAT score and open conversation count for last 7 days

    Add an HTTP module for Intercom. Endpoint: `GET https://api.intercom.io/conversations?created_after={unix_7d_ago}`. Parse conversations to compute: `total_conversations`, `csat_rated_count`, `csat_positive_count`, `csat_score = csat_positive_count / csat_rated_count * 100`. Also count conversations with `state: open` and `waiting_since` older than 24 hours — those are your breach tickets. The `conversation_rating` field holds the CSAT response: 1 = positive, 0 = negative.

  4. 4

    Fetch Stripe MRR, new MRR, and churned MRR for the week

    Add a Stripe module: `List Subscriptions` with `status: active` and `created: gte {7d_ago_unix}`. Sum `plan.amount * quantity` for new subscriptions to get new MRR. For churned MRR, call `List Subscriptions` with `status: canceled` and `canceled_at: gte {7d_ago_unix}` and sum those amounts. Net new MRR = new MRR - churned MRR. For total MRR, use Stripe's `mrr` property on the subscription object if your plan supports it — if not, compute from all active subscriptions. The latter requires pagination but is more reliable.

  5. 5

    Compute trend arrows and format delta strings

    Add a Make Tools > Set Variables module. Compute: `sessions_delta = ((this_week_sessions - last_week_sessions) / last_week_sessions * 100).toFixed(1)`. Do the same for `new_users`, `conversions`, and `csat_score`. Assign emoji arrows: delta > 0 gets `↑`, delta < 0 gets `↓`, within ±2% gets `→`. These let a CEO scan the message in 10 seconds without reading every number.

  6. 6

    Build and post the Microsoft Teams Adaptive Card

    Add an HTTP module targeting your Teams channel incoming webhook URL. Content-Type: `application/json`. Body: an Adaptive Card with `type: AdaptiveCard, version: 1.3`. Structure: a TextBlock header `📊 Monday Brief — Week of {date}`, then three ColumnSets for Traffic, Support, and Revenue. Each column shows metric name, value, and the delta arrow string. Keep it to 9 numbers total — more than that and executives stop reading. End with a single action button linking to your internal dashboard or Stripe dashboard.

  7. 7

    Add a red-flag conditional block for any metric in breach

    Before the Teams post, add a Make Router. If `csat_score < 70` OR `net_new_mrr < 0` OR `sessions_delta < -15`, prepend a red warning block to the Adaptive Card: `🔴 Attention Required` with a bullet list of the breaching metrics. If no breaches, the card renders in standard format. This keeps the brief informational on good weeks and urgent on bad ones — same message format either way, no extra noise.

  8. 8

    Log each brief to a Google Sheets archive for trend analysis

    Add a final Google Sheets node: Append Row to a sheet named `CEO Brief Archive`. Columns: `week_of`, `sessions`, `sessions_wow_pct`, `new_users`, `conversions`, `csat_score`, `open_breach_tickets`, `new_mrr`, `churned_mrr`, `net_new_mrr`. After 12 weeks of data, this sheet becomes the source of truth for your monthly board update and kills the need to manually reconstruct historical metrics from four separate tool dashboards.

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