Skip to content

Connect 23 Telecom to Customer.io

Copy page
Setup typeWebhook · self-service
Setup timeAbout 10 minutes
Sends SMSYes
Delivery status in Customer.ioNo — check 23 Telecom
Who can configureCustomer.io Workspace Manager

You add 23 Telecom as a reusable webhook in Customer.io, then call it from a workflow’s Send and receive data step to send an SMS. Customer.io shows you the flat API response. An HTTP 202 means 23 Telecom accepted the message; carrier delivery reports stay in 23 Telecom.

  • A Customer.io Workspace Manager seat (creating webhooks is a workspace setting).
  • An active workspace, an approved sender ID and a test number in E.164 format, e.g. +447911123456.
  • A restricted 23 Telecom API key with only the sms.send permission — start with a sandbox sk_test_ key (Sandbox & test mode).

POST  /api/v1/integrations/sms/send  · Permission: sms.send

  1. In Customer.io open Settings → Workspace Settings → Webhook configuration and select Create webhook.

  2. Set Name to 23 Telecom SMS, Method to POST, and the endpoint URL to https://restlink23telecom.com/api/v1/integrations/sms/send.

  3. Add only two headers — Content-Type: application/json and your secret X-API-Key. Do not add Idempotency-Key or X-CIO-Idempotency-Key: Customer.io adds its retry key automatically. Saving this as a reusable webhook lets campaign authors select it later without seeing the API key.

  4. In your workflow, add a Send and receive data action and pick the saved 23 Telecom SMS webhook.

  5. Paste the request body below. There are only three fields to map.

  6. Set the action to Draft, then run a test with a sandbox key.

Use Customer.io’s official to_json filter so quotes and line breaks never break the JSON:

Send and receive data → body
{% capture sms_text -%}
Hi {{ customer.first_name | default: "there" }}, your message goes here.
{%- endcapture %}
{
"to": {{ customer.phone | to_json }},
"message": {{ sms_text | strip | to_json }},
"sender_id": "YourBrand"
}
Customer.io fieldValue
MethodPOST
Endpoint URLhttps://restlink23telecom.com/api/v1/integrations/sms/send
Content-Typeapplication/json
X-API-Keyyour restricted 23 Telecom key (sandbox first)
Idempotencyautomatic X-CIO-Idempotency-Key; do not add a header yourself
torecipient phone in E.164 (see to_json in the body above)
messageyour Liquid message text
sender_idyour approved sender ID
  1. Keep the action in Draft and use your sk_test_ key. Leave idempotency headers out of the webhook configuration; Customer.io supplies its automatic key on the request.

  2. Run the workflow against one test profile whose phone is your E.164 test number.

  3. Expect HTTP 202 with a flat response containing status: "accepted", a non-empty message_id, and mode: "sandbox". Sandbox simulates the send — no live SMS or carrier delivery is created.

  4. Save response.message_id as a journey attribute so you can correlate the message later.

Ready to go live? Your 23 Telecom account manager enables the exact workspace and confirms a dedicated workspace-bound key with only sms.send. The endpoint, request body, existing API keys and HMAC settings remain unchanged.

We then complete a short launch check covering automatic retries, lost-response replay and delivery tracking. Keep the action in Draft with your sandbox sk_test_ key while activation is completed; then replace the key and publish the workflow.

  • Accepted — HTTP 202 with status: "accepted" and message_id — means 23 Telecom durably queued the message, not that it was delivered.
  • Delivered is a later carrier report. Check it in Message status with the message_id, or in Statistics. For a live DLR feed, add a delivery webhook in 23 Telecom.
ResponseCause & fix
400 IDEMPOTENCY_KEY_REQUIREDCustomer.io did not supply its automatic retry key — keep the manual idempotency fields empty and contact support
400 MULTIPLE_IDEMPOTENCY_KEYSRemove the manually configured Idempotency-Key or X-CIO-Idempotency-Key
400 INVALID_IDEMPOTENCY_KEYThe automatic key is outside the supported visible-ASCII contract — contact support
401 INVALID_API_KEYWrong or disabled key in the secret header
403 INTEGRATION_NOT_ENABLEDLive access is not enabled for this workspace — contact your account manager
409 IDEMPOTENCY_KEY_REUSEDSame key sent with a different body — use a fresh unique key
429 RATE_LIMIT_EXCEEDEDHonor Retry-After; Customer.io should retry the exact request automatically
  • Webhook, workflow or Liquid questions — Customer.io support.
  • API key, sender ID, accepted but not delivered — your 23 Telecom account manager.

Last verified: 16 July 2026.