Automate a sales-to-CS handoff when a HubSpot deal closes won using Make

low complexityCost: $10-29/mo

Prerequisites

Prerequisites
  • Make account (any plan — webhook triggers work on the Free plan)
  • HubSpot connection configured in Make via OAuth
  • Slack connection configured in Make (Bot Token with chat:write scope)

Step 1: Set up the HubSpot deal trigger

Create a new scenario. Add a HubSpot CRM module -> Watch Deals:

  • Connection: Your HubSpot OAuth connection
  • Watch: Updated Deals
  • Pipeline: Select your pipeline (or leave blank for all pipelines)

This polls HubSpot for recently updated deals. The module emits one bundle per updated deal.

Polling interval

On the Free plan, Make polls every 15 minutes. On the Core plan, you can set it to 1 minute. For near-instant delivery, use a webhook-based approach with Custom Webhook + HubSpot workflow.

Step 2: Filter for Closed Won

Add a Filter between the trigger and the next module:

  • Condition: dealstage equals closedwon

Only deals that moved to Closed Won pass through. All other deal updates are discarded without consuming additional credits.

Step 3: Fetch full deal details

The Watch Deals module may not return all properties you need. Add an HTTP module:

  • URL: https://api.hubapi.com/crm/v3/objects/deals/{{deal_id}}?properties=dealname,amount,closedate,hubspot_owner_id,contract_length,description&associations=contacts
  • Method: GET

This returns the full deal record with associated contact IDs.

Step 4: Fetch the primary contact

Add another HTTP module to get the primary contact's details:

  • URL: https://api.hubapi.com/crm/v3/objects/contacts/{{contact_id}}?properties=firstname,lastname,email,phone,jobtitle,company
  • Method: GET

Map contact_id from the associations array in the previous step's output.

Step 5: Fetch the sales rep name

Add an HTTP module to resolve the deal owner:

  • URL: https://api.hubapi.com/crm/v3/owners/{{hubspot_owner_id}}
  • Method: GET

Step 6: Send Slack notification

Add a Slack module -> Create a Message:

  • Channel: #cs-handoffs
  • Text:
:tada: *New Closed-Won Deal — CS Handoff*
 
*Deal:* {{dealname}}
*Value:* ${{amount}}
*Sales Rep:* {{owner_firstName}} {{owner_lastName}}
*Close Date:* {{closedate}}
*Contract Length:* {{contract_length}}
 
*Primary Contact:*
{{contact_firstName}} {{contact_lastName}} ({{contact_jobtitle}})
📧 {{contact_email}}
📞 {{contact_phone}}
 
<https://app.hubspot.com/contacts/YOUR_PORTAL_ID/deal/{{deal_id}}|View Deal in HubSpot>

For Block Kit formatting, use Slack -> Make an API Call:

  • URL: /chat.postMessage
  • Method: POST
  • Body: JSON with channel, text, and blocks array

Step 7: Create a HubSpot task

Add an HTTP module to create an onboarding task:

  • URL: https://api.hubapi.com/crm/v3/objects/tasks
  • Method: POST
  • Body type: Raw JSON
{
  "properties": {
    "hs_task_subject": "Onboarding: {{dealname}}",
    "hs_task_body": "New closed-won deal ready for CS onboarding.\n\nDeal: {{dealname}}\nValue: ${{amount}}\nSales Rep: {{owner_firstName}} {{owner_lastName}}\nContact: {{contact_email}}",
    "hs_task_status": "NOT_STARTED",
    "hs_task_priority": "HIGH",
    "hubspot_owner_id": "CS_REP_OWNER_ID",
    "hs_timestamp": "{{formatDate(now; 'YYYY-MM-DDTHH:mm:ss.SSSZ')}}"
  },
  "associations": [
    {
      "to": { "id": "{{deal_id}}" },
      "types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 204 }]
    }
  ]
}

Replace CS_REP_OWNER_ID with your CS rep's owner ID.

Task association type ID

The association type ID 204 links a task to a deal. Use 1 for contact associations. These are HubSpot-defined — check the associations API docs for the full list.

Step 8: Add error handling and activate

  1. On each HTTP module: add a Resume error handler with 10-second delay
  2. On the Slack module: add a Break error handler for later retry
  3. Enable email notifications for failed executions
  4. Click Run once to test (move a test deal to Closed Won)
  5. Toggle the scenario to Active

Cost and credits

  • Free plan: 1,000 credits/month. This scenario uses approximately 6 credits per closed-won deal (1 trigger + 1 deal fetch + 1 contact fetch + 1 owner fetch + 1 Slack + 1 task). If you close 10 deals/month, that's ~60 credits.
  • Core plan: $29/month. Required if you need faster polling or the Code module for CS rep routing logic.

Next steps

  • Dynamic CS routing — add a Code module that maps deal size, industry, or region to the correct CS rep owner ID
  • Onboarding checklist — use a Router to create multiple tasks in parallel (kickoff call, intro email, account setup)
  • Welcome email — add a step to send a welcome email to the primary contact via the HubSpot transactional email API
  • Slack thread — post the initial notification, then reply in-thread with the full contact list and sales notes

Need help implementing this?

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