- Knowledge Base
- Revenue
- Contracts
- Migrate contracts to HubSpot
BetaMigrate contracts to HubSpot
Last updated: September 21, 2026
Available with any of the following subscriptions, except where noted:
-
Seats required for certain features
-
Additional subscriptions required for certain features
Subscription required A Revenue Hub subscription is required to import contracts unless you're enrolled in the Direct Create, Edit, and Renew HubSpot Contracts beta.
Permissions required Import permissions and Edit permissions for contracts are required to import and migrate contracts.
Summary
Migrate existing contracts from a legacy system to HubSpot to manage billing, invoicing, and revenue reporting. The migration preserves payment methods, contract history, and future billing schedules. After migration, you can use HubSpot as the centralized source of truth for committed revenue. Learn more about using contracts in HubSpot.
Before you get started
Before you begin working with this feature, make sure to fully understand what steps should be taken ahead of time, as well as the limitations of the feature and potential consequences of using it.
Understand requirements
-
If you're a Super Admin, you can opt your account into the Billing Migrations onto Revenue Hub Contracts beta.
-
Your HubSpot account must use Stripe as a payment processing option. If you're using HubSpot payments and want to migrate payment methods from an external Stripe account to HubSpot payments, fill out this form.
-
Format the CSV based on the payment collection process and revenue continuity option you select. Learn more about choosing the migration format best suited for your business.
Understand limitations and considerations
- If using revenue continuity, test the import in a sandbox environment. If incorrect data is imported into your account, you can't correct historical data in MRR waterfall reports.
- Once a contract is activated, HubSpot becomes the system of record for billing. The migration can't be undone. Any contract updates must be made in HubSpot. Learn more about viewing and managing contracts.
- Migration does not stop billing in the legacy system.
Choose the migration format
Before migrating, select a migration format based on how you want HubSpot to manage contracts after migration. The migration format depends on the collection process and whether you want to include historical contract change events (e.g., expansions and contractions).
Payment collection process
- Manual payments: after migration, invoices are generated for buyers to pay manually.
- Automatic payments: after migration, invoices are automatically charged using a payment method on file.
Revenue continuity
- No revenue continuity: contracts are imported without revenue change events.
- Revenue continuity: use ramp keys to group line items into phases and display change events (e.g., expansions and contractions) in the MRR waterfall in HubSpot.
- Revenue continuity preserves recurring-revenue change events for reporting. It does not recreate historical invoices or payments.
- If using revenue continuity, test the import in a sandbox environment.
- If incorrect data is imported into your account, you can only correct historical data in MRR waterfall reports by deleting the contract associated with the incorrect data and reimporting it.
Ramps
Ramp keys
Ramp keys group multiple line item rows into phases. Rows with the same ramp key represent one continuous recurring stream that changes over time.
In HubSpot, each ramp phase generates MRR events (e.g., new business, expansion, contraction) as each phase begins. The ramp key can be any text string (e.g., ramp-a). Use the same string for every phase of the same ramp.
Structuring a ramp
To migrate ramps successfully, structure them as follows:
- Use one ramp key for each recurring stream: assign the same ramp key to all phases of a single product or service.
- Use the same key for sequential phases: if one phase follows another for the same product or service, use the same ramp key for both phases.
- Use different keys for concurrent products: if multiple products or services ramp independently during the same period, assign each one a different
ramp_key_import_id. - Leave the key blank for flat products: if a product or service doesn't change during the contract, leave the
ramp_key_import_idfield blank. - Use non-overlapping date ranges: date ranges for rows with the same ramp key can't overlap. For continuous phases, start each phase when the previous phase ends.
- Enter the total state for each phase: each phase row must include the total quantity or value for that phase, not the change from the previous phase. For example, if the quantity increases from one to two, enter
2for the second phase, not1. - Use the ramp key import ID to group phases: enter the same value in
ramp_key_import_idfor all line items in the same ramp. Learn more about creating a custom ramp property.
Please note:
- A contract can include ramped and non-ramped line items. For non-ramped line items, leave the
ramp_key_import_idblank and use the sameimport_unique_idas the related contract rows. - Each ramp generates its own MRR events.
For example, for a 12-month contract with a price change after three months:
| Line item | Unit price | Quantity | Term | Start date | ramp_key_import_id |
|---|---|---|---|---|---|
| Monthly service | $100 | 1 | 3 months | Jan. 1, 2026 | ramp-a |
| Monthly service | $100 | 2 | 9 months | April 1, 2026 | ramp-a |
Possible migration formats
| Migration format | Collection process | Revenue continuity |
|---|---|---|
| Manual payments with no revenue continuity | Manual payments | Not included |
| Manual payments with revenue continuity | Manual payments | Included |
| Automatic payments with no revenue continuity | Automatic payments | Not included |
| Automatic payments with revenue continuity | Automatic payments | Included |
Monthly and quarterly billing import examples
Understand how monthly and quarterly contracts are billed after import, based on the contract effective date, line item start date, term, and billing start date override.
Property definitions
| Property | Type | Description |
|---|---|---|
| Contract effective date | Legal | The original legal and commercial start date of the contract as signed by both parties. Used for audit, revenue recognition, and reporting. Does not drive billing timing in HubSpot. |
| Line item start date | Billing anchor | The date that anchors the line item's billing schedule. For recurring line items, all future billing intervals are calculated from this date. For example, a quarterly line item starting Jan. 1 will always bill on Jan. 1, Apr. 1, Jul. 1, and Oct. 1 regardless of when migration occurs. |
| Term | Duration | The total length of the line item or ramp phase, expressed as an ISO-8601 duration such as P3M or P1Y. Defines when the current commitment period ends. A 12-month term starting Jan. 1 ends Dec. 31 of the same year. |
| Billing start date override | Override | The earliest date HubSpot may initiate future billing for a migrated contract. Prevents HubSpot from generating invoices for periods already billed in the legacy system. This field does not reset or shift the recurring cadence. It gates which upcoming cadence date HubSpot will first act on. |
Monthly and quarterly examples
When the billing start date override falls between two cadence dates, HubSpot skips to the next scheduled cadence date after the override. The cadence anchor (line item start date) is never moved.
| Scenario | Contract effective date | Line item start date | Term | Billing start date override | First HubSpot billing date |
|---|---|---|---|---|---|
| Monthly, mid-contract migration | Jan. 1, 2024 | Jan. 1, 2024 | 12 months | Jun. 1, 2024 | Jun. 1, 2024 |
| Monthly, override falls between cadence dates | Mar. 15, 2024 | Mar. 15, 2024 | 12 months | Jul. 20, 2024 | Aug. 15, 2024 |
| Quarterly, override aligns with cadence | Feb. 1, 2024 | Feb. 1, 2024 | 12 months | Aug. 1, 2024 | Aug. 1, 2024 |
| Quarterly, override falls mid-quarter | Jan. 1, 2024 | Jan. 1, 2024 | 12 months | Apr. 15, 2024 | Jul. 1, 2024 |
Lifecycle of a migration
Review the full lifecycle of a contract migration below:
Configure a CSV file and use the import tool to import it to HubSpot. Learn more configuring a CSV file for import.
Contracts are created as drafts. Review any formatting issues. Learn more about reviewing formatting issues.
Review any validation errors before validating contracts for migration. Learn more about validating errors and completing migration.
Contracts are migrated and billing commences based on the migration format chosen.
Prepare for the migration
Before beginning the migration, set up your account and prepare your CSV file based on the selected migration format.
Create custom properties
Create the required custom properties before importing your CSV. The properties you need to create depend on the selected migration format. Learn more about creating custom properties.
| Migration format | Object | Custom property name | Custom property type | Validation rules | Used for |
|---|---|---|---|---|---|
| All options | Contracts | import_unique_id |
Single-line text | Require unique values | Groups all rows that belong to the same contract. |
| Manual payments with revenue continuity or automatic payments with revenue continuity | Line items | ramp_key_import_id |
Single-line text | None | Groups multiple line item rows into phases. |
Configure the CSV file
Configure the CSV file to use with the import tool to migrate contracts to HubSpot. Below, review import behaviors of specific CSV fields, download sample CSV files, and reference how a contract import CSV should be formatted.
Line item types
When importing contracts, each row in your CSV is treated as one of two line item types, depending on whether the Product field is populated.
-
Product-backed: the Product field contains the record ID of an existing HubSpot product. If any supported fields (such as pricing model, tiers, price, term, billing frequency, or tax category) are left blank in the CSV, the row inherits those values from the linked product.
-
Standalone: the Product field is left blank. The row uses only the values supplied in the CSV and the line item isn't linked to any product in your catalog.
Please note: if a product-backed row references a recurring product but leaves recurrence fields blank, it may inherit the product's recurring billing frequency configuration, even if the charge was intended as one-time.
Evergreen contracts
An evergreen recurring line item has a recurring billing frequency and no term. It automatically renews until canceled and has no recurring billing end date. While the contract is active, billing continues per the billing frequency cadence until the contract is canceled or terminated. Contract end date, TCV, and ACV may remain blank, while Current MRR and Current ARR are still calculated.
Pricing models
When importing contracts, existing pricing models and tiers may be applied, depending on whether the Unit price field is populated.
- If the Product field contains a valid HubSpot product record ID and the Unit price is blank, the imported product uses the existing pricing model and tiers.
- If the Product field contains a valid HubSpot product record ID and the Unit price field is populated, the row keeps its product association and uses the entered amount as a flat-rate price. The existing pricing models and tiers of the product are not amended.
Payment terms
When importing contracts, if you don't add the hs_net_payment_terms invoice property to your CSV, the net payment term defaults to 0 (Due on receipt), regardless of your account's invoice default settings. To use different payment terms, include the property in your CSV with the desired value (e.g., a value of 0 sets invoices to be due on receipt. A value of 30 would set invoices to have net 30 payment terms).
Automated sales tax
Subscription required A Revenue Hub Professional or Enterprise account is required to make automated sales tax available to an account.
Seats required Automated sales tax requires at least one assigned Revenue Hub seat in your account. Once a qualifying seat exists, automated sales tax is available across all supported revenue tools account-wide, including invoices, payment links, quotes, legacy quotes, and subscriptions. Users do not need an assigned Revenue Hub seat to use revenue tools with automated sales tax enabled.
If you're based in the U.S. or Canada and want to calculate sales taxes automatically, configure automated sales tax in your account settings before importing contracts.
Please note: if you import a company or contact that is associated with a company, the billing address of the company isn't used for automated sales tax purposes. If you want to use automated sales tax review the automated sales tax CSV sample file or add the automated sales tax property to your CSV file and use the following billing address properties in your CSV file:
hs_billing_address_line_1hs_billing_address_line_2hs_billing_address_statehs_billing_address_ziphs_billing_address_countryhs_billing_address_country_code
CSV sample files
Use the sample CSV files below to guide your migration.
Please note: CSV files are for illustrative purposes only. Replace sample dates, identifiers, Product IDs, contacts, amounts, currencies, and any import_unique_id entries in the CSV. Verify the mapped properties and drafts before proceeding with migration.
| Migration scenario | CSV link |
|---|---|
| Manual payments, no revenue continuity | Download |
| Manual payments with revenue continuity | Download |
| Automatic payments, no revenue continuity | Download |
| Automatic payments with revenue continuity | Download |
| Mixed: one ramped product and one flat-fee product (with no ramp key) | Download |
Multiple independent ramps: Product A (ramp-a) and Product B (ramp-b) ramp separately |
Download |
| Evergreen recurring contracts. Learn more about evergreen contracts | Download |
| Contracts with one-time and recurring line items | Download |
| Contract with two line items, one with a discounted amount, one with a discount percentage | Download |
| Contract with automated sales tax | Download |
| Contract with multiple billing contacts | Download |
CSV format
Your CSV should include the following columns and HubSpot properties.
| Column name | Object | Property | Details |
|---|---|---|---|
| Contract effective date | Contract | hs_contract_effective_date |
The date when the contract becomes legally effective. |
| Currency code | Contract | hs_currency_code |
Currency code, such as USD. |
| Name | Contract | hs_name |
Contract name. |
| HubSpot billing enabled | Contract | hs_hubspot_billing_enabled |
Must be TRUE for all contracts being migrated. |
| Collection process | Contract | hs_collection_process |
manual_payments or automatic_payments. Must align with the migration format. |
| Billing start date override | Contract | hs_billing_start_date_override |
The date HubSpot begins billing. This must be a future date when migrating. Required for all migration formats. |
| External payment method reference ID | Contract | hs_external_payment_method_reference_id |
Leave blank for manual payments. Required for automatic payments. |
| import_unique_id | Contract | Custom property | Unique contract property, with a shared ID for all rows in the same contract. A new ID must be used when retrying imports, even if the previous import failed. |
| Contact | email |
The billing contact's email address. | |
| First name | Contact | firstname |
First name of the billing contact. |
| Last name | Contact | lastname |
Last name of the billing contact. |
| Product | Line item | hs_product_id |
Optional property. Record ID of the product. Learn more about product-backed and standalone line item types. |
| Line item name | Line item | name |
Line item name. |
| Unit price | Line item | price |
Per-unit price in the contract currency. |
| Quantity | Line item | quantity |
The line item quantity during a phase. |
| Term | Line item | hs_recurring_billing_period |
The line item term. When using ramps, enter the term for each segment. |
| Recurring billing frequency | Line item | recurringbillingfrequency |
Billing frequency (e.g., monthly). |
| Line item start date | Line item | hs_recurring_billing_start_date |
Billing start date for the line item. |
| ramp_key_import_id | Line item | Custom property | Groups line item phases into one ramp. Required for revenue continuity. Leave this blank for migration formats without revenue continuity. |
Migrate contracts
Begin migrating contracts, including testing localization before commencing the final migration.
Localization testing before migration
If you serve customers in different languages and regions, it's recommended to carry out a pilot migration per language, region, and currency. You can void invoices and terminate contracts after confirming a successful migration.
- Add the contracts to a CSV file. Learn more about configuring a CSV for import.
- Start and complete the migration.
- Wait for invoices to be generated for the contract.
- Check the invoice for accuracy. Learn more about managing invoices:
- View the invoice in a new browser tab.
- Download a PDF of the invoice.
- Send the invoice to an internal email address.
- For each, verify translated labels, dates, numbers, currency symbols, character rendering, sender, recipient, and links.
Please note: this is an end-to-end pilot, not a pre-activation preview feature.
Start the migration
After you've configured your CSV, you can start migrating contracts to HubSpot.
- In your HubSpot account, click More, then navigate to Revenue > Contracts. If More doesn't appear in your account, navigate to Revenue > Contracts directly.
- In the upper right, click Import.
- In the Import a file section, click Import data.
- Click Advanced imports (all objects).
- Under Objects, click Contracts. The contacts and line items objects are selected automatically. You can also import other objects (e.g., companies and deals) at the same time. Learn more about importing multiple objects.
- In the bottom right, click Next.
- Click the Choose how to import Contacts dropdown menu and select an option:
- Create new contacts only: create new contact records for the imported contacts.
- Create and update existing contacts: create new contact records when a contact doesn't exist in the CRM. Update a contact if it already exists. If you select this option, each record must have a unique identifier.
- Click the Choose how to import Line items dropdown menu and select Create new line items only.
Please note: selecting Create and update for line items without a unique identifier can cause identical line items from different contracts to merge, leaving some contracts without their associated products. It's recommended to select Create new line items to avoid merging.
- Configure how you want to import your data:
- Upload a file: drag and drop, or click choose a file, then select your import file.
- Copy and paste: click paste directly from your spreadsheet and paste your data. Data must be copied from a spreadsheet file (e.g., Numbers, Google Sheets).
- Language: if you're importing data in a language other than your default language, click the Select the language of the column headers in your file dropdown menu and select the language. Selecting the correct language allows HubSpot to better match your column headers to existing default properties. If there is no match in your selected language, HubSpot will search for an English property to match.
- In the bottom right, click Next.
- Map the columns in the import file to HubSpot properties. Learn more about the CSV property mappings.
- In the bottom right, click Next.
- In the Import name field, enter a name for the import.
- Click the Select the legal basis for processing a contact's data dropdown menu and select a legal basis. Learn more about tracking legal basis of processing in HubSpot.
- Click the Date format dropdown menu and select a date format.
- Click the Time zone dropdown menu and select a time zone.
- Click the Number format dropdown menu and select a number format.
- Select the Set these contacts as marketing contacts checkbox if you want to engage the imported contacts using HubSpot's marketing tools. Learn more about marketing contacts.
- Select the Enrich records checkbox to enrich records during import. Learn more about contact and company enrichment.
- In the bottom right, click Finish import.
- Continue to complete the migration.
Review formatting issues
After you click Finish import, imported contracts are created as draft contracts. Review contact formatting issues and row errors before completing the migration:
Please note: a scheduled billing row with -- as its invoice number is a projected entry. Generated invoices receive a number and are indexed with other invoice records.
- To clean up formatting issues, under Clean up imported data click the value (e.g., 1) under [Object] formatting issues.
- Under Formatting issues, click View issues.
- In the table, review the issues and proposed fixes:
- To edit the proposed fix, in the Proposed fix column, click the Edit icon, and enter a new value.
- To accept all proposed fixes, click Accept all.
- To reject all proposed fixes, click Reject all.
- To accept or reject a proposed fix for an individual row, in the Actions column, click Accept or Reject.
- To delete the record from the import, in the Actions column, click More, then select Delete this record.
- Navigate back to your import:
- In your HubSpot account, click More, then navigate to Data Management > Data Integration. If More doesn't appear in your account, navigate to Data Management > Data Integration directly.
- In the Monitor your imports & syncs table, click the import name.
Complete the migration
Please note: users with View, Create, Edit, or Delete permissions for contracts can view contracts that have been imported but are not yet migrated. Users with Create, Edit, or Delete permissions for contracts can validate, edit, migrate, and delete the draft contracts created from the import.
- Click Complete migration.
- Review contracts that need attention. To download the errors as a CSV file, in the upper right, click Download errors as CSV.
- To correct the errors, in the Error column, click Update [property].
- In the dialog box, update the required properties, then click Re-validate contract.
- The re-validated contract will move to the Ready to migrate tab.
- When you have reviewed any contracts that need attention, click the Ready to migrate tab.
- It's recommended to review the following properties of the contracts before finalizing the migration:
- Collection process
- Payment method
- Dates
- Product associations
- Line items
- Schedule
- Tax configuration
- To make changes to the billing start date or external payment method reference ID, click the Edit icon.
Please note: you can only update Billing Start Date Override and hs_external_payment_method_reference_id if the contract has no paid invoices or payments.
- In the dialog box:
- Under Billing start date override field, click the date picker and select a date.
- In the Payment method ID field, enter a payment method ID.
- Click Re-validate contract.
- The contract will move to the Ready to migrate tab when it has re-validated.
- As a final step before migration, review the following:
- The last invoice from the legacy contract.
- The first HubSpot invoice.
- Any open receivables.
- Legacy subscription cancellation where applicable.
- Dunning.
- Invoice emails.
- Accounting-integration verification. Learn more about connecting Quickbooks Online and Xero to HubSpot.
- In the upper right, click Migrate [x] contracts.
- In the dialog box, review the migration terms, select the I understand and agree checkbox, then click Confirm migration.
- Contracts will be imported and billing commences, based on the migration format chosen. Learn more about viewing and managing contracts.
Troubleshooting
Review common import errors and the steps to resolve them. If you encounter another error, review your CSV formatting and property mappings, then retry the import.
Invalid or missing Stripe payment method ID
This error occurs when the automatic payments option is selected as the collection process but a Stripe payment method ID was not added to the CSV file.
To resolve this error, either:
- Change automatic payments entries to manual payments.
- Add a Stripe payment method ID for automatic payments entries in the CSV.
Duplicate import_unique_id from a prior attempt
If an import fails, HubSpot may still register the import_unique_id values from the failed import.
To resolve this error:
- Update your CSV file with new IDs.
- Import the updated CSV file.
Glossary
Review the following terms before migrating contracts to HubSpot.
| Term | Description |
|---|---|
| Automatic payments | A collection process where invoices are automatically charged using a saved payment method. |
| Billing start date override | The date when HubSpot should begin billing for the migrated contract. |
| Collection process | How payments are collected after migration. Payments can be collected manually by the buyer or automatically using a payment method on file. |
| import_unique_id | A custom property used to group rows that belong to the same contract during migration. |
| Manual payments | A collection process where invoices are generated in HubSpot and buyers pay them manually. |
| Migration format | The CSV structure used for the import. The migration format depends on how payments will be collected and whether you want to include revenue continuity. |
| MRR | Monthly recurring revenue. In HubSpot, MRR is used to report recurring revenue from contracts. |
| MRR waterfall | A revenue report that shows how recurring revenue changes over time due to events such as new business, upgrades, expansions, downgrades, and churn. |
| Payment method ID | The external payment method reference used for contracts with automatic payments. |
| Ramp | A pricing or quantity change that happens over the course of a contract. |
| Ramp key | A value used to group related line item rows into one ramp. |
| Ramp phase | One period within a ramp. Each phase has its own term, price, quantity, and start date. |
| ramp_key_import_id | A custom line item property used to group line item rows into ramp phases during migration. |
| Revenue continuity | An option that includes historical contract changes, such as upgrades, expansions, or downgrades, so they can be reflected in revenue reporting. |
| System of record | The primary system used to manage and maintain contract and billing information after migration. |