Forms &
Imports
The two data intake mechanisms of HubSpot — real-time form submissions and bulk CSV imports. Configure, connect, govern, and keep CRM data clean from every source.
The front door of your CRM — a data collection tool that writes visitor information directly into HubSpot Contact records the moment they submit.
A HubSpot Form is a web-based input tool that, when submitted, creates or updates a Contact record in your CRM automatically. Every field on the form maps to a Contact property. When a visitor submits their name, email, and company — those values land directly in the CRM with no manual entry, no spreadsheet, and no delay.
Why this replaced manual data entry
| Old way | HubSpot Forms way |
|---|---|
| Visitor fills PDF or Google Form | Visitor fills HubSpot Form |
| Someone copies data to a spreadsheet | Data writes directly to CRM instantly |
| Admin imports spreadsheet | Contact created or updated automatically |
| Rep sees lead 3–5 days later | Rep notified within seconds |
| Lifecycle Stage not set | Lifecycle Stage auto-set to Lead |
| No automation triggered | Workflow fires immediately on submit |
HubSpot offers four distinct form types — each designed for a different placement and user experience.
All four types write to HubSpot exactly the same way — the form type only affects how and where it appears to visitors. Choose the type based on UX intent, not technical differences. An embedded form on a landing page converts higher than a popup because visitors arrived intending to learn more.
Every component of a HubSpot form — what it does and why it matters.
company property. You can use any HubSpot property — default or custom — as a field.The exact sequence HubSpot executes when a form is submitted — understanding this prevents common admin mistakes.
- Email lookup: HubSpot checks the submitted email against all existing Contact records.
- Create or update: If no match → create new Contact. If match → update existing Contact record.
- Property mapping: Each form field value writes to its mapped Contact property. Last write wins — the form value overwrites any previous value in that property.
- Lifecycle Stage auto-set: If the Contact's Lifecycle Stage is currently blank → automatically set to Lead. If already set to a later stage (MQL, SQL, Customer) → not changed.
- Form submission logged: A "Form submission" activity is logged on the Contact record with timestamp, form name, and field values.
- Workflows triggered: Any workflow with "Contact submits [this form]" as an enrollment trigger fires immediately.
- Thank you action: Display the thank you message or redirect the visitor to the configured URL.
- Notification sent: Configured notification emails sent to specified users or owners.
- Analytics updated: Form views, submissions, and conversion rate updated in HubSpot analytics.
- Cookie set: If the visitor isn't cookied yet, HubSpot sets a tracking cookie — future visits from this browser are attributed to this contact.
When a form writes to a property, it overwrites whatever was there before. If a rep manually set a contact's Industry to "SaaS" and that contact then fills a form with an Industry field — the form's value wins. Design your forms with this in mind. Only add fields for properties you genuinely want the visitor to set or update.
Marketing → Lead Capture → Forms → Create form
- Choose form type — Embedded, Popup, Slide-in, or Standalone. Based on placement intent, not technical preference.
- Name the form descriptively — "Demo Request — Homepage Hero" tells you more than "Contact Form 3." Name = page + purpose + position.
- Add fields — Drag from the left panel. Each field = one Contact property. Start with Email (required), then add only what you genuinely need to take action.
- Configure each field — Required vs optional. Placeholder text. For dropdowns: options come from the property's configured values — no custom options here.
- Set submit button text — Replace "Submit" with action-specific copy: "Book my demo," "Download the guide."
- Configure what happens after submit — Options → "After submission." Choose: display a thank you message, or redirect to a URL.
- Set notifications — Options → "Send notifications to." Add users who should receive an alert on submission.
- Enable GDPR options — If applicable. Options → "GDPR options." Enable explicit consent checkboxes and link your privacy policy.
- Publish — Click Publish. For external websites: copy the embed code (JavaScript snippet) and paste into your site. For HubSpot CMS pages: drag the Form module onto the page and select this form.
- Test it yourself — Submit the form as a fake contact. Check: did HubSpot create the Contact? Did all fields map correctly? Did the workflow fire? Did you receive the notification?
A form alone captures data. A form connected to a workflow takes action on that data automatically.
In a workflow, the enrollment trigger can be set to: "Contact submits a specific form" or "Contact submits any form." The moment a visitor submits, the workflow fires and all configured actions execute in sequence — no human needed.
Set Lifecycle Stage = Lead → Set Lead Status = New → Send confirmation email to contact → Send internal notification to SDR → Create task: "Follow up on demo request from [contact name]" → Enrol in lead nurture email sequence
Form-based workflow enrollment triggers
| Trigger option | When to use | Admin note |
|---|---|---|
| Submits specific form | When you want different automations per form | Most common. Build one workflow per key form. |
| Submits any form on specific page | When all forms on a page should trigger the same action | Useful for pages with multiple forms |
| Submits any form | Universal actions for all lead captures | Use for broad actions only — avoid over-triggering |
- 01 — Wrong field type mappingA text input mapped to a Number property lets visitors type "about 50 employees" — the property gets a string, breaks numeric filters, and is useless in reports. Match field types to property types before publishing.
- 02 — Too many required fieldsEvery required field reduces completion rate by 10–15%. Only require Email and one or two genuinely needed fields. Everything else = optional.
- 03 — Generic submit button copy"Submit" consistently underperforms action-specific copy. Always use verb + value: "Get my report," "Book my call," "Start free trial."
- 04 — Not testing before launchFill the form yourself after publishing. Verify the Contact record, check field mappings, confirm the workflow fired, check the notification arrived. 10 minutes of testing prevents hours of cleanup.
- 05 — No GDPR consent for EU audiencesIf your form is seen by EU visitors and you plan to email them, not having explicit consent is a legal compliance issue. Enable HubSpot's GDPR options for all forms targeting European markets.
- 06 — Naming forms generically"Form 1," "Contact Form," "New form" — six months later nobody knows what any of these are for. Always name with: page + purpose + date. "Demo Request — Pricing Page — Q4 2024."
The loading dock of your CRM — bulk uploading Contacts, Companies, or Deals from a CSV spreadsheet into HubSpot in one operation.
An Import is how you get large amounts of existing data into HubSpot at once — uploading a CSV spreadsheet of records that live outside HubSpot and need to be brought in. While forms capture data one visitor at a time in real time, imports handle hundreds or thousands of records in a single batch operation.
When to use imports
| Scenario | What you're importing |
|---|---|
| Migrating from another CRM (Salesforce, Pipedrive) | All existing contacts, companies, and deals |
| Trade show / conference — collected business cards | New contacts from the event |
| Bulk property update — updating phone numbers or industries | Updated values for existing contacts |
| Historical deal data for reporting | Past deals to populate pipeline analytics |
| Enriching contacts with data from an external tool | Additional property values (revenue, employee count) |
| Re-importing corrected data after an error | Fixed version of a previous import |
Contacts → Import (top right button) → Start an import
- Prepare your CSV file — Clean in Excel or Google Sheets first. Column headers in row 1. One record per row. No merged cells. Email column present for contacts. Values match HubSpot property types exactly.
- Choose object type — Contacts, Companies, Deals, Tickets, or a combination. Multi-object imports (Contacts + Companies) auto-associate records when domain columns are included.
- Upload the file — Drag or select your CSV. HubSpot reads the headers and sample rows.
- Map columns to properties — HubSpot presents each column and lets you match it to a HubSpot property. Unmapped columns are skipped. You can create a new custom property on the spot if needed.
- Choose overwrite behaviour — This is the most consequential decision. Overwrite all = new values replace existing ones. Preserve existing = only fill blank fields. Choose based on what you know about the existing data. See the Overwrite section below.
- Enable "Add to static list" — Always check this option. HubSpot creates a static list of everyone imported — enabling targeted follow-up and providing a rollback mechanism.
- Review the import summary — HubSpot shows: records to be created, records to be updated, records with errors. Fix errors before proceeding.
- Start import — HubSpot processes the file. For large imports (10k+ records) this takes several minutes.
- Review results — HubSpot emails you when complete with a summary. Download the error file, fix failed rows, and re-import the errors as a separate file.
- Post-import verification — Spot-check 10–15 records. Did fields map correctly? Did lifecycle stages set? Are companies associated? Run a quick data quality check.
The rules HubSpot uses during imports — and the CSV requirements that prevent errors before they happen.
Three core import rules
| Rule | What it means | Admin implication |
|---|---|---|
| Email = deduplication key | Same email already in CRM → update that contact. No email → always creates new. | Always include an email column. Contacts without email cannot be deduplicated and may create duplicates. |
| Dropdown values must match exactly | If your Industry field has "Software as a Service (SaaS)" and your CSV has "SaaS" — it won't map. | Export your HubSpot dropdown values before preparing your CSV. Match character-for-character. |
| Boolean fields: true or false only | Single checkbox properties only accept "true" or "false." Not "yes," "no," "1," or "0." | Update your CSV to use true/false for any checkbox property columns before importing. |
CSV preparation checklist
| Rule | Correct | Incorrect — causes errors |
|---|---|---|
| Column headers | Row 1 only, plain text | Multiple header rows, merged cells |
| Dates | MM/DD/YYYY or YYYY-MM-DD | "Jan 15, 2024" or "15/01/2024" |
| Currency / numbers | 12500 or 12500.00 | $12,500 or "12,500 USD" |
| Checkboxes | true or false | Yes, No, 1, 0, TRUE, FALSE |
| Phone numbers | +1 415 555 0172 | Inconsistent formats within same column |
| Encoding | UTF-8 | Windows-1252 (breaks special characters) |
| Formulas | Values only (copy → paste special → values) | Any Excel formula (=SUM, =VLOOKUP) |
The most consequential choice in any import — getting this wrong silently corrupts your CRM data.
Import 10 records with your chosen overwrite setting. Check those 10 records in HubSpot. Verify field values, associations, and lifecycle stages. Only proceed with the full import if the test looks correct. Ten minutes of testing prevents hours of cleanup on thousands of records.
Import Contacts and Companies in the same file — HubSpot auto-associates them, saving hours of manual work.
When your CSV includes both Contact-level columns (First Name, Email) and Company-level columns (Company Name, Domain), HubSpot can create both types of records and link them in a single import. The key: include the Company Domain Name column — HubSpot uses domain as the Company deduplication key.
Sarah and Ahmed share the same domain (techcorp.com) — HubSpot creates one Company record for TechCorp and associates both contacts to it. Omar gets a separate Company record for Global Co. This is exactly how a CRM migration from Salesforce should be structured.
Creates or finds Company by domain → Sets Company properties from Company columns → Creates or updates Contact by email → Sets Contact properties from Contact columns → Associates Contact to Company automatically
- 📋Always import to a static list. Check "Add imported contacts to a list." This gives you a rollback mechanism and a target audience for post-import follow-up campaigns.
- 🔢Always include a Lifecycle Stage column. Every imported contact needs a stage. No exceptions. Import without stages = 2,000 contacts invisible to workflows and reports.
- 🧹Clean data before import — not after. Fix formatting, remove duplicates, validate emails, and standardise dropdown values in Excel/Google Sheets before touching HubSpot. Post-import cleanup is 5× harder.
- 🧪Test with 10 records first. Import a small batch, verify thoroughly, then proceed. This catches mapping errors before they scale to thousands of records.
- 📂Download and fix error files. HubSpot generates an error report for every failed row. Download it, fix the issues, and re-import just the failed rows as a separate file.
- 📊Document every import. Keep a log: date, who imported, what file, how many records, overwrite setting used, and the resulting static list name. This is your audit trail.
- 🚫Do not import purchased lists without checking compliance. Cold purchased contacts often violate GDPR, CAN-SPAM, and HubSpot's Terms of Service. At minimum: only import to leads who have a legitimate business reason to hear from you, and never send marketing emails without proper consent.
Forms and Imports working together in a complete CRM setup scenario.
A B2B SaaS startup is launching HubSpot. They have: 1,200 contacts from their old CRM (Salesforce export), 15 existing customers managed via Gmail, and a new website going live next week with a demo request form.
The admin's complete plan
- 1.Import existing contacts from Salesforce. Clean the export: standardise fields, add Lifecycle Stage column (Lead for prospects, Customer for paying clients), validate emails. Import with "Preserve existing" overwrite setting. Import to static list: "Salesforce migration — [date]." This prevents any inadvertent overwriting of data that may already exist in HubSpot from previous form submissions.
- 2.Import 15 existing customers separately. Separate file with Lifecycle Stage = Customer. HubSpot adds them to the [SUPPRESS] Customers list automatically via workflow. They won't receive any prospecting emails.
- 3.Create the demo request form. Embedded form on the homepage hero section and pricing page. Fields: First Name, Last Name, Email (required), Company, Job Title, "What's your biggest challenge?" (dropdown). Submit button: "Book my demo." On submit: redirect to Calendly booking page.
- 4.Connect form to workflow. Enrollment trigger: Contact submits "Demo Request" form. Actions: Set Lifecycle Stage = Lead → Set Lead Status = New → Send confirmation email → Notify SDR with contact details → Create task "Follow up in 2 hours."
The result
From day one, two data intake channels are live and connected to the same CRM: the import baseline (1,215 contacts, lifecycle stages set, customers suppressed) and the real-time form capture (every demo request lands in HubSpot in seconds, SDR notified instantly). The database is clean, categorised, and actionable from the first day of operation.
A B2B agency's new admin wanted to update industry values for 2,000 contacts by importing a cleaned spreadsheet. They chose "Overwrite all property values" without realising the import file had more columns than just Industry — it also had Lifecycle Stage, Lead Status, and Notes columns from the original export. The overwrite set every contact's Lifecycle Stage back to "Lead" (including 200 existing customers) and blanked all manually-entered rep notes (which were in the wrong column format anyway). Sales team discovered it 3 days later when customers started receiving prospecting emails.
- 1.Immediately ran a workflow to restore Lifecycle Stage = Customer for all contacts with associated Closed Won deals — recovered 180 of 200 customers.
- 2.The remaining 20 were identified via the import static list (which had been created — the one thing done right) and manually corrected.
- 3.Rep notes were unrecoverable — the previous values were gone. This was the real loss.
- 4.Built new import SOP: when updating a specific property, only include that property column in the import file (plus email for deduplication). Never export and re-import all columns unless you mean to overwrite everything.
The static list saved 20 customers from continued suppression failure. Without it, identifying the affected contacts would have required a full manual review. Always create a list on import — it's your only rollback mechanism. And the admin SOP now reads: "For targeted updates, import only the email column + the property you're changing. Never include extra columns you don't intend to overwrite."
A SaaS company built a demo request form with a "Number of employees" text input field, mapped to HubSpot's "Number of Employees" Number property. The form accepted free text — visitors entered values like "around 50," "50-100," "~200," and "we're a startup." 6 months and 800 form submissions later, the revenue team tried to filter "companies with more than 100 employees" and the report returned zero results. All 800 employee count values were stored as text strings — unusable for numeric filtering, scoring, or ICP analysis.
- 1.Changed the form field from text input to a dropdown with fixed ranges: "1–10," "11–50," "51–200," "201–500," "500+." Mapped to a new "Employee Range" dropdown property (not the Number property).
- 2.The original Number of Employees property was left for CRM enrichment tools (like HubSpot Insights) that write numeric values automatically.
- 3.Attempted to clean the 800 corrupted values — exported, manually categorised into ranges where possible, re-imported. Approximately 400 of 800 were salvageable. The rest were deleted.
Never use a freeform text input for any field you'll need to filter, segment, or calculate with. If visitors need to tell you their company size, give them a dropdown with ranges — you lose some granularity but gain 100% data quality. The admin rule: if it will ever be used in a filter, a score, or a report — it must be a structured field type (dropdown, number, checkbox).
A tech company attends 8 conferences per year, collecting 150–300 business cards at each. Previously: cards were manually typed into a spreadsheet, imported weeks later with no lifecycle stages set, and reps called them cold with no context. Open rate: 8%. Meeting rate: 1.2%.
The admin redesigned the system. Before each conference: prepared a standard import template CSV with all required columns pre-formatted, a post-event email sequence pre-built in HubSpot, and a "Conference attendees" workflow ready to activate.
- 1.At each conference: used a QR code linking to a HubSpot Standalone form — "Great meeting you! Save your details for our follow-up." Collected 40% of contacts this way in real time.
- 2.Business cards from the other 60%: collected in a consistent format, entered into the prepared CSV template on the flight home (while context was fresh).
- 3.Import on Day 2 post-conference: all cards uploaded. Lifecycle Stage = Lead. Lead Status = New. A "Conference: [Event Name]" tag applied via import. Static list created per event.
- 4.Workflow automatically enrolled all imported contacts in a 3-email post-conference sequence: Day 1 "Great meeting you," Day 3 "Relevant resource," Day 7 "Book a 15-minute call."
Open rate jumped from 8% to 41% — because emails went out within 24–48 hours while the conference interaction was still fresh. Meeting booking rate went from 1.2% to 9.8%. Average time from conference to first meeting: 4.2 days vs 3.1 weeks previously. The combination of real-time QR form capture + fast structured import + automated sequence turned conference attendance from a fuzzy activity into a measurable, repeatable pipeline source.
Do this in your free HubSpot sandbox — approximately 60 minutes total.
Part A — Build a form (30 min)
- Go to Marketing → Lead Capture → Forms → Create form. Choose Embedded type.
- Add fields: First Name, Last Name, Email (required), Company, Job Title, and a custom dropdown field called "What best describes you?" (Options: Founder / Executive, Manager / Director, Individual Contributor, Student / Researcher).
- Set submit button text to "Get in touch" (not Submit).
- Set "After submission" to display a thank you message: "Thanks! We'll be in touch within 24 hours."
- Publish the form. Copy the share link and open it in a new browser tab.
- Fill it out with fake data and submit.
- Go to Contacts and find the record that was just created. Verify all fields mapped correctly. Check the "Form submissions" activity in the timeline.
Part B — Create a form workflow (15 min)
- Go to Automation → Workflows → Create workflow → Contact-based.
- Set enrollment trigger: Contact submits form → choose your newly created form.
- Add actions: (1) Set Lifecycle Stage = Lead, (2) Create task for owner: "Follow up with {{contact.firstname}} from form submission."
- Activate the workflow. Submit the form again with a different email. Check the new contact — did the workflow fire? Is there a task created?
Part C — Do a test import (15 min)
- Create a CSV file in Google Sheets with 5 fake contacts. Columns: First Name, Last Name, Email, Company Name, Lifecycle Stage (set to Lead for all), Lead Status (set to New).
- Go to Contacts → Import → Start an import.
- Upload your CSV. Map all columns. Choose "Don't overwrite existing values."
- Check "Add imported contacts to a static list." Name it "Test import — [today's date]."
- Complete the import. Check the 5 new contacts. Verify lifecycle stage = Lead. Find the static list and confirm all 5 are in it.
Forms
| Concept | Key point |
|---|---|
| What it does | Captures visitor data in real time and writes directly to Contact records |
| 4 types | Embedded (inline), Popup (overlay), Slide-in (corner), Standalone (HubSpot-hosted) |
| Deduplication | Same email = update existing contact, not create duplicate |
| Lifecycle Stage | Auto-sets to Lead on submission if currently blank |
| Field mapping | Each field = one Contact property. Last write wins. |
| Required fields | Email always. Keep others minimal — each reduces completion ~10–15%. |
| Progressive profiling | Replaces already-answered fields with new questions (Pro+) |
| Submit button | Always use action-specific copy — not "Submit" |
| Workflow trigger | "Contact submits [form]" — fires instantly on submission |
| GDPR | Enable consent options for EU audiences before launch |
| Test rule | Always submit the form yourself and verify the Contact record before going live |
Imports
| Concept | Key point |
|---|---|
| What it does | Bulk loads contacts, companies, or deals from a CSV into HubSpot |
| Deduplication key | Email — same email = update existing, not create duplicate |
| Overwrite all | New values replace existing ones — use for corrections and first-time imports |
| Don't overwrite | Only fills blank fields — use for enrichment and when existing data is trusted |
| Always include | Email, Lifecycle Stage, and enable "Add to static list" |
| Multi-object | Contacts + Companies in one file → auto-associated via Company Domain column |
| CSV rules | Row 1 = headers only · Dates: MM/DD/YYYY · Numbers: digits only · Checkboxes: true/false |
| Dropdown values | Must match HubSpot options exactly — export your values before preparing CSV |
| Test rule | Import 10 records, verify thoroughly, then run full import |
| Error file | Download after import, fix failed rows, re-import errors as separate file |
| Static list | Always create — it's your only rollback mechanism |
Forms and imports are your data intake architecture — the two front doors through which every piece of contact information enters your CRM. A RevOps practitioner designs both deliberately: forms with the right fields, the right field types, connected to the right workflows; imports with clean data, correct lifecycle stages, and a static list for every batch. The quality of your entire CRM — every report, every workflow, every forecast — is determined by how well-designed these intake mechanisms are. Garbage in, garbage out. The time to enforce data quality is at the point of entry, not during a painful cleanup six months later.