> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reachcrew.space/llms.txt
> Use this file to discover all available pages before exploring further.

# Unipile

> Connect Unipile so ReachCrew can use LinkedIn and WhatsApp: get your DSN and access token, connect, link accounts and check webhooks.

Unipile is the service ReachCrew uses to reach LinkedIn and WhatsApp. You connect it once per organization. Without it, LinkedIn accounts and campaigns and WhatsApp messaging and calling are off.

> [!NOTE]
>
> **What you need**
>
> * A Unipile account (dashboard.unipile.com). Unipile is a paid service billed by Unipile directly. ReachCrew does not charge for it and this page lists no prices: check Unipile's own pricing.
> * The **owner** or **admin** role in ReachCrew.
> * Your ReachCrew running at a public address (`BETTER_AUTH_URL`) if you want webhooks registered automatically.
> * About 10 minutes.

## Overview

Unipile powers:

* **LinkedIn**: connection invitations, messages, search and inbox sync. See [LinkedIn accounts](https://docs.reachcrew.space/linkedin/accounts.md).
* **WhatsApp**: messaging, the Numbers list and calling. See [WhatsApp numbers](https://docs.reachcrew.space/whatsapp/accounts.md).
* **Webhooks**: Unipile tells ReachCrew when an invitation is accepted or a message arrives.

LinkedIn and WhatsApp use the **same** Unipile connection. You can open it from **Settings → LinkedIn → Connection** or from **Settings → WhatsApp → Integrations**. Each page notes that changing it in one place changes it in the other.

```mermaid theme={null}
flowchart LR
  A[ReachCrew] -- "DSN + access token" --> U[Unipile]
  U -- "webhooks (accepted invitation, messages)" --> A
  U --- L[LinkedIn]
  U --- W[WhatsApp]
```

## Connect Unipile

**1. Create or sign in to your Unipile account**

Sign up at [dashboard.unipile.com/signup](https://dashboard.unipile.com/signup) or sign in at [dashboard.unipile.com/login](https://dashboard.unipile.com/login).

**2. Copy your DSN**

The dashboard shows your **DSN**, the address of your Unipile API, for example `api8.unipile.com:13851`. Copy it as it appears. You can leave off `https://`: ReachCrew adds it.

**3. Generate an access token**

Open [Access tokens](https://dashboard.unipile.com/access-tokens) in the dashboard and generate a token. Copy it now: Unipile shows it only once.

**4. Open the Connection page in ReachCrew**

Go to **Settings → LinkedIn → Connection** (or **Settings → WhatsApp → Integrations**). The **Unipile** card shows **Not connected**. Click **Connect**. Open **How to connect** in the dialog for the same steps in short form.

![The Connect Unipile dialog with fields for the DSN, access token and an optional webhook secret](https://mintcdn.com/recahcrew/b3LOEBKCy3btecGb/assets/screenshots/app/unipile-connect.png?fit=max\&auto=format\&n=b3LOEBKCy3btecGb\&q=85\&s=8ee841c2f44df8d2188023a92eef2c15)

Three fields, then Connect and test.

**5. Fill in the fields**

| Field | What to enter |
| - | - |
| **DSN (API address)** | The DSN from step 2. |
| **Access token** | The token from step 3. |
| **Webhook secret** | Leave it empty. ReachCrew generates one on the first save. Fill it in only to keep a secret you already use. |

**6. Click Connect & test**

The button shows **Testing…** while ReachCrew calls Unipile once to check the DSN and token. If the check passes, the integration is saved (when editing later, the button reads **Save**) and the card shows **Connected** with a **Last verified** time.

### What saving does

1. **Live verification.** ReachCrew asks Unipile for one account (`GET /api/v1/accounts?limit=1`) with your token. A wrong DSN or token fails here and nothing is saved.
2. **Webhook registration.** ReachCrew registers the webhooks it needs in your Unipile workspace through Unipile's API, so you do not set anything up in the Unipile dashboard. Registration replaces earlier ones and never duplicates. It is **skipped on a localhost address**, because Unipile's servers cannot reach it. Run ReachCrew at its public address and click **Register again**, or save again, to register.

The card's **Webhooks** line shows a badge: **2 registered** (green), **Registration failed**, **Not registered** (skipped, for example on a local address) or **Not registered yet**, with **Register again** and **Show URLs and secret** (owners and admins). The URLs, the secret and how deliveries are checked are in the [Webhooks reference](https://docs.reachcrew.space/integrations.md#webhooks-reference).

## Link accounts

Connecting Unipile gives ReachCrew access to your Unipile workspace. You then link the actual LinkedIn profiles and WhatsApp numbers.

> [tab] LinkedIn
>
> 1. Go to **Settings → LinkedIn → Accounts** and click **Connect LinkedIn account**.
> 2. You are sent to Unipile's hosted sign-in. Sign in to LinkedIn there and finish any verification. ReachCrew never sees your LinkedIn password. The link is single-use and short-lived (15 minutes), so use it right away.
> 3. You return to the Accounts page, which syncs the account from Unipile.
>
> See [LinkedIn accounts](https://docs.reachcrew.space/linkedin/accounts.md) for statuses, limits and **Reconnect**.

> [tab] WhatsApp
>
> 1. In the Unipile dashboard, open **Accounts**, choose **Connect**, pick **WhatsApp**, and scan the QR code with the phone that owns the number.
> 2. In ReachCrew go to **Settings → WhatsApp → Numbers** and click **Sync from Unipile**.
>
> LinkedIn and WhatsApp accounts are read separately: the WhatsApp sync never touches LinkedIn accounts. See [WhatsApp numbers](https://docs.reachcrew.space/whatsapp/accounts.md) for warm-up and sending limits.

## Check that it works

> [!TIP]
>
> The Unipile card shows **Connected** and a **Last verified** time, and its **Webhooks** line shows **2 registered**.

1. In the Unipile dashboard, open the webhooks list. You should see two entries named **ReachCrew · LinkedIn connection accepted** and **ReachCrew · Messages (LinkedIn and WhatsApp)**, pointing at your public address with `?org=` in the URL.
2. Link an account (above) and confirm it appears under **Settings → LinkedIn → Accounts** or **Settings → WhatsApp → Numbers**.
3. Send yourself a WhatsApp message to a linked number. A message arriving is stored first in a webhook ledger, so even a failed delivery is retried by the `replay-webhooks` job ([Self-hosting](https://docs.reachcrew.space/self-hosting.md)).

## Troubleshooting

> [accordion] Could not reach Unipile at that API URL
>
> ReachCrew could not connect to the DSN within 15 seconds. Check for typos and copy the DSN exactly from the top of the Unipile dashboard. Make sure the server running ReachCrew can reach the internet.

> [accordion] Unipile DSN must look like api8.unipile.com:13851
>
> The DSN has a path, spaces or a non-HTTPS scheme. Paste only the host and port.

> [accordion] Unipile rejected the access token
>
> Unipile answered 401 or 403. Generate a new token under Access tokens and paste it again. Tokens are shown only once.

> [accordion] Unipile answered 500 (or another status)
>
> The message is `Unipile answered` followed by the HTTP status. Try again later and check Unipile's status. Any status other than 401 and 403 comes from Unipile, not from your credentials.

> [accordion] Registration failed, or Not registered
>
> Click **Register again**. A message that starts with `Unipile answered` shows what Unipile refused. If the Webhooks line says the address is local, `BETTER_AUTH_URL` is a localhost address: set it to your public URL and register again. If it says no public address, `BETTER_AUTH_URL` is not set. Or use **Show URLs and secret** and create the webhooks by hand in Unipile with the header `x-unipile-secret`.

> [accordion] Unipile is not connected — connect it in Settings → LinkedIn → Connection
>
> A feature needing Unipile answered HTTP 409 because this organization has not connected it. Connect it as above. The same message appears as a **Connect Unipile** prompt on the accounts pages.

> [accordion] Messages or accepted invitations do not arrive
>
> Confirm the Webhooks line says **2 registered**, that your ReachCrew is reachable from the internet, and that the account belongs to this organization. Events for an account that is not synced yet, or that belongs to another organization, are acknowledged and dropped. Sync the account first.

> [accordion] Connected, but the sync failed
>
> The hosted sign-in worked but the follow-up sync did not. The account appears after the next outreach run, or sync again.

## Next

> [card] [LinkedIn accounts](https://docs.reachcrew.space/linkedin/accounts.md)
>
> Statuses, limits and reconnecting.

> [card] [WhatsApp numbers](https://docs.reachcrew.space/whatsapp/accounts.md)
>
> Link numbers and understand the guards.

> [card] [Cloudflare R2](https://docs.reachcrew.space/integrations/cloudflare-r2.md)
>
> Needed to store call recordings.

> [card] [Integrations overview](https://docs.reachcrew.space/integrations.md)
>
> Webhooks reference and who can connect what.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.