Automate HubSpot contact and company reads, writes, and notes from Formt workflows
The HubSpot step connects your workflow to a HubSpot portal so it can read contacts and companies, write them back, and log activity. Six actions cover the full CRM loop. Requires a connected HubSpot integration.
Fetch members of a saved HubSpot list (static or dynamic) as the data source for a workflow. Pick the list from a dropdown. The editor pulls your portal's saved lists live.
Pulls up to 5,000 members per run. Each contact comes back with the standard fields (email, first name, last name, phone, company, job title) plus HubSpot metadata (record ID and timestamps). You'll reference these in downstream steps using the HubSpot property names: firstname, lastname, phone, company, jobtitle, etc. Output is a list. Connect to a ForEach to iterate. If your list has more than 5,000 members, the output's list_total field tells you the real count so you can see when truncation happened.
Look up a single HubSpot contact by email address. Useful for enriching workflows that start from an email (form submission, parsed message, webhook payload).
Returns a flat object with email, firstname, lastname, phone, company, jobtitle, contact_id, and a found flag. found is false when no HubSpot contact matches that email. This is a normal outcome (not an error), so pair it with a Condition step to branch on "did we know this person."
Look up a single HubSpot company by domain. The complement to Read Contact for workflows that start from a domain rather than an email.
Returns a flat object with name, domain, industry, numberofemployees, phone, city, country, company_id, and a found flag. Same found semantics as Read Contact: branch on the field rather than treating no-match as an error. HubSpot does NOT enforce domain uniqueness on companies; if your portal has multiple companies with the same domain, this returns the oldest match.
Create or update a HubSpot contact, keyed by email. One action handles both cases: HubSpot creates a new contact if no match exists, otherwise it updates the existing one.
Pick the properties you want to write using the property picker. It shows every contact property on your portal, standard and custom alike. Each row pairs a HubSpot property with an expression that resolves to the value (e.g. set firstname to {{form.first_name}}). Empty resolved values are skipped, so you can't accidentally overwrite existing data with a blank. The Linked Records field attaches the contact to a HubSpot company or deal in the same call, typically using a record ID from a sibling step (e.g. {{company_step.company_id}}). Returns the contact ID, the email, and a was_created flag (true on insert, false on update).
Create or update a HubSpot company, keyed by domain. Pairs with Upsert Contact for B2B workflows that write both records in the same run.
Same shape as Upsert Contact but keyed by domain. Pick properties from the company picker (name, industry, numberofemployees, plus any custom properties on your portal). The Linked Records field attaches the company to a HubSpot contact or deal in the same call. Returns the company ID, domain, and was_created flag. Caveat: HubSpot doesn't enforce domain uniqueness, so if your portal has duplicate-domain rows the upsert updates the oldest one.
Attach a note to a contact, company, or deal record. The "loop closer" for recording workflow activity on the HubSpot record's activity timeline.
Pick what kind of record the note attaches to (Contact, Company, or Deal), provide the HubSpot record ID (usually {{prior_step.contact_id}}), and type the note body (HTML formatting is supported). The note appears on the record's activity timeline in HubSpot, dated to when the step ran.