Automate a weekly pipeline report with HubSpot and Slack using Make

medium complexityCost: $9-29/mo

Prerequisites

Prerequisites
  • Make account (Core plan or higher for scheduling intervals under 15 minutes — though weekly is fine on any plan)
  • HubSpot connection configured in Make via OAuth
  • Slack connection configured in Make (Bot Token with chat:write scope)

Overview

Make (formerly Integromat) is well-suited for this workflow because its visual flow builder handles data aggregation natively — no code required. You'll use Make's HubSpot module to search deals, an Iterator to process them, Aggregators to compile metrics, and the Slack module to deliver the report.

Step 1: Create a scenario and schedule it

Create a new scenario in Make. Click the clock icon at the bottom-left to configure the schedule:

  • Schedule type: At regular intervals
  • Run scenario: Every week
  • Day: Monday
  • Time: 08:00
  • Timezone: Select your team's timezone

On the Free plan, the minimum interval is 15 minutes. For weekly schedules, any plan works.

Step 2: Fetch pipeline stages

Add an HTTP module (Make an API Call) to fetch pipeline stage names:

  • URL: https://api.hubapi.com/crm/v3/pipelines/deals
  • Method: GET
  • Headers: Use the HubSpot connection (Make adds the Authorization header automatically)

This gives you a mapping of stage IDs to human-readable labels. You'll reference this in later steps.

Step 3: Search for deals

Add a HubSpot CRM module → Search CRM Objects:

  • Object type: Deals
  • Filter: Pipeline equals "default" (or your pipeline name)
  • Properties to return: dealname, amount, dealstage, closedate, createdate, hubspot_owner_id, hs_lastmodifieddate
  • Limit: Set to the maximum (Make handles pagination for you)
Automatic pagination

Unlike n8n or Zapier, Make's HubSpot module handles pagination automatically. It iterates through all matching results internally, emitting one bundle per deal. You don't need to build a pagination loop.

Step 4: Aggregate deals into metrics

This is where Make's visual builder shines. You need to collect all deal bundles into summary metrics.

Option A: Numeric Aggregator (simple metrics)

Add a Numeric Aggregator module:

  • Source module: The HubSpot Search module
  • Aggregate function: SUM
  • Value: Map amount from the deal bundles

This gives you total pipeline value in a single output bundle.

Option B: Array Aggregator + Router (full report)

For a richer report, use a Router with two branches:

Branch 1 — Summary metrics:

  1. Add a Numeric Aggregator → SUM of amount → outputs total pipeline value
  2. Add a second Numeric Aggregator → COUNT → outputs deal count

Branch 2 — Stage breakdown:

  1. Add a Text Aggregator module
    • Source module: HubSpot Search
    • Text: • {{stage_label}}: 1 deal (you'll map the stage name from Step 2)
    • Row separator: newline

The Text Aggregator compiles all deals into a formatted string that becomes the body of your Slack message.

Aggregator operation cost

Each module run counts as one credit in Make. The Numeric Aggregator processes all bundles but only counts as 1 credit. However, if you use an Iterator before the Aggregator, each iterated bundle counts as a separate operation through downstream modules. For a 50-deal pipeline, this means ~50 credits per run for the Iterator path. Keep this in mind when budgeting.

Step 5: Send to Slack

Add a Slack module → Create a Message:

  • Connection: Your Slack bot connection
  • Channel: Select #sales-reports from the dropdown (or enter a channel ID)
  • Text: Map the aggregated metrics from Step 4

For mrkdwn formatting:

📊 *Weekly Pipeline Report*
 
*Total Pipeline:* ${{totalValue}}
*Active Deals:* {{dealCount}}
 
*Deals by Stage:*
{{stageBreakdown}}
 
_Report generated {{formatDate(now; "dddd, MMMM D, YYYY")}}_

If you want Block Kit formatting, use the Slack → Make an API Call module instead:

  • URL: /chat.postMessage
  • Method: POST
  • Body: JSON with channel, text (fallback), and blocks array
Make's date functions

Make has built-in date/time functions. Use formatDate(now; "dddd, MMMM D, YYYY") for formatted dates, addDays(now; -7) for relative dates, and parseDate() for parsing HubSpot's ISO timestamps.

Step 6: Add error handling

Make provides several error handling directives. Add error handlers to critical modules:

  1. On the HubSpot module: Add a Resume error handler with a 10-second delay (handles HubSpot's 429 rate limit responses)
  2. On the Slack module: Add a Break error handler that stores the incomplete execution and retries later
  3. Go to Scenario settings → Error handling and enable Email notifications for failed executions

Make's error handlers: Resume (retry after delay), Break (save for later retry), Commit (save partial results), Ignore (skip and continue), Rollback (revert transactional changes).

Step 7: Test and activate

  1. Click Run once to execute the scenario manually
  2. Inspect each module's output — click any module to see the bundles it processed
  3. Fix any mapping issues (mismatched field names are the most common problem)
  4. Toggle the scenario to Active (the scheduling icon turns blue)

Cost and credits

  • Free plan: 1,000 credits/month, 15-minute minimum interval. A weekly report with ~50 deals uses approximately 55 credits per run (~220 credits/month). Plenty of room on the free plan.
  • Core plan: $29/month for 10,000 credits. Required if you add AI-powered features or more complex branching.
  • Credit calculation: 1 trigger + 1 HTTP + 50 deal bundles through aggregator = ~52 credits per execution. Triggers count as 1 credit regardless of bundles returned.

Scenario execution limits

  • Execution timeout: 40 minutes (hard limit). Not a concern for a pipeline report.
  • HubSpot rate limit: 110 requests per 10 seconds per account. A single search request won't trigger this.
  • Maximum scenario data size: 6 MB per execution. Large pipelines with thousands of deals may need filters to reduce data volume.

Next steps

  • Add owner resolution — add another HTTP module to call GET /crm/v3/owners and build a lookup table, then use Make's map() function to replace owner IDs with names
  • Week-over-week comparison — use Make's Data Store module to persist last week's metrics, then add a comparison section to the report
  • Conditional routing — add a Filter between the Router branches to separate closed-won deals for a "wins this week" highlight section
  • Google Sheets logging — add a Google Sheets module at the end to append each week's metrics to a spreadsheet for trend tracking

Need help implementing this?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.