# Connect 23 Telecom to Klaviyo

> Send SMS from Klaviyo flows with a webhook action to 23 Telecom — HTTPS setup, retry-safe activation and carrier delivery tracking.
> Source: https://docs.23telecom.co.uk/integrations/klaviyo/
> Activation: Managed activation

Instructions for LLMs: This is one page of the 23 Telecom messaging API docs
(SMS today; more channels planned). Base URL: https://restlink23telecom.com/api/v1,
auth via the X-API-Key header. Match errors on the error_code field, never on
description text. Full docs: https://docs.23telecom.co.uk/llms-full.txt · Schemas: https://docs.23telecom.co.uk/openapi.yaml

| | |
| --- | --- |
| **Setup type** | Webhook · guided activation |
| **Setup time** | About 15 minutes |
| **Sends SMS** | Yes |
| **Delivery status in Klaviyo** | No — check 23 Telecom |
| **Who can configure** | Klaviyo Manager, Admin or Owner (2FA required) |

  23 Telecom supports Klaviyo Flow webhooks through guided activation. Start
  with the sandbox recipe below; when you're ready to launch, your account
  manager confirms the Flow's stable per-event idempotency value and enables the
  retry-safe production path. Verify the one-off sandbox test in 23 Telecom
  [List messages](https://docs.23telecom.co.uk/sms/messages), because Klaviyo records the transport status
  rather than the response body.

## What this connection does

A Klaviyo **Webhook** action inside a Flow calls the 23 Telecom API to send an
SMS. Klaviyo records the HTTP status; carrier delivery reports stay in 23 Telecom.

## Before you start

- A **Manager, Admin or Owner** role with **two-factor authentication** enabled
  (Klaviyo requires it for webhooks).
- An [active workspace](https://docs.23telecom.co.uk/account/workspaces), an
  [approved sender ID](https://docs.23telecom.co.uk/sms/sender-id) and an E.164 test number, e.g.
  `+447911123456`.
- A restricted 23 Telecom [API key](https://docs.23telecom.co.uk/api-keys) with only `sms.send` — start with
  a sandbox `sk_test_` key ([Sandbox & test mode](https://docs.23telecom.co.uk/sandbox)).

`POST /api/v1/sms/send-individual` (permission: `sms.send`)

## Connect 23 Telecom

1. Open your **Flow**, drag in a **Webhook** action.

2. Set the **Destination URL** to
   `https://restlink23telecom.com/api/v1/sms/send-individual` (HTTPS only — no
   self-signed certificate and no redirects).

3. Under **Add Headers**, add `Content-Type: application/json`, your secret
   `X-API-Key`, and `Idempotency-Key: klaviyo-sandbox-001` for this one-off
   sandbox test. Do not reuse that value for another message. The production
   idempotency mapping is confirmed during managed activation.

4. Add the JSON **Body**, then **Save**.

### Request body

```json title="Body"
{
  "messages": [
    { "to": "+447911123456", "message": "Your message", "sender_id": "YourBrand" }
  ]
}
```

Map `to` and `message` to your profile/event variables.

### Field mapping

| Klaviyo field | Value |
| --- | --- |
| Method | `POST` |
| Destination URL | `https://restlink23telecom.com/api/v1/sms/send-individual` |
| `Content-Type` | `application/json` |
| `X-API-Key` | your restricted 23 Telecom key (sandbox first) |
| `Idempotency-Key` | one-off value for sandbox; production mapping supplied during managed activation |
| `messages[0].to` | recipient phone (E.164) |
| `messages[0].message` | your message content |
| `messages[0].sender_id` | your approved sender ID |

## Send a test

Use a **separate test Flow** or test profile with your `sk_test_` key. The
**Webhook card → View All Activity** shows the transport status, but Klaviyo does
not expose the response body. After the test, find the request by phone number and
time in 23 Telecom [List messages](https://docs.23telecom.co.uk/sms/messages), then confirm that the sandbox
message exists with the expected recipient and a non-empty `client_message_id`.

  Klaviyo records the HTTP status but cannot inspect the response body. A `200`
  can still carry `blocked_country`, while missing local pricing may be accepted
  fail-open with a provisional local cost. For the one-off sandbox test, verify
  that the message appears in 23 Telecom with a generated `client_message_id`;
  never treat Klaviyo's successful transport status alone as acceptance or use it
  as a reason to auto-retry.

  Klaviyo treats `2xx` as success and retries `429/500/502/503` — up to **17
  attempts over 24 hours**. To avoid duplicate SMS you need a **unique per-event
  value** that is stable across every attempt. Dynamic-header support can vary by
  Flow configuration, so production activation includes a short idempotency
  design check with 23 Telecom. We confirm that the Flow can supply the stable
  value in `Idempotency-Key` to the strict integration endpoint; if it cannot,
  we scope an adapter that validates the response before launch. Keep idempotency
  in the request header; do not move it into the body. Do not confuse the Flow
  **Webhook** action with Klaviyo's separate, gated **Custom Action** product.

## Production activation

Klaviyo live traffic uses managed activation because Flow webhooks route on the
transport status and production retries need a stable per-event idempotency
header. Your 23 Telecom team confirms the strict integration endpoint with that
header, or an adapter that validates the response body, before enabling the
workspace.

When the retry-safe route is confirmed, the activation package includes the
approved production URL or adapter mapping, the restricted key and a one-message
launch check. Apply that configuration — rather than changing only the API key on
the sandbox batch template — and then publish the Flow.

## Verify the result

**Accepted** means queued. Read carrier delivery in [Message status](https://docs.23telecom.co.uk/sms/status)
or [Statistics](https://docs.23telecom.co.uk/sms/statistics), or add a live
[delivery webhook](https://docs.23telecom.co.uk/webhooks/delivery).

## Troubleshooting

| Response | Cause & fix |
| --- | --- |
| `400 IDEMPOTENCY_KEY_REQUIRED` | Add a stable per-event `Idempotency-Key` header; if the Flow cannot provide one, contact 23 Telecom for managed activation |
| `401 INVALID_API_KEY` | Wrong or disabled key in the secret header |
| `403 NO_SMS_ACCESS` | SMS not enabled — contact 23 Telecom |
| `429 RATE_LIMIT_EXCEEDED` | Sending faster than your budget — slow the Flow |

## Need help?

- **Flow, webhook, roles or 2FA** — Klaviyo support.
- **API key, sender ID, accepted-but-not-delivered** — your 23 Telecom account
  manager, or the [contact form](https://23telecom.co.uk/contact).

## Official platform documentation

- [Add a webhook action to a flow](https://developers.klaviyo.com/en/docs/how_to_add_a_webhook_action_to_a_flow)
- [Understanding webhook status codes](https://developers.klaviyo.com/en/docs/understanding_webhook_status_codes)

*Last verified: 16 July 2026.*