Salesforce
Renta sends rows from your data warehouse to Salesforce as records of standard and custom objects: contacts, leads, accounts, opportunities, cases, and any custom object of your org.
One pipeline writes one object. The External ID field you match on decides whether a row updates an existing record or creates a new one.
Authentication
Renta authenticates with Salesforce OAuth. Before you log in, choose the environment: Production uses the regular Salesforce login, Sandbox authorizes a sandbox org through the test login.
Salesforce asks you to grant Renta full access within the permissions of the user you log in as, plus the right to refresh that access. Renta reads object and field definitions to fill the dropdowns and writes the records a pipeline delivers.
Your credentials are encrypted, and you can revoke the authorization at any time in Salesforce under Setup > Connected Apps OAuth Usage.
Connect Salesforce destination
- Navigate to the Connections > Catalog section in the left sidebar and open the Destinations tab.
- Open the Reverse ETL category and click the Salesforce card.

- Environment.
Keep Production for a live org or select Sandbox for a sandbox org. - Click Log in to your Salesforce account. Salesforce opens in the same tab.

Enter the credentials of the user the pipelines will write as and click Log In. Approve the requested access on the next screen. Salesforce returns you to Renta.

Renta confirms the granted access and shows the connected org and user. Finish the setup:
- Destination name.
Renta fills it with the org domain and the user email. Change it to any name you like. The name is used only 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.
Include a column with a stable identifier of the record and pick it as the unique key of the model. That is the value Renta will send to the External ID field in Salesforce.
-- Contacts prepared for Salesforce. The query returns rows only, no table is created.
WITH demo_contacts AS (
SELECT
'crm-demo-0001' AS guid,
'James' AS first_name,
'Miller' AS last_name,
'james.miller@example.com' AS email,
'+1 212 555 0101' AS phone,
'Head of Marketing' AS title
UNION ALL SELECT 'crm-demo-0002','Olivia','Johnson','olivia.johnson@example.com','+1 312 555 0102','CTO'
UNION ALL SELECT 'crm-demo-0003','William','Davis','william.davis@example.com','+1 214 555 0103','Analyst'
)
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 Salesforce, such as guid in the example.

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 Salesforce 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 Salesforce under Already connected and click Next step.

Choose the Salesforce connection you created earlier. The card shows the org domain and the connected user, so a sandbox org is easy to tell from production. Click Next step.

Pipeline configuration
On the final step, choose the data behind the pipeline, the Salesforce object, and how records are written.
Data model and Salesforce object
Point the pipeline at the data and at the object that receives it. Everything below depends on these two choices, so make them first.

- Data model.
Choose the model to sync. The columns available for matching and mapping below come from it. - Salesforce object.
Choose the object Renta writes to, such as Contact or Lead. Renta reads the list from your org. It contains the standard and custom objects the connected user can create, update, and query, each with its API name underneath.

One pipeline writes one object. To keep contacts and the accounts they belong to in sync, build a pipeline for each.
Sync mode
Decide how a row turns into a record.

| Mode | Match field | Description |
|---|---|---|
| Upsert | External ID | Updates the record whose External ID matches and creates one when nothing matches. The default, and the right choice for most syncs. |
| Update only | External ID or Id | Updates matched records and rejects rows that match nothing. Use it when Salesforce owns which records exist and the warehouse only enriches them. |
| Create only | None | Always creates a record. Duplicate rules in Salesforce may reject a row. |
| Mirror | External ID | 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. |
When a source row is deleted
Set what happens to a Salesforce record whose row disappears from the data model.

| Option | Description |
|---|---|
| Ignore | The record stays as it is. This is the default. |
| Clear fields | Keeps the record and blanks the fields this pipeline writes. The match field, required fields, and checkboxes are left untouched. |
| Delete | Moves the record to the Salesforce Recycle Bin, where an admin can restore it for 15 days. There is no permanent delete. |
Clear fields and Delete work 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 Salesforce.
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 fields of the selected object that are marked External ID in Salesforce. In Update only mode the list also contains the record Id. In Create only mode there is nothing to match, so the block stays empty.
A field that is merely unique, such as the standard Email, is not an External ID and does not appear here. 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 custom field on the object in Salesforce and enable the External ID attribute. It then appears in this dropdown.
Field mapping
Connect the columns of your data model to Salesforce fields. The right-hand dropdown lists the fields the connected user can write in the selected mode, so formula, roll-up, and system fields 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. |
Fields Salesforce needs to create a record, such as Last Name for a contact, are pre-selected in Upsert, Create only, and Mirror modes. Pick a source column for each of them. Such a row cannot be removed from the mapping. Update only never creates records, so it has no required fields.
For a lookup field such as Account ID, map a column that holds the Salesforce Id of an existing related record. Sync the parent records before the records that reference them.
A picklist accepts only the values defined in Salesforce. Send the API value of the option, not its label. Dates go as YYYY-MM-DD and timestamps in ISO 8601 format. A value Renta cannot convert to the field type is skipped for that row while the rest of the row is still delivered.
Null values
Each mapping row has its own rule for empty source values. Open it with the gear icon next to the row.

| Option | Description |
|---|---|
| Don’t sync null values | Skips the field when the source column is empty, so Salesforce keeps its current value. This is the default. |
| Always sync | Clears the Salesforce field when the source column is empty. Use it when the warehouse is the single source of truth for that field. |
Checkboxes and fields Salesforce marks as required are never cleared, whichever option is selected. Required rows show Always sync locked, and an empty value in them is simply left out.
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 fields again with the new values. Fields 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 an External ID.
Upsert and Mirror identify a record by a field marked External ID. Without one, a pipeline can only create records, or update them by the record Id in Update only mode. - A rejected row does not stop the others.
Salesforce answers per record, so a row it refuses, such as a validation rule failure or an unknown picklist value, 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 Salesforce, and the next run picks up where this one stopped. - The daily API limit is respected.
Before writing, Renta checks how many daily API requests the org has left. When fewer than 5,000 remain, the run stops without sending anything and can be retried after the allocation resets. - Objects and fields are not created for you.
Renta writes into the objects, fields, and picklist values your org already defines. Add a missing field in Salesforce 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.