Automate Typeform to HubSpot deals in Make.com, dedupe by submission ID, enrich with OpenAI, then notify Slack with deal links.
Introduction
If your team still handles Typeform submissions by manually creating HubSpot deals, you feel the churn immediately. Someone copies fields out of Typeform, creates a deal in HubSpot, pastes notes, and then sends a Slack ping. Miss one field or create twice on a retry, and your pipeline gets messy fast.
This is a production-grade Cross-Platform Automation (XPA) that you can build with Make.com to automate Typeform to HubSpot deals. You will dedupe by Typeform submission identifiers, generate enrichment notes and next steps using OpenAI, then post a clean, routing-aware Slack notification with a direct HubSpot deal link.
By the end, you will know exactly how to wire the trigger, idempotency guardrails, data mappings, OpenAI enrichment, and Slack routing into a single Make.com workflow.
What You'll Need
- Typeform
- A form that captures leads
- Webhook delivery enabled for submissions (Typeform webhook URL, optional secret)
- A reliable identifier in the payload for deduplication, typically
submission_idandform_id
- Make.com
- An account with modules for Webhooks, Typeform (or generic HTTP), HubSpot, Slack, and OpenAI
- Paid plan recommended because you will want stable execution, routing, and good error handling
- HubSpot
- Access to create and search Contacts, Companies (optional), and Deals
- Custom Deal properties for OpenAI outputs, for example:
deal_enrichment_summarydeal_next_step_suggestiondeal_openai_score_hintexternal_typeform_submission_id
- OpenAI
- API key connected in Make.com
- A constrained prompt strategy so outputs stay consistent and short
- Slack
- A bot token in Make.com with permission to post messages
- Channels you want to route to, for example
#high-priority-sales,#webinars,#general-leads
Also required, once: create or confirm a HubSpot custom property that stores a stable dedupe key, for example external_typeform_submission_id.
If you want the XPA design mindset behind the build, start with Cross-Platform Automation (XPA).
How It Works (The Logic)
At a high level your XPA logic is:
- Trigger: Typeform webhook hits a Make.com Webhook Catch Hook when a submission occurs.
- Normalize + dedupe key: Make.com extracts
submission_idandform_id, buildsexternal_id = submission_id + ':' + form_id. - Idempotency guard: Make.com searches HubSpot Deals by
external_typeform_submission_id.- If found, it stops (or optionally updates enrichment only if enrichment properties are blank).
- If not found, it creates or finds the associated Contact (by email) and optionally Company.
- Deal creation: Make.com creates the HubSpot Deal, sets pipeline and stage, and writes the dedupe key.
- OpenAI enrichment: Make.com sends a short prompt with Typeform answers and generates:
- summary
- suggested next step
- a lightweight “score hint” you can route on
- Write-back to HubSpot: Make.com stores the OpenAI output into Deal custom properties.
- Slack routing + notification: Make.com chooses the Slack channel based on the form type and/or score hint, then posts a message containing key context and the HubSpot deal link.
- Error handling: persistent failures route to an ops channel, while transient failures can retry without causing duplicates because the dedupe guard is first.
Step-by-Step Setup
1) Add custom properties in HubSpot for dedupe and enrichment
Before touching Make.com, create these properties on Deal:
external_typeform_submission_id(single line text)deal_enrichment_summary(long text or multi-line text)deal_next_step_suggestion(long text or multi-line text)deal_openai_score_hint(single line text, values likehot|warm|cold)
Why: you need a stable place to store enrichment outputs and a reliable dedupe key.
2) Create a Make.com scenario with a webhook trigger
In Make.com:
- Create a new Scenario.
- Add Webhooks > Custom webhook or Webhooks > Catch Hook.
- Configure it to accept POST requests.
Grab the webhook URL Make gives you and paste it into Typeform webhook settings.
Field extraction target: make sure the Typeform payload includes, or you can derive:
submission_idform_id- respondent email
- respondent name
- company name (if available)
- any fields you want OpenAI to summarize
3) Normalize the submission data and build the dedupe key
Add a Set variables step:
- Normalize email:
lowercase(trim(respondent_email)) - Build:
external_id = submission_id + ':' + form_id
Gotcha: do not dedupe on name. Names change, emails are the best contact identifier, and submission_id + form_id is the best “exact submission” identifier.
4) Search HubSpot deals by the dedupe key (idempotency guard)
Add a HubSpot Search step for Deals:
- Search property:
external_typeform_submission_id - Value:
external_id
Then add a Router:
- Branch A: Deal exists
- Stop execution, or skip creation and go straight to Slack notification only if you intentionally want repeated alerts
- Branch B: Deal does not exist
- Continue to contact/company lookup and deal creation
This single guard is what makes retries safe.
5) Create or find the HubSpot Contact (dedupe by email)
On Branch B:
- Add a HubSpot Search Contacts step by
email = respondent_email. - Router:
- If found: store
contact_id - If not found: Create Contact with:
- First name and last name split from respondent name
- If found: store
Optional Company handling:
- If Typeform includes company name, search or create Company, then associate it with the Deal.
6) Create the Deal in HubSpot and set the dedupe key
Add HubSpot > Create Deal:
- Deal name: something like
Lead: {respondent_name} - {company_name} - Amount: map from a Typeform field if you capture budget, otherwise leave blank
- Deal stage: default to
Newor map from a form field (for webinars, trials, etc.) - Write:
external_typeform_submission_id = external_id
Gotcha: keep the property names you write to HubSpot consistent with your custom property keys.
Capture the Deal URL or Deal ID from the create response, because you will include it in Slack.
7) Enrich the deal with OpenAI (summary, next step, score hint)
Add an OpenAI module after deal creation.
Prompt strategy you should use:
- keep it short
- request fixed fields
- ask for bounded-length output
Example output requirements for your prompt:
summary_bullets(up to 4 bullets)next_step(one sentence)score_hint(hot|warm|cold)
Make sure your prompt includes the Typeform fields you trust, for example:
- requested service
- timeframe
- budget band
- pain points
- free-text notes
Gotcha: if Typeform fields are missing or empty, OpenAI may guess. Add a Make filter before OpenAI to ensure you have at least one meaningful “intent” field beyond name and email.
8) Write OpenAI output back into HubSpot Deal properties
Add a HubSpot Update Deal step:
deal_enrichment_summary← OpenAI summarydeal_next_step_suggestion← OpenAI next stepdeal_openai_score_hint← hot|warm|cold
9) Route the Slack notification based on the form and score hint
Add a Router step that decides Slack channel.
Typical routing rules:
- If
deal_openai_score_hint = hotor Typeform captures high-intent fields: post to#high-priority-sales - If
form_idmaps to webinar/training: post to#webinars - Else: post to
#general-leads
Then add Slack > Post message:
- Lead name and company
- Respondent email
- A short enrichment summary
- Suggested next step
- HubSpot deal link
external_idfor traceability
Traceability matters when a sales rep asks, “Which submission did this deal come from?”
10) Add robust error handling with operational visibility
In Make.com:
- Add an error handler route for the scenario
- Post failures to an ops channel with:
external_id- Typeform submission id
- which step failed (contact search, deal create, OpenAI, Slack)
- the error text
Practical point: do not “create a fallback deal” on errors. Your idempotency guard must remain the source of truth.
Real-World Business Scenario
A RevOps team at a B2B services company runs three Typeform lead capture forms: demo request, webinar registration, and “contact sales” for inbound. Their reps used to create deals manually, and duplicates happened when Typeform retries or timezone delays caused multiple manual entries.
With this Make.com XPA:
- each submission produces at most one HubSpot Deal because
submission_id + form_idis stored inexternal_typeform_submission_id - OpenAI produces a concise deal enrichment summary and a next step suggestion
- Slack routing sends hot leads into
#high-priority-sales, webinar leads into#webinars, and everything else into#general-leads
The outcome was measurable: fewer duplicate deals, faster first outreach, and a consistent message structure that reps actually follow.
Common Variations
-
Update enrichment only when missing
- If Branch A finds an existing deal, check whether
deal_enrichment_summaryis blank. - If blank, run OpenAI enrichment and update properties without creating duplicates.
- If Branch A finds an existing deal, check whether
-
Split Slack messages by owner or territory
- Use HubSpot assignment rules or a Make.com mapping table by company domain.
- Post to owner-specific Slack channels.
-
Add a “missing email” compliance path
- If respondent email is empty or invalid, do not create a HubSpot deal.
- Instead, post to Slack with a request to manually review the submission.
Operational outcome you’re building
You built an advanced Typeform to HubSpot Deal automation in Make.com that behaves like a real system. Submissions create safe, deduped deals, enrichment is consistent thanks to OpenAI output mapped into HubSpot properties, and Slack routing gives your team an actionable next step with a direct deal link.
If you want this tailored to your exact Typeform fields, HubSpot pipeline stages, and Slack routing rules, Olmec Dynamics builds these XPAs end to end for businesses. You can see what we do here and for the XPA mindset behind these builds, return to Cross-Platform Automation (XPA).