Automate a sales-to-CS handoff when a HubSpot deal closes won using Make
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:writescope)
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.
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:
dealstageequalsclosedwon
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, andblocksarray
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.
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
- On each HTTP module: add a Resume error handler with 10-second delay
- On the Slack module: add a Break error handler for later retry
- Enable email notifications for failed executions
- Click Run once to test (move a test deal to Closed Won)
- 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.