Slack
Renta posts rows from your data warehouse to a Slack channel: a message for every row that changed, several rows per message, a text table, or a CSV file.
You write the message once as a template with {{ column }} placeholders, and Renta fills it in for every row. A changed row can show the previous value next to the new one.
Authentication
Renta authenticates with Slack OAuth. The authorization is per workspace, so pick the Slack workspace the pipeline should post into.
Slack asks for permission to list public and private channels, post messages, post to public channels the bot has not joined, post under a custom name and icon, and upload files. Renta reads the channel list to fill the Channel dropdown and uses the other permissions when a pipeline runs.
Your credentials are encrypted, and you can revoke the authorization at any time from Settings & administration > Manage apps in Slack.
Connect Slack destination
- Navigate to the Connections > Catalog section in the left sidebar and open the Destinations tab.
- Open the Reverse ETL category and click the Slack card.

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

In the top right corner of the Slack page, make sure the right workspace is selected. Review the permissions and click Allow. Slack returns you to Renta.
Renta confirms the granted access and shows the authorized workspace. 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.

To post into a private channel, open the channel in Slack and type /invite @Renta. Public channels need no invitation.
Prepare a data model
A Reverse ETL pipeline reads from a data model: a SQL query saved in the Context layers section that decides which warehouse rows to sync and what each row holds. Build it before the pipeline, because the template editor and the column mapper are filled from its columns.
Name the columns the way you want to reference them in a message. A column named email is inserted as {{ email }}. A column whose name has spaces or starts with a digit is still available as {{ row["signup date"] }}.
-- Signups prepared for Slack. The query returns rows only, no table is created.
WITH demo_signups AS (
SELECT 'james.miller@example.com' AS email, 'Team' AS plan, 490 AS mrr, DATE '2026-10-01' AS signup_date, TRUE AS is_active
UNION ALL SELECT 'olivia.johnson@example.com', 'Starter', 49, DATE '2026-10-03', TRUE
UNION ALL SELECT 'william.davis@example.com', 'Business', 1200, DATE '2026-10-05', FALSE
)
SELECT * FROM demo_signupsMark the column that identifies a row as the key when you save the model. In Message mode Renta uses the key to tell a changed row from a new one. The steps are the same for every warehouse, see Create a data model.
Create a Slack 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, pick your data warehouse, such as Google BigQuery, and click Next step.

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

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

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

Pipeline configuration
On the final step, choose how Renta posts the rows, where they go, and what each message says. The form adapts to the mode you pick, so choose it first.
How Renta sends your data
Pick one of four modes. The first one follows changes in the model. The other three post the whole model result on every run.

| Mode | Description |
|---|---|
| Message | Posts one message for each row that was added, changed, or removed since the last run. Each case has its own template, and the first run sends nothing unless you choose to backfill. |
| Batch message | Posts every row of the model on each run, several rows per message, with an optional header and footer. |
| Table | Posts every row of the model as a text table with the columns you map. Fits results of up to 500 rows. |
| CSV | Uploads every row of the model as a CSV file attached to one message. |
Slack messages are posted once and never edited. Message mode reports a change by posting a new message. The other three modes post a fresh copy of the result on every run.
Data model and channel
Point the pipeline at the data and at the channel.

- Data model.
Choose the data model to send. Renta reads the rows and the column names from it. - Channel.
Choose the channel to post into. The list holds the public channels of the workspace and the private channels the bot was invited to. - Channel from a column.
Available in Message mode. Pick a column that holds a Slack channel ID, such asC0123456789, to route each row to its own channel. A row whose value is empty is skipped and reported in the run log. The bot has to be able to post into every channel the column names.
Message format and first run
Choose how Renta reads your templates and what the first run does with the rows that already exist.

-
Message format Choose the syntax of the templates.
Format Description Plain text Renta sends the rendered template as the message text. Slack formatting works: *bold*,_italic_,<https://example.com|link text>, and<@USER_ID>mentions.Slack Block Kit The template is a JSON array of Block Kit blocks. Renta checks that it is valid JSON when you save and fills the placeholders for every row. Use mrkdwn text objects inside the blocks. -
First run Available in Message mode.
Option Description Skip existing rows The first run records the rows and posts nothing. Messages start with the next change. This is the default. Send a message for every row The first run posts the "row added" message for every row in the model.
Message templates
In Message mode you write up to three templates, one per kind of change. Type {{ in the editor to pick a column or a variable, or click a chip under the editor. The counter in the corner shows the template length against the limit of 4,000 characters.

| Template | When Renta posts it |
|---|---|
| Message when a row is added | A row appears in the model. Required. |
| Message when a row changes | A row with the same key returns different values. Use {{ previous.column }} for the value before the change. Leave it empty to skip changed rows. |
| Message when a row is removed | A row disappears from the model and When a source row is deleted is set to Notify. Leave it empty to skip removed rows. |
Besides the model columns, every template can use the run variables.
| Variable | Value |
|---|---|
| {{ model_name }} | The name of the data model, as shown in Renta. |
| {{ model_id }} | The identifier of the data model. |
| {{ integration_id }} | The identifier of this pipeline. |
| {{ run_id }} | The identifier of the run that posts the message. |
| {{ current_timestamp }} | The time the message is rendered, in ISO 8601 format. |
| {{ operation }} | The kind of change: add, change, remove, or all in the modes that post the whole model. |
Renta escapes the characters &, <, and > in column values, so a value that looks like markup is shown as text. If a column already holds Slack markup, such as a ready link, add the safe filter: {{ link_column | safe }}.
Removed rows and the bot
Finish the message settings with the removed-row template and the look of the bot.

- Message when a row is removed.
Posted for a row that left the model. The template sees the last known values of the row. - Bot name.
Renta posts under this name, up to 80 characters. Leave it empty to post under the Slack app name. - Bot icon emoji.
An emoji code with the colons, such as:chart_with_upwards_trend:. Leave it empty to keep the app icon.
When a source row is deleted
Set what happens in Slack when a row disappears from the data model. The setting is available in Message mode.

| Option | Description |
|---|---|
| Ignore | Renta says nothing. This is the default. |
| Notify | Renta posts the removed-row template for each row that left the model. |
Then name the pipeline. Integration name is the name of your pipeline. Edit it to match your preferences.
Batch message
In Batch message mode Renta renders the body template for every row and groups the rows into messages.

- Rows per message.
How many rows go into one message, from 1 to 50.
Default: 10 - Message header.
Text at the top of each message. The header sees the run variables, such as{{ model_name }}, but not the columns.

- Text for each row.
The template Renta repeats once per row. Required. - Message footer.
Text at the bottom of each message. Like the header, it sees the run variables only.
A message whose rows render to more than 4,000 characters is rejected with a hint to lower Rows per message. In Slack Block Kit format the row template has to render to a JSON array of blocks. The header and the footer become section blocks around the rows, and a message carries at most 50 blocks.
Table and CSV
In Table and CSV modes there are no templates. Map the model columns to the columns of the table or the file instead.

All model columns are mapped when the pipeline is created. Remove the ones you don't need, rename the headers, or use Add mapping to add more:
| Mapping type | Description |
|---|---|
| Standard | Writes a model column under the header you enter. |
| Static | Writes a fixed value you specify into every row. |
| Variable | Writes a run variable, such as the model name or the run ID, into every row. |
In Table mode Renta posts the result as a monospaced table in one or more messages, with the header row in each message. A cell longer than 60 characters is cut with an ellipsis. In CSV mode Renta uploads one file named after the model and the run date, for example signups_2026-10-21.csv, with the headers in the first row. In both modes the optional Message header is posted as the text above the table or the file.
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
In Message mode Renta syncs incrementally. A run compares the data model against the state the previous run recorded and posts a message only for the rows that moved. The first run has nothing to compare against, so it records the rows and posts nothing, unless First run is set to post every row.
| Row state | What Renta does |
|---|---|
| New | Posts the added-row template. |
| Changed | Posts the changed-row template, with the previous values available. Nothing is posted when the template is empty. |
| Unchanged | Posts nothing. |
| Deleted | Posts the removed-row template when the deletion policy is Notify. Ignored otherwise. |
Batch message, Table, and CSV post the whole result of the model on every run, whether the rows changed or not.
Limits
The table lists the ceilings a run can hit and what Renta does when it happens.
| Limit | Value | What happens |
|---|---|---|
| Message length | 4,000 characters for a template and for the rendered message | A row that renders longer is rejected and the run continues with the others. |
| Messages per run | 5,000 in Message mode | The run stops before the first post. Narrow the model, switch to Table or CSV, or set First run to skip the existing rows. |
| Rows in a table | 500 | A Table run with more rows stops with a hint to switch to CSV. |
| Rows in a file | 200,000 | A CSV run with more rows stops with a hint to narrow the model. |
| Rows per message | 1 to 50 in Batch message mode | A message whose rows render to more than 4,000 characters, or to more than 50 Block Kit blocks, is rejected with a hint to lower the value. |
| Refused channel | Per message | A row whose channel is missing, archived, or not open to the bot is rejected on its own. The reasons appear in the run log. The run stops when more than half of a batch, or more than 30% of the rows delivered so far, come back rejected. |
| Revoked token | Per run | If Slack no longer accepts the bot token, the run fails with a message to reconnect the destination. Open the destination and click Re-authorize. |
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.