# Pipelines to Slack, CRMs, sequencers, Sheets and webhooks

Source: https://listplus.ai/en/help/pipelines/pipelines-crm-slack-and-webhook
Last updated: 2026-09-28

This article explains what each external pipeline target does and how to
set it up. For creating a pipeline, adding records and sending them, see
"[Pipelines — send records on to your CRM, Slack, e-mail or API](https://listplus.ai/en/help/pipelines/pipelines-overview)" and "Adding
records to a pipeline and sending them". The Email target has its own
article.

## Connected accounts

Slack, CRMs, sequencers and Google Sheets use a **connected account**. In
the pipeline setup, pick one under **Choose account …** or click **Connect
new account**; the service's own sign-in window opens. Connected accounts
belong to the workspace: every member's pipelines can use them, and actions
run in the name of the person who connected the account. Manage them under
**Settings → Connected accounts**. See "What access you grant when
connecting a CRM or app".

## The "Preview" badge

Salesforce, Pipedrive, Close, Lemlist, Instantly, Google Sheets and Other app
show a **Preview** badge: "Built from the provider's documentation but not
yet verified with a real account. Try it with “Test connection” and a few
contacts first." They work like the other targets; start with a test and a
few records. Webhook, Slack, HubSpot, Attio, Another list and Email carry no
badge.

## Slack

**Post a message to a channel.** Choose the Slack account and the
**Channel**. Messages appear under the name of the person who connected the
Slack account, and that person must be a member of the channel. Each record
becomes one card: an optional **Intro line** (with placeholders and @here),
name and job title · company, up to 10 fields, and optional buttons **Open
in ListPlus**, **LinkedIn** and **Website**. Slack posts about one message
per second, so large sends take a moment.

## CRMs: HubSpot, Attio, Salesforce, Pipedrive, Close

Each record is matched by **e-mail address**, so a record without an e-mail
is held by the data check. New contacts are always created. For an existing
one you choose: **Only fill empty fields** (default), **Leave it – only
create new ones**, or **Overwrite with our values**.

- **HubSpot:** creates or updates a contact; optional **Add to list**
  (static list; existing contacts are added too).
- **Attio:** creates or updates a person; optional list of people.
- **Salesforce:** **Create as** Lead or Contact. A new lead needs a last
  name and a company, a new contact a last name.
- **Pipedrive:** creates or updates a person and links the company as an
  organization (created if needed).
- **Close:** new contacts go to the lead with the same company name,
  otherwise a new lead is created.

The History shows the outcome per record, for example "Contact created",
"Contact updated", "2 empty fields filled" or "Skipped – already exists".

## Sequencers: Lemlist and Instantly

Both **add a contact as a lead to a campaign**. If the campaign is running,
the sequence starts right away for new leads.

- **Lemlist** needs an e-mail or a LinkedIn profile and a Lemlist plan with
  API access (from "Email Pro"). Options include skipping leads already in
  another campaign and letting Lemlist find or verify e-mails, which uses
  Lemlist credits.
- **Instantly** connects with an API key (API v2) and needs a paid Instantly
  plan and an e-mail per lead. You choose whether to skip contacts already in
  a campaign, anywhere in the Instantly workspace, or add them anyway.

## Google Sheets

**Append row** to a spreadsheet and sheet you pick. Columns are matched by
the header row and shown under **Map columns** for you to check; an empty
sheet gets a header row on the first send. Options: **Skip if the e-mail is
already in the sheet** and **Add missing columns at the end**. Columns added
to the sheet later stay empty until you map them.

## Webhook (n8n, Make, Zapier or your own API)

Paste the **Webhook URL** (HTTPS, public host; redirects are not followed).
Under Data & advanced settings, choose the method (POST, PUT or PATCH),
**Auth** (None, Bearer token, API key header or Basic auth) and additional
headers; their values are stored encrypted and never shown again. Each
record is sent as its own JSON request; a response within 15 seconds with a
2xx status counts as sent.

## Another list and Other app

- **Another list** appends each contact as a row to a list of your
  workspace. Choose **Merge – only fill empty cells** or **Always append a
  new row**. It can't write into the list a record came from.
- **Other app** runs a ready-made action of another connected app. You map
  each action field; most such actions only create records, so duplicates
  can occur.

## For advanced users

**Payload (version 1).** Each webhook request body is JSON with `version`,
`test` (true for tests), `pipeline` (`id`, `name`), `delivery` (`id`,
`attempt`, `sentAt`), `source` (`type` "list" with list id, list name and
record id, or "saved" with the record id) and `record`. In `record`, known
columns appear under their content type (`email`, `first_name`,
`company_name` …) regardless of the column name, so one pipeline works for
every list; with **All fields**, other columns go under `extra` with their
original name. Empty values are left out.

**Headers.** `X-ListPlus-Delivery` is stable for one entry across all
attempts, so use it as your idempotency key. `X-ListPlus-Pipeline` carries
the pipeline id. `X-ListPlus-Signature: sha256=…` is an HMAC-SHA256 of the
exact request body, keyed with the pipeline's **Signing secret**.

**Signing secret.** It is shown once, when the pipeline is created, and
can't be displayed again. **New secret** replaces it; the old one stops
working right away. To verify a request, compute the HMAC-SHA256 of the raw
body with your secret, prefix it with `sha256=` and compare it to the header
in constant time.

**Related topics:** pipelines-overview · send-records-to-a-pipeline ·
email-pipeline · crm-credentials · zapier-make-n8n · send-to-sequencers.

## FAQ

### How do I post new leads to a Slack channel?

Create a pipeline with New pipeline, choose Slack, pick the connected Slack account and the Channel, and optionally set an intro line and the fields for the card. Each record you send becomes one message card; the person who connected the Slack account must be a member of that channel.

### Whose name do the Slack messages from a pipeline appear under?

Under the name of the person who connected the Slack account in your workspace. If Slack says "You're not a member of this channel – join it in Slack", that person needs to join the channel.

### Which connected account does a pipeline use, and can my colleagues use mine?

Each pipeline uses the account chosen in its setup. Connected accounts belong to the workspace, so pipelines of any member can use them, and actions run in the name of the person who connected the account.

### How does a CRM pipeline handle contacts that already exist?

HubSpot, Attio, Salesforce, Pipedrive and Close match by e-mail address and always create new contacts. For an existing one you choose Only fill empty fields (default), Leave it – only create new ones, or Overwrite with our values.

### Why is my record not sent to HubSpot or Salesforce?

CRM targets match contacts by e-mail, so a record without one waits under Entries as Check with "Missing: …" naming the e-mail field. Salesforce also needs a last name and a company for a new lead, or a last name for a new contact.

### What does the "Preview" badge on a pipeline target mean?

The target was built from the provider's documentation but not yet verified with a real account. It currently applies to Salesforce, Pipedrive, Close, Lemlist, Instantly, Google Sheets and Other app; run Test connection and send a few records before a large batch.

### Can a pipeline add leads to a Lemlist or Instantly campaign?

Yes, choose Lemlist or Instantly and pick the campaign; if the campaign is running, the sequence starts right away for new leads. Lemlist needs a plan with API access (from Email Pro), Instantly an API key (v2) and a paid Instantly plan.

### How does a Google Sheets pipeline decide which column gets which value?

Columns are matched by the sheet's header row and shown under Map columns for you to check; an empty sheet gets a header row on the first send. Columns added to the sheet later stay empty until you map them.

### How do I send records to n8n, Zapier or Make with a pipeline?

Create a pipeline with the Webhook target, paste your n8n, Zapier or Make webhook URL (HTTPS) and optionally set method, Auth and headers. Each record is sent as one JSON request; use Test connection to send a sample marked "test": true first.

### How do I verify that a webhook request really came from ListPlus?

Every request carries X-ListPlus-Signature: sha256= followed by an HMAC-SHA256 of the raw body, keyed with the pipeline's Signing secret. Compute the same value with your secret and compare; the secret is shown only once, and New secret replaces it immediately.

### What does the webhook payload of a pipeline look like?

JSON with version, test, pipeline, delivery (id, attempt, sentAt), source (list or saved) and record, where known fields use fixed keys like email, first_name and company_name whatever your column is called. The X-ListPlus-Delivery header stays the same for every attempt of one entry, so you can use it to ignore duplicates.

### Can a pipeline copy contacts into another list?

Yes, choose Another list and pick a list of your workspace; decide between Merge – only fill empty cells and Always append a new row. It can't write into the list the record came from.

### My tool isn't in the pipeline catalog, what can I do?

Use the Webhook target with n8n, Make or Zapier, or Other app to run a ready-made action of another connected app, where you map each field yourself. Other app actions usually only create records, so duplicates can occur.
