HubSpot
Renta sends rows from your data warehouse to HubSpot as CRM records: contacts, companies, deals, tickets, products, line items, quotes, and the note, call, task, and meeting engagements.
One pipeline writes one object type. The row carries the properties of that record, and the property you match on decides whether HubSpot updates an existing record or creates a new one.
Authentication
Renta authenticates with HubSpot OAuth. The authorization is per portal, so pick the HubSpot account this pipeline should write into.
HubSpot asks for read and write access to contacts, companies, deals, line items, and quotes, together with their property schemas, plus owners, lists, tickets, and e-commerce data. Renta reads the schemas to fill the mapping dropdowns and writes the records a pipeline delivers.
Your credentials are encrypted, and you can revoke the authorization at any time from Settings > Integrations > Connected Apps in HubSpot.
Connect HubSpot destination
- Navigate to the Connections > Catalog section in the left sidebar and open the Destinations tab.
- Open the Reverse ETL category and click the HubSpot card.

Click Log in to your HubSpot account. HubSpot opens in the same tab.

Select the HubSpot account you want to sync into and click Choose Account. Review the permissions on the next screen and confirm. HubSpot returns you to Renta.

Renta confirms the granted access and shows the authorized account. Finish the setup:
- Destination name.
Specify a name for this destination. This is used exclusively in the Renta interface.
Click Save to finish.

The new destination appears in the Destinations list with the Active status. You can now use it in Reverse ETL pipelines.

Prepare a data model
A Reverse ETL pipeline reads from a data model: a SQL query saved in the Data models section that decides which warehouse rows to sync and what each row holds. Build it before the pipeline, because the mapping dropdowns are filled from its columns.
Name the columns after the HubSpot properties you plan to fill. The mapper then pairs them up one to one, and the pipeline is quicker to read later.
-- Contacts prepared for HubSpot. The query returns rows only, no table is created.
WITH demo_contacts AS (
SELECT
'james.miller@example.com' AS email,
'James' AS firstname,
'Miller' AS lastname,
'+12125550101' AS phone,
'Vertex Analytics' AS company,
'Head of Marketing' AS jobtitle,
'New York' AS city,
'United States' AS country,
'customer' AS lifecyclestage
UNION ALL SELECT 'olivia.johnson@example.com','Olivia','Johnson','+13125550102','Lakeshore Media','CTO','Chicago','United States','lead'
UNION ALL SELECT 'william.davis@example.com','William','Davis','+12145550103','Cedar Supply Co','Analyst','Dallas','United States','customer'
)
SELECT * FROM demo_contactsCreate the data model
In the left sidebar, open Data models and click New model. Then:
- Source.
Choose the warehouse connection the query runs against. - Write your model query.
Paste your SQL. Keep SQL query as the query type. - Run preview.
Check the rows and column names before moving on. Click Next step when the result looks right.

Pick Reverse ETL only for a model that feeds pipelines. Choose one of the AI agents options instead if the same model should also answer agent questions.

Review the columns Renta read from the query and mark the one that identifies a row. Reverse ETL needs this key to tell a changed row from a new one, so pick the column you will also match on in HubSpot, such as the email.

Give the model a name and a short description, then click Create model. The name is what you pick from the Data model dropdown when you build the pipeline.

The model appears in the list with the Reverse ETL scope and is ready to use in a pipeline.

Create a HubSpot pipeline
The destination and the data model have to exist before you start.
In the left sidebar, click New pipeline. On the Source step, switch the toggle to Reverse ETL and pick your data warehouse, such as Google BigQuery.

Choose the warehouse connection that holds your data models and click Next step.

On the Destination step, select HubSpot under Already connected and click Next step.

Choose the HubSpot connection you created earlier and click Next step.

Pipeline configuration
On the final step, choose the HubSpot object, the data behind it, and how records are written.
What Renta sends
Pick the record type this pipeline creates or updates. Everything below the choice adapts to it, so make this choice first.

| Group | Objects |
|---|---|
| CRM records | Contacts, Companies, Deals, Tickets |
| Commerce | Products, Line items, Quotes |
| Engagements | Notes, Calls, Tasks, Meetings |
One pipeline writes one object. To keep contacts and the companies they belong to in sync, build a pipeline for each.
Data model and account
Point the pipeline at the data and at the portal.

- Data model.
Choose the model to sync. The columns available for matching and mapping below come from it. - Account.
The HubSpot account the records land in.
Record matching
Tell Renta which value identifies a record, so a row updates the record it belongs to instead of adding another one.

The left dropdown offers the unique key of the data model. The right one offers the HubSpot properties that can identify a record: the built-in email for contacts, plus any property marked as unique in your portal. Renta sends the matched value with every row, so you do not need to repeat it in the mapping block below.
To match on your own identifier, such as a warehouse customer id, create a property in HubSpot with the unique-values option enabled. It then appears in this dropdown.
Field mapping
Connect the columns of your data model to HubSpot properties. The right-hand dropdown lists the writeable properties of the object you chose, so read-only and calculated ones never appear.

| Mapping type | Description |
|---|---|
| Standard | Takes the value from a data model column. |
| Static | Writes the same fixed value into every record. |
| Variable | Writes a value from the sync itself, such as the data model name or the time the run started. |
A property with a fixed set of options, such as lifecyclestage, accepts only values HubSpot already knows. Send the internal value of the option, not its label, otherwise HubSpot rejects the record.
Sync mode
Decide how a row turns into a record.

| Mode | Description |
|---|---|
| Upsert | Updates the record the row matches, and creates one when nothing matches. The default, and the right choice for most syncs. |
| Update only | Updates matched records and rejects rows that match nothing. Use it when HubSpot owns which records exist and the warehouse only enriches them. |
| Create only | Always creates a record and rejects a row whose value duplicates an existing one. |
| Mirror | Upserts the rows present in the model and applies the deletion policy to rows that left it. The only mode that acts on removed rows. |
A Line items pipeline offers Create only alone. HubSpot line items carry no unique property, so there is nothing to match an existing record on.
When a source row is deleted
Set what happens to a HubSpot record whose row disappears from the data model.

| Option | Description |
|---|---|
| Ignore | The record stays as it is. This is the default. |
| Archive | Soft-deletes the record. HubSpot keeps it recoverable for 90 days. |
| GDPR delete | Permanently deletes the record and cannot be undone. HubSpot allows it for contacts only. |
| Clear fields | Keeps the record and blanks the properties this pipeline writes, leaving everything else untouched. |
The three destructive options act only in Mirror mode. In any other mode the dropdown offers Ignore alone, because the run never looks at removed rows. Rows also leave a model for reasons other than a deleted record, such as an edit to the model query, so switch to Mirror only when the model is the authoritative list of what belongs in HubSpot.
Then name the pipeline.

Integration name is the name of your pipeline. Edit it to match your preferences.
Schedule
Choose how often the pipeline runs.

| Schedule type | Description |
|---|---|
| Manual | The pipeline runs only when triggered manually through the interface or via API. |
| Daily | The pipeline runs once a day at the specified update time. |
| Interval | The pipeline runs at specified time intervals. |
| Cron Expression | The pipeline runs on a schedule defined by a cron expression. |
For Daily schedules, set the Update time (the exact time each run starts), then click Create pipeline.

Renta also supports API triggers and integration with external orchestrators such as Apache Airflow, Dagster, and Prefect. See the full scheduling documentation for details.
The new pipeline appears in the Pipelines section under the Reverse ETL tab, where you can track its runs and progress.

Sync strategy
Renta syncs incrementally. A run compares the data model against the state the previous run recorded and sends only what moved, so a nightly sync touches a handful of records instead of the whole model. The first run has nothing to compare against and delivers everything.
| Row state | What Renta does |
|---|---|
| New | Creates the record, or updates the one it matches, following the sync mode. |
| Changed | Writes the mapped properties again with the new values. Properties outside the mapping stay as they are. |
| Unchanged | Sends nothing. |
| Deleted | Ignored in every mode but Mirror, where the deletion policy decides what happens. |
Limits
- Matching needs a unique property.
HubSpot identifies a record by a property marked unique in the portal. Without one, a pipeline can only create records. - A rejected row does not stop the others.
HubSpot answers per record, so a row it refuses, such as an option value it does not recognise, is rejected on its own and the rest of the batch still lands. The reasons appear in the run log. - A run stops when rejections pile up.
Renta halts the run when more than 30% of a batch, or more than 10% of the rows delivered so far, come back rejected. Records already written stay in HubSpot, and the next run picks up where this one stopped. - Property options are not created for you.
Renta writes into the properties and option values your portal already defines. Add a missing option in HubSpot first, then re-run the pipeline.
Ready to get started?
Build your data pipeline today or get a personalized demo. Start free!
Need help?
Get expert support to ensure your project succeeds. We're here to help!
Feature requests?
Help shape our product! Share your ideas for new features and integrations.