Google Analytics 4 + Intercom Conversation Tags + Stripe Trial Status: Daily Activation Health Digest to Microsoft Teams via Pipedream

Every morning, pull GA4 activation events, Intercom onboarding conversations, and Stripe trial starts into one Teams card — so you stop confusing funnel activity with funnel results.

The flow
Google Analytics logo
Source
Google Analytics
Intercom logo
Process
Intercom
Stripe logo
Process
Stripe
Pipedream logo
Process
Pipedream
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

The silent killer for B2B SaaS: GA4 shows 40 activation events fired yesterday, but only 8 users started a Stripe trial. That 32-person gap is leaking somewhere between your product event and your billing flow. Intercom shows 15 onboarding conversations opened in the same window — meaning users hit a wall and asked for help. You need all three numbers together every morning, not in three separate tabs.

Pipedream handles this cleanly because it runs parallel HTTP branches — GA4 Data API, Intercom REST API, Stripe API — and merges them in a single code step. The GA4 Data API v1 (`runReport`) is more reliable than the old UA reporting API and returns filtered event counts without touching BigQuery. Intercom's conversation tag API filters by tag name, which is cleaner than full-text search.

Microsoft Teams Adaptive Cards support rich structured layouts. You can render a mini-table with three columns — Activation Events, Onboarding Convos, Trial Starts — and color-code the conversion rate cell. That's far more useful than a flat text message for a metric you're comparing day over day.

One hard stop before you build this: if you haven't instrumented a custom GA4 event for activation — first report run, first integration connected, first message sent, whatever it means for your product — this workflow returns empty data. Define and fire that event first. And if you have fewer than 10 daily active users, the numbers are too small to mean anything and will just generate anxiety.

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. Pipedream logo

    Code-level workflows with hosted triggers.

    Drop into Node/Python mid-flow when no-code hits a wall.

  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

    Enable the GA4 Data API and create a service account

    In Google Cloud Console, enable the Google Analytics Data API for your project. Create a Service Account with the 'Viewer' role on your GA4 property — go to GA4 Admin → Property Access Management → Add Users, paste the service account email. Download the JSON key file. In Pipedream, store the entire JSON key as an environment variable called `GA4_SERVICE_ACCOUNT_JSON`. You'll use this to generate a JWT access token inside the workflow. The GA4 Data API authenticates via OAuth2 service account auth, not API keys — there's no shortcut here.

  2. 2

    Create the Pipedream workflow with a daily schedule

    Create a new Pipedream workflow. Add a Schedule trigger set to Daily at 08:30 in your product team's timezone. In the first code step, generate a Google OAuth2 access token from your service account JSON using the `googleapis` npm package: `const auth = new google.auth.GoogleAuth({ credentials: JSON.parse(process.env.GA4_SERVICE_ACCOUNT_JSON), scopes: ['https://www.googleapis.com/auth/analytics.readonly'] })`. Store the token for all downstream HTTP calls. It expires in 1 hour — well inside your workflow runtime.

  3. 3

    Query GA4 for activation event completions in the last 24 hours

    Add an HTTP Request step: POST to `https://analyticsdata.googleapis.com/v1beta/properties/{GA4_PROPERTY_ID}:runReport`. Body: `{ dateRanges: [{ startDate: 'yesterday', endDate: 'today' }], metrics: [{ name: 'eventCount' }], dimensions: [{ name: 'eventName' }], dimensionFilter: { filter: { fieldName: 'eventName', stringFilter: { value: 'activation_complete', matchType: 'EXACT' } } } }`. Pull your count from `rows[0].metricValues[0].value` and store it as `activationEventCount`. If the filter returns no rows, set `activationEventCount = 0`.

  4. 4

    Fetch Intercom conversations tagged as onboarding from the last 24 hours

    Add an HTTP Request step: GET `https://api.intercom.io/conversations?tag_id={onboarding_tag_id}&created_after={yesterdayUnix}`. Headers: `Authorization: Bearer {INTERCOM_ACCESS_TOKEN}` and `Accept: application/json`. Find your `onboarding_tag_id` in Intercom → Settings → Tags — it's the numeric ID in the URL. Use `conversations.length` as your count. Extract user emails from `conversations[].contacts.contacts[0].id` for the Stripe correlation step. If `pages.next` exists in the response, paginate with `?page=2`.

  5. 5

    Check Stripe trial starts for the same 24-hour window

    Add an HTTP Request step: GET `https://api.stripe.com/v1/subscriptions?status=trialing&created[gte]={yesterdayUnix}&created[lte]={nowUnix}&limit=100`. Use Basic Auth with your Stripe secret key. Count the results as `trialStartCount`. For a tighter correlation, you can call the Stripe Customer API per email from the Intercom step and check for an active trial — but for a daily digest, the count comparison is enough. Flag the day if `trialStartCount / activationEventCount < 0.25`.

  6. 6

    Compute the activation funnel ratios

    Add a Node.js code step. Calculate `activationToTrialRate = (trialStartCount / activationEventCount * 100).toFixed(1) + '%'`. Calculate `onboardingConvoRate = (onboardingConvoCount / activationEventCount * 100).toFixed(1) + '%'`. Assign status labels: below 25% → '🔴 Low conversion', 25–50% → '🟡 Watch', above 50% → '🟢 Healthy'. For week-over-week context, store last week's activation count in Pipedream's data store using `this.$db.set('lastWeekActivations', value)` and retrieve it this run to compute the WoW delta.

  7. 7

    Build the Microsoft Teams Adaptive Card

    Add an HTTP POST step to your Teams Incoming Webhook URL. Build an Adaptive Card with a `ColumnSet` showing three columns: 'GA4 Activations: {{activationEventCount}}', 'Intercom Onboarding Convos: {{onboardingConvoCount}}', 'Stripe Trials Started: {{trialStartCount}}'. Add a second row for conversion rates. Add a `TextBlock` with the status label and a brief interpretation — if 🔴, include: 'Check for friction in your billing flow — high activation but low trial start suggests a paywall or onboarding drop-off between activation and trial creation.' Keep the card under 50KB.

  8. 8

    Add 7-day trend context to the card

    Retrieve the last 7 days of `activationEventCount` values from Pipedream's built-in data store using `this.$db.get('activationHistory')` — it returns an array. Append today's value and trim to 7 items. Display as a comma-separated trend line in the Teams card: 'Last 7 days: 12, 15, 11, 18, 14, 16, {{today}}'. This tells your product lead immediately whether today's number is an anomaly or part of a slide. Write the updated array back to the data store after posting.

  9. 9

    Route alert severity to the right Teams channel

    Add a conditional step: if status is '🔴 Low conversion', POST to both `#product-health` and `#growth` using two separate webhook URLs. If '🟡 Watch', post only to `#product-health`. If '🟢 Healthy', post a condensed one-liner to `#ops-digest` only: 'Activation Health: ✅ {{activationEventCount}} activations → {{trialStartCount}} trials ({{activationToTrialRate}})'. Don't ping the full team on green days. Alert fatigue kills the usefulness of these digests inside two weeks.

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