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 stack in the order it runs — data flows from the source through to where it lands.
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)
Web analytics most teams already run.
The Data API makes traffic a free input for weekly ops digests.
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
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
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
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
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
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
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
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
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 servicesMore like this
Google Analytics 4 + HubSpot Lifecycle Stage: Weekly Acquisition-Quality Digest to Slack via Pipedream with Claude Narrative
Stop reporting traffic numbers. Report whether the traffic you paid for last week actually became pipeline — with a one-paragraph executive summary written by Claude.
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.
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.