Olmec Dynamics
H
·6 min read

How to Connect Typeform to HubSpot to Create or Update Contacts and Create Deals

Step-by-step guide to connect Typeform to HubSpot using Make.com, creating or updating contacts and creating deals from submissions, with mapping and idempotency tips.

Introduction

You run Typeform for lead capture, and every submission needs to become a usable CRM record in HubSpot. Right now someone copies answers, hunts for matching contacts, and manually opens a deal sheet. That wastes time and creates duplicates.

This guide shows how to connect Typeform to HubSpot using Make.com so each submission upserts a contact by email, creates a deal, and associates the deal to the contact. By the end you will have a reproducible Make.com scenario that handles field mapping, basic deduplication, and idempotency.

What You'll Need

  • Typeform account with the form you want to forward (Pro or paid plan if you need webhooks on your account).
  • HubSpot account with a Private App and a bearer token, scopes for Contacts and Deals (crm.objects.contacts.read/write and crm.objects.deals.read/write). Paid tiers may be required for custom properties in some portals.
  • Make.com account (scenarios, HTTP module and HubSpot modules). Paid Make.com plan if you expect high volume or require HTTP retries beyond free limits.
  • A list of Typeform field IDs or question titles and the HubSpot property names you will map to (including any custom properties like submission_id or source_form_name).

How It Works (The Logic)

Trigger: Typeform sends a webhook to a Make.com webhook module when a new submission arrives. Make.com parses answers, extracts the email and other fields. Make.com searches HubSpot for a contact with that email. If found, Make.com updates the contact. If not found, Make.com creates the contact. Then Make.com creates a deal in HubSpot, sets required deal properties, and associates the deal with the contact. The Typeform response_id is stored as a custom deal property to prevent duplicates.

Step-by-Step Setup

Follow these numbered steps inside Make.com and the connected apps.

  1. Prepare HubSpot and Typeform
  • In HubSpot create any custom properties you will need: Typeform_FormName, Typeform_SubmissionId (on deals), and any custom deal properties like amount_source or lead_score.
  • In HubSpot create a Private App, grant contacts and deals read/write scopes, and copy the Access Token.
  • In Typeform note the question IDs or consistent question titles you will map. Enable webhooks for the form.
  1. Create a Make.com Webhook Trigger
  • Module: Webhooks > Custom webhook > Add a new webhook. Name it Typeform incoming.
  • Copy the webhook URL and add it in Typeform: Form > Connect > Webhooks > Add webhook. Enable it and save.
  • Submit a test Typeform submission to capture a sample payload in Make.com so you can map answers by field id or question title.
  1. Parse Typeform Answers
  • In Make.com add a JSON parsing step if needed or use the built-in mapping from the webhook output. Typeform returns answers as an array; map the email answer to a variable: email = answers[<email_field>].email or use the answer with type=email.
  • Also extract: firstname, lastname, company, amount, close_date, and response_id (response_id is your idempotency key).
  1. Search for Contact in HubSpot
  • Module: HubSpot CRM > Search Contacts (or HTTP > HubSpot search endpoint if your Make.com account does not have a native search module).
  • Search by email property equals {{email}}.
  • Gotcha: HubSpot search endpoints are POST /crm/v3/objects/contacts/search with filterGroups. Make.com native module handles this if you choose Search Contact by email.
  1. Conditional: Create or Update Contact
  • Add a Router or an If module: If search returns a contact id, run Update Contact; otherwise run Create Contact.
  • Create Contact mapping example: properties.email = {{email}}, properties.firstname = {{firstname}}, properties.lastname = {{lastname}}, properties.company = {{company}}.
  • Update Contact mapping: patch only fields you want to overwrite. Do not blindly overwrite owner or lifecycle stage unless intended.
  • Gotcha: HubSpot sometimes returns partial matches; ensure you use exact email match and not name match. Test with multiple cases.
  1. Create Deal with Submission ID for Idempotency
  • Module: HubSpot CRM > Create Deal.
  • Map properties: dealname = "Typeform Lead - {{company || email}}", amount = {{amount}} (numeric), pipeline = your pipeline id or name, dealstage = initial stage, closedate = convert Typeform date to epoch milliseconds.
  • Add a custom property Typeform_SubmissionId = {{response_id}} so you can check later whether this submission was already processed.
  • Before creating the deal you can run a Search Deals step filtering by Typeform_SubmissionId equals response_id to avoid duplicate deal creation if the webhook retries.
  • Gotcha: HubSpot expects numeric closedate in milliseconds. Use Make.com date functions to convert.
  1. Associate Deal to Contact
  • Module: HubSpot CRM > Create association between objects, or use the association parameter available in some Create Deal calls.
  • If using separate association call, set fromObjectId = dealId, toObjectId = contactId, and associationTypeId = the numeric id for deal-to-contact association in your portal. You can fetch association type ids from the API if unsure.
  1. Logging and Error Handling
  • Add an Airtable or Google Sheets row or Make.com Data Store write to log Typeform response_id, email, hubspot_contact_id, hubspot_deal_id, timestamp, and status.
  • For transient HubSpot errors return a non-2xx from your scenario so Typeform webhook retries, or implement a retry loop with pause and retry in Make.com.
  • Gotcha: Typeform will retry webhooks only a limited number of times. Keep your Make.com scenario fast: accept the webhook and queue longer processing if you have heavy transforms.
  1. Test and Validate
  • Submit test submissions with the same response_id (resend webhook) to verify no duplicate deals are created.
  • Test missing email flows: if email is missing send an alert or write a log row, and do not create a contact.
  • Verify final state in HubSpot: contact fields, custom properties, and a deal linked to the contact.

Real-World Business Scenario

A B2B services agency used this exact flow. Leads came via a Typeform pre-qualification survey. We built a Make.com scenario that upserted contacts and created a deal with estimated project value. The agency cut manual CRM entry by 90 percent, reduced duplicates, and the sales ops manager gained a reliable submission log. They also used the submission_id on deals to reconcile leads in monthly audits.

Common Variations

  • Use a custom serverless endpoint instead of Make.com for higher throughput and finer control over idempotency and retry logic.
  • Add a HubSpot owner assignment step based on form answers, using a lookup table in Google Sheets or in Make.com Data Store to map territories to owners.
  • Enrich contact data via a third-party API (Clearbit or Apollo) in an additional Make.com module before creating the deal.

What We Built and How Olmec Dynamics Can Help

You now have a reproducible Make.com scenario to connect Typeform to HubSpot, upserting contacts and creating associated deals while handling deduplication and idempotency. If you want this built and deployed against your actual Typeform field IDs and HubSpot property names, Olmec Dynamics implements these integrations for businesses and can deliver a hardened rollout, monitoring, and documentation. See what we do at https://olmecdynamics.com for examples of similar projects.