SendGrid
Renta sends rows from your data warehouse to SendGrid as Marketing contacts.
A contact row carries the email address that identifies the person. Around it go SendGrid's built-in contact fields, such as name, city, and phone number, plus any custom fields your SendGrid account defines.
Authentication
Renta authenticates with a SendGrid API key. The key needs Full Access, or Marketing permissions set to full access on a restricted key, because a sync reads the account's contact field definitions and then writes and deletes contacts.
To create the key, open SendGrid and go to Settings > API Keys > Create API Key. SendGrid shows the key once, so copy it before closing the dialog.
Renta checks the key when you save the destination, and that check only confirms that SendGrid recognises the key. A key with too few permissions is therefore saved successfully and fails later, on the first delivery.
Connect SendGrid destination
- Navigate to the Connections > Catalog section in the left sidebar and open the Destinations tab.
- Open the Reverse ETL category and click the SendGrid card.

Fill in the connection:
- Destination name.
Specify a name for this destination. This is used exclusively in the Renta interface. - API key.
Paste the key you created in SendGrid.
Click Save to finish. A key that SendGrid rejects is not saved.

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

Create a pipeline
Once the destination is connected, create a pipeline to send a data model to SendGrid.
A Reverse ETL pipeline reads from a data model: a SQL query saved in the Data models section that defines which warehouse data to sync. Create the data model before setting up the pipeline.
Create a SendGrid pipeline
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 SendGrid under Already connected and click Next step.

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

Pipeline configuration
On the final step, choose what Renta writes to SendGrid and which columns fill it.
What Renta sends
Pick the SendGrid object and the data model behind it.

- What would you like Renta to send to SendGrid.
Contacts is the only object today. Each row becomes a contact in the SendGrid Marketing contact pool. - Data model.
Choose the data model to sync. The columns available for matching and mapping below come from this model.
Record matching
Tell Renta how a warehouse row and a SendGrid contact refer to the same person.

The left dropdown offers the unique key of the data model, and the right one offers the SendGrid field that holds the same value. Both sides are usually the email address, since that is what SendGrid identifies a contact by.
Renta sends the matched value with every row, so you do not need to repeat it in the mapping block below.
Field mapping
Connect the columns of your data model to SendGrid contact fields.

- Mapping rows.
Pick a warehouse column on the left and the SendGrid field it fills on the right. - Add mapping.
Add a row for each further field you want to fill.
| Mapping type | Description |
|---|---|
| Standard | Takes the value from a data model column. |
| Static | Writes the same fixed value into every contact. |
| Variable | Writes a value from the sync itself, such as the data model name or the time the run started. |
The right-hand dropdown lists two kinds of SendGrid fields.
| Field kind | Description |
|---|---|
| Reserved | SendGrid built-ins that every account has: first name, last name, address lines, city, state, postal code, country, phone number, WhatsApp, Line, Facebook, unique name, and external and anonymous identifiers. |
| Custom | Fields you defined in SendGrid under Marketing > Contacts > Manage Fields. Each one is typed as Text, Number, or Date. |
Fields that SendGrid maintains itself, such as created_at, updated_at, and the engagement dates, are not offered: they are read-only in SendGrid.
Match the column type to the field type. A Number field takes a numeric column, and a Date field takes a date or timestamp column. A value that does not fit the declared type is rejected by SendGrid together with the rest of its batch.
Null handling
Decide what an empty warehouse cell does to the value already stored in SendGrid. The setting lives behind the gear icon on each mapping row and applies to that row alone.

| Option | Description |
|---|---|
| Don't sync null values | An empty cell is left out of the request, so the contact keeps whatever SendGrid already holds in that field. This is the default. |
| Always sync | An empty cell is sent, which clears the field on the contact. |
Always sync wipes values in SendGrid that your model no longer holds. Turn it on only for fields that nothing else in SendGrid writes to.
Sync behavior
Set what happens to a contact whose row disappears from the data model.

| Option | Description |
|---|---|
| Ignore | The contact stays in SendGrid untouched. This is the default. |
| Delete contact | Renta looks the contact up by the matched email and removes it from the SendGrid account. |
A contact deleted in SendGrid cannot be restored, and a row can leave your data model for reasons other than a person unsubscribing, such as an edit to the model query. Keep Ignore unless the model is the authoritative list of who belongs in SendGrid.
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. Each run compares the data model against the state recorded by the previous run and sends only the rows that changed, so the first run delivers the whole model and later runs are much smaller.
| Row state | What Renta does |
|---|---|
| New | Creates the contact in SendGrid, or updates it when SendGrid already has that email. |
| Changed | Writes the mapped fields again with the new values. Fields outside the mapping stay as they are. |
| Unchanged | Sends nothing. |
| Deleted | Follows the deleted-row policy: leaves the contact alone, or removes it from SendGrid. |
A repeated delivery is safe. SendGrid keys contacts on email, so re-sending the same row updates the same contact instead of creating a second one.
Run log
To see what a run sent, open the pipeline and click the run in the Runs table. Delivery breakdown counts the contacts the run added, updated, and removed, and Run actions lists the steps the run went through.

Use Inspect every record and its API calls to open the row log, which shows the request Renta sent for an individual contact and the answer SendGrid returned.
Limits
- Contact writes are asynchronous.
SendGrid accepts a batch of contacts and processes it as a background import job. Renta waits for that job to finish before it reports the run as completed, which is why a run takes minutes rather than seconds even for a small model. A job that is still unfinished after 10 minutes ends the run with an error. - A batch is rejected as a whole.
SendGrid validates a batch of contacts together, so a single value it refuses, such as a malformed email or a number in a date field, rejects every contact sent alongside it. The rejected rows are listed in the row log with the reason SendGrid gave. - 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. Contacts already written stay in SendGrid, and the next run picks up where this one stopped. - Custom fields have to exist first.
Renta writes into the fields your SendGrid account already defines and never creates new ones. A field added in SendGrid becomes available in the mapping dropdown the next time you open the pipeline settings.
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.