To prepare data for a HubSpot import, you need one tidy file per object (companies, contacts, deals), a header row whose columns match HubSpot properties, a unique identifier on every row (email for contacts, company domain for companies, Record ID for everything else) and values that already match the format HubSpot expects. Get those four things right and most imports go through first time. Skip them and you get duplicates, broken associations and a clean-up job that takes longer than the migration itself. This guide covers the base level you need before you click Import, the order to import in, and a free template you can copy.
Most data arrives at HubSpot as an export from somewhere else: an old CRM, a spreadsheet the sales team has kept for years, an email platform or an events list. That export is shaped for the system it came from, not for HubSpot. Import-ready data is the same information, reshaped so HubSpot can read it, match it to records that already exist and connect it to the right companies and deals.
The difference is rarely the volume of data. It is whether each row can be identified, whether each column has somewhere to go, and whether the values inside those columns are ones HubSpot will accept.
Built for HubSpot. Every row can be matched, every column can be mapped and every value is accepted first time.
Shaped for the old system. It looks complete in a spreadsheet but falls apart once HubSpot tries to read it.
These are the minimum standards we check before any client import, whether it is 300 contacts from a spreadsheet or a full migration from another CRM. None of them need technical skills. They just need doing before the file reaches HubSpot, not after.
Keep companies, contacts and deals in separate files, each saved as .csv or .xlsx with a single sheet. You can import two files together, or several objects in one file, but only when every row carries identifiers that link the records. If you are not sure, separate files are safer.
Row one must be column headers, and each header should match a HubSpot property. Default names like "First Name", "Company Domain Name" and "Lifecycle Stage" map automatically. Anything custom needs a property created in HubSpot first, or you will be creating properties on the fly during mapping, which is how portals end up with three versions of "Industry".
This is the single biggest cause of duplicates. Contacts are matched on email, companies on company domain name, and deals, tickets and custom objects on Record ID. A row with no identifier is always treated as a brand new record, so a contact without an email will be created again every time you import it.
Contacts need an email. Companies need a name or a domain. New deals need a deal name, a pipeline and a deal stage, and both the pipeline and the stage must already exist in HubSpot. New tickets need a ticket name, pipeline and status. Miss one of these and the row will error.
For dropdown, radio and checkbox properties, every value in your file must match an option that already exists in HubSpot, either its label or its internal value. Default properties like Lifecycle Stage need the internal value or the English label. Multiple checkbox values are separated with a semicolon and no spaces.
Pick one date format and use it in every row, then tell HubSpot which one it is on the final import screen. Phone numbers import most cleanly with the country code, such as +353 or +44. Checkboxes should read Yes or No. Mixed formats in a single column are where silent errors creep in.
Assign owners using the HubSpot user's email address rather than a first name, especially if two people share one. Before you import contacts, decide which of them should be marketing contacts and what your lawful basis for processing is, because both are set on the final screen of the import.
The order you import in matters as much as the data itself. This is the sequence we follow during HubSpot onboarding and migrations.
Create any custom properties, dropdown options and deal pipelines your file relies on before you import anything. HubSpot will reject deal stages and dropdown values it does not recognise, so the structure has to exist first.
Settings → Data Management → Properties
Remove duplicate rows, fill in missing identifiers, standardise your dropdown values and fix date and phone formats while the data is still in a spreadsheet. It is far quicker to clean one column in Excel than thousands of records in a CRM. Blank cells are ignored on import, so they will not wipe existing values, but they will not fill gaps either.
Companies go in first so contacts and deals have something to attach to. Include the company domain on your contact file and the company domain or Record ID on your deal file, so each record associates with the right parent. If your contacts use personal email addresses, switch off automatic company association and link them through the import instead.
Data Management → Data Integration → Import data
Import 10 to 20 rows before the full file. Open a handful of the records it creates and check the properties, owners and associations. If something looks wrong, you have 20 records to fix rather than 20,000.
Give every import a clear name, such as "2026-11 Trade show contacts", and tick the option to create a contact segment. That segment is your safety net: if anything needs correcting later, you can find every affected record in seconds.
| Object | Required Columns | Unique Identifier | Watch Out For |
|---|---|---|---|
| Companies | Name or Company domain name | Company domain name | Domains are cut after the top-level domain, so paths are stripped |
| Contacts | Shared inboxes like info@ merge several people into one record | ||
| Deals | Deal name, Pipeline, Deal stage | Record ID | The stage must belong to the pipeline you name |
| Tickets | Ticket name, Pipeline, Ticket status | Record ID | Status must exist in that pipeline first |
| Notes and tasks | Note body, or Task title and Due date | Created only, never updated | Must be associated with a record to be useful |
Separate tabs for companies, contacts and deals, headers that map to HubSpot's default properties, example rows and a pre-import checklist. Replace the examples with your data and you are most of the way there.
Run through both columns before you upload. If anything on the right sounds familiar, fix it in the spreadsheet first.
Get a free Thrive Score in 30 minutes. We benchmark your portal across Feature Adoption, Data Quality, Automation Maturity, and Revenue Readiness - so you can see where duplicates, gaps and broken associations are holding your reporting back.