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

# Sinch Campaigns

> Keep Sinch audiences in step with the latest customer activity, and trigger published Sinch Campaigns to any cohort with per-recipient personalization filled from your customer data.

## Supported syncing

| Sync type | Description | Supported sync modes | API reference |
| - | - | - | - |
| [**Audience**](#audience) | Replace the contents of an existing Sinch audience with the current rows in your Hightouch model. | Mirror | [Audiences API](https://developers.sinch.com/docs/campaigns/audiences/) |
| [**Campaign trigger**](#trigger-campaigns) | Trigger an existing Sinch campaign for the contacts in your model, with optional template variables and a shoot tag. | Insert | [Send to contacts](https://developers.sinch.com/docs/campaigns/api/campaigns-api/#send-to-contacts) |

For more information about sync modes, refer to the [sync modes](https://docs.hightouch.com/syncs/types-and-modes.md#sync-modes) docs.

## Connect to Sinch Campaigns

To connect Sinch Campaigns to Hightouch you need the API key from your Sinch Campaigns console. It's a pre-encoded Basic-auth token, visible under your account settings.

1. Go to the [Destinations overview](https://app.hightouch.com/destinations) page and select **Add destination**.
2. Select **Sinch Campaigns** from the destination catalog.
3. Enter the following credentials, then select **Continue**:

   * **Region**: the Sinch Campaigns region your account is provisioned in. Choose **European Union** or **United States**. Sinch hosts EU and US tenants separately, so picking the wrong one fails authentication on save.
   * **API key**: your Sinch Campaigns API key, copied from the console. It's already base64-encoded, so Hightouch uses it directly as the Basic auth header — there's no separate secret to enter. Hightouch uses it to mint short-lived bearer tokens for the Campaigns API and JWTs for the Audiences API.

   When you select **Continue**, Hightouch authenticates against both the Sinch Campaigns API and the Sinch Audiences API. If only one check fails, the test-connection step calls out which API to investigate — usually an account that isn't provisioned for Audiences, or a key from the wrong region.

> [!NOTE]
>
> The single API key authorizes both APIs. The Sinch account Hightouch reads and
> writes audiences against is derived from the key itself, so there's nothing
> else to configure.

## Sync configuration

### Audience

Audience syncs keep a Sinch audience in lockstep with a Hightouch model. Each sync run uploads the model's current contents as a CSV and replaces the audience membership wholesale.

> [!NOTE]
>
> When you configure the sync, you can pick an existing Sinch audience or create
> a new one by name. Hightouch populates the existing-audience dropdown by
> paging through every audience in your Sinch account.

> [!WARNING]
>
> Hightouch refuses to upload a zero-row file. If the source query returns no
> rows, the sync errors instead of clearing the Sinch audience. Wiping an
> audience by accident is almost always a query bug, not the intent.

#### Sync mode

Audience syncs run in **Mirror** mode. Each run reuploads the full membership. Sinch's Audiences API doesn't expose an append or remove operation, so incremental updates aren't possible.

#### Configure record matching

Each row must include a phone number in [E.164 format](https://en.wikipedia.org/wiki/E.164) (for example, `+5215512345678`). Sinch identifies audience contacts by their MSISDN.

| Destination field | Required | Notes |
| - | - | - |
| **Phone (MSISDN, E.164)** | Yes | Mapped from a column of `phone` type. Becomes the `msisdn` column in the uploaded CSV. |

#### Map fields

Add a mapping for each extra attribute you want to attach to contacts in the audience. Each mapping becomes a column in the uploaded CSV, and the mapping name is the column header Sinch sees.

Mapping names must use lowercase letters, digits, and underscores, and must start with a letter (for example, `first_name`). Date values are converted to ISO 8601 before being written to the CSV.

### Trigger campaigns

Campaign trigger syncs fire an existing Sinch campaign for the rows in your model. Each row becomes one recipient, and positional template variables in the campaign template are filled from the row's mappings.

> [!NOTE]
>
> Only campaigns marked **ready\_to\_shoot** in Sinch appear in the campaign
> dropdown. Draft, paused, or unpublished campaigns must be published in the
> Sinch console first.

#### Sync mode

Campaign trigger syncs run in **Insert** mode. Each batch of rows is submitted to Sinch's `send-to-contacts` endpoint, which returns a task identifier. Hightouch then polls `/tasks/{task_id}` every 5 seconds until Sinch reports the task as finished.

Hightouch sends recipients in batches of 500 with a parallelization of 1. Sinch's API rejects concurrent sends to the same campaign, so a sync to a single campaign always runs sequentially. Syncs that span multiple campaigns are still grouped per-campaign before submission.

#### Map fields

| Destination field | Required | Notes |
| - | - | - |
| **Campaign** | Yes | The Sinch campaign to send. Pick from the dropdown (column or constant). Only campaigns marked `ready_to_shoot` are available. |
| **Phone** | Yes | Source column carrying the recipient's phone number in E.164 format. Sinch silently drops rows that don't parse. |
| **Shoot tag** | No | Optional column or constant. Tags every send in this run so the results roll up together under the Sinch **Shoot Stats** endpoint. If omitted, Sinch generates one. |

#### Map template variables

Sinch substitutes mapped values into the campaign template **positionally**. The first mapping becomes `[[A]]`, the second becomes `[[B]]`, and so on. Add one mapping per template placeholder, in the same order they appear in the template. The mapping name is for your reference and is not sent to Sinch.

Date values are converted to ISO 8601 before being substituted, since Sinch's templates render the raw text as-is.

## Tips and troubleshooting

To see the exact API requests and responses from each sync run, use the [live debugger](https://docs.hightouch.com/syncs/debugger.md). To get notified by Slack, PagerDuty, SMS, or email when a sync fails, set up [sync alerts](https://docs.hightouch.com/syncs/alerting.md). If you run into an issue this page doesn't cover, [contact support](#pylon-chat).

### Validate your setup

After your first sync completes, verify the upload in Sinch:

* **Audience syncs:** open the audience in the Sinch console and confirm the contact count matches the row count from your model.
* **Campaign trigger syncs:** check the campaign's stats by shoot tag. If you configured a shoot tag, Sinch rolls every send from this run under it; otherwise, use the run's timestamp.

### Per-row errors on campaign triggers

When Sinch reports that a `send-to-contacts` task failed, Hightouch can't always map the failure to specific rows — Sinch's error payload isn't consistently keyed across error types. Hightouch surfaces Sinch's full error message against every recipient in the failing batch, so the [Live debugger](https://docs.hightouch.com/syncs/debugger.md) is the most reliable place to see what went wrong.
