---
title: "Linkbreakers + Customer.io: sync QR code people to Customer.io segments"
description: "Connect Customer.io with a private API key and every person who scans your QR codes and gives their email or phone is identified as a Customer.io person, with every form answer as an attribute, and added to the manual segment you choose. Consent sets whether a new person is unsubscribed. Setup, Track API keys, what is synced, and the Assistant and MCP tools."
canonical: "https://linkbreakers.com/help/article/linkbreakers-customer-io-integration-sync-qr-code-people-to-segments"
last-updated: 2026-11-09
---

# Linkbreakers + Customer.io: sync QR code people to Customer.io segments

> Connect Customer.io with a private API key and every person who scans your QR codes and gives their email or phone is identified as a Customer.io person, with every form answer as an attribute, and added to the manual segment you choose. Consent sets whether a new person is unsubscribed. Setup, Track API keys, what is synced, and the Assistant and MCP tools.

:::try-ai-prompt {"prompt":"Connect Customer.io with my private API key, add synced people to my QR leads manual segment, and use my form's Consent field as their marketing consent","description":"Connect Customer.io with the Assistant.","target":"assistant"}:::

## Short answer

Linkbreakers syncs the people who scan your QR codes to Customer.io directly. In the dashboard, open **Integrations**, pick **Customer.io**, paste a Customer.io private API key (`sk_us_...` or `sk_eu_...`) and select **Connect**. From then on, every person who goes through one of your links or QR codes and whose email or phone Linkbreakers knows, for example after a form, is identified in Customer.io as a person, with their name, phone and every form answer as an attribute, and added to the manual segment you choose. Your campaigns and broadcasts in Customer.io can then reach them.

No Zapier, Make or webhook is needed. The integration is available on every plan.

## Quick summary

- Connect once per workspace with a private API key from **Settings > API credentials**, or an older Track API key with its Site ID
- People are identified by email, or by phone when there is no email
- Every answer becomes a person attribute under its own key: nothing to create in Customer.io
- Optionally added to one manual segment (with a private key)
- Consent sets `unsubscribed` for a new person; an existing person keeps theirs
- Only people's visits: bots, link previews and AI agents never become people
- Also set up from the Assistant, the MCP server or the REST API

## How it works

A person is synced when a visitor goes through a step of a link's workflow and Linkbreakers knows their email or phone. That is usually right after a [form](/help/article/how-to-create-a-form), but it can also come from the chat bot or any step that saves visitor data. Linkbreakers sends an identify call to Customer.io's Track API from its servers, once per step, at the moments the connection covers (all of them by default).

Identify creates the person or updates the one with that email. A visitor without an email is identified by their phone, in international format, which works only if your Customer.io workspace has phone enabled as an identifier. The person is then added to your manual segment.

## Connect Customer.io

1. In Customer.io, open **Settings > API credentials** and create a private key. It starts with `sk_us_` or `sk_eu_`, after the region of your workspace. A public key (`pk_`) is meant for browsers and is refused.
2. In Linkbreakers, open **Integrations** in the dashboard and pick **Customer.io**.
3. Paste the key in **Customer.io API key** and leave **Site ID** empty. Select **Connect**: Linkbreakers checks the key against Customer.io before storing it.
4. Under **Add contacts to a segment**, choose a manual segment, or **No segment: contacts only**.
5. Set the options and the delivery setting below, then save.

**With an older Track API key**, paste it as the key and its Site ID (shown next to it in **API credentials**) in **Site ID**. It syncs people, but a Track key cannot list segments, so there is no segment to choose, and it cannot look a person up, so consent is not set (see below).

The key is encrypted when it is stored and never shown again; the page shows the region and workspace it belongs to.

## What gets synced

| Linkbreakers | Customer.io |
|---|---|
| Email | `email`, the identifier |
| Phone, in international format | `phone` (the identifier when there is no email) |
| First name, last name | `first_name`, `last_name` |
| Form answers and other visitor data | Person attributes under the same key |
| The segment you chose | Added to that manual segment |

Customer.io creates an attribute the first time it is sent, so every answer arrives under its own key. Attributes that change how Customer.io identifies or messages a person (`id`, `cio_id`, `email`, `phone`, `unsubscribed`, `cio_subscription_preferences`, `created_at` and the like) are never set from an answer. Customer.io's limits are kept: attribute names up to 150 bytes, values up to 1,000 bytes, 300 attributes.

Only manual segments are offered: data-driven segments fill themselves from their conditions in Customer.io.

## Marketing consent in Customer.io

Choose the answer where people agree to hear from you under **Marketing consent**: the **Linkbreakers consent** (a Consent field on your form, or the marketing consent goal of the [chat bot](/help/article/how-to-add-an-ai-chat-bot-to-a-qr-code)), or any other answer, such as a checkbox of your own.

- **A new person** (no one in Customer.io has that email yet): `unsubscribed` is set to false if they said yes, true if they did not. Unsubscribed blocks every campaign, broadcast and newsletter, and still lets transactional messages through
- **An existing person** keeps their `unsubscribed` as it is, so someone who unsubscribed is never subscribed again
- **With no consent answer chosen**, Linkbreakers sets nothing and Customer.io's own default applies

Linkbreakers can only tell a new person from an existing one with a private key and an email. With a Track API key, or for a visitor known only by phone, `unsubscribed` is never set. Subscription center topics are your workspace's own and are not touched.

You can also tick **Add to the segment only those who consented**. Customer.io has no tags and no double opt-in through this API, so neither option is shown.

## Which visitors and which links

The Customer.io page has the same three settings as the other Linkbreakers integrations:

- **Where**: every link, or only some links, directories and tags
- **When**: the moments of a visit (Entry, Interaction, Routing, Exit), or specific steps
- **What is sent**: all visitor data, only some, or just the visit. Email and phone are always sent

Only visits by people are synced. Visits past your plan's tracked visits allowance are not synced.

## What is not synced

- Visitors with neither an email nor a phone in international format: the sync refuses them and the page shows it as the last error
- Phone-only visitors, if your workspace does not take phone as an identifier
- Segments and consent with a Track API key
- Anything back from Customer.io

## Set it up from the Assistant, MCP or the API

**Assistant**: in the dashboard, ask "Connect Customer.io with my private API key and add new people to my QR leads segment".

**MCP server**: an agent connected to the [Linkbreakers MCP server](/help/article/mcp-server-setup) has `contact_integration_connect` (a Track key's Site ID goes in `account`), `contact_integration_lists` (the manual segments), `contact_integration_update`, `contact_integration_test`, `contact_integration_get`, `contact_integrations_list` and `contact_integration_disconnect`, with the tool `CONTACT_TOOL_CUSTOMER_IO`.

**REST API**, with a token that has the `integrations:write` scope:

```bash
curl -X POST https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_CUSTOMER_IO/connect \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apiKey": "sk_eu_..."}'

curl -X PATCH https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_CUSTOMER_IO \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"contactListId": "12", "options": {"consentAttributeKey": "$marketingConsent"}}'
```

## Limits and caveats

- **One Customer.io workspace and one manual segment per Linkbreakers workspace**
- **Private key recommended**: a Track API key has no segments and sets no consent
- **Consent is set for new people only**, by design
- **Phones must be international**, and phone-only people need phone enabled as an identifier in Customer.io
- **No retries.** A person Customer.io refuses is reported as the last error on the page, not sent again

## Frequently asked questions

### Do I need to create attributes in Customer.io first?

No. Customer.io creates an attribute the first time it receives one, so every answer arrives under its own key.

### Why can I not choose a segment?

Either the workspace is connected with a Track API key, which cannot list segments, or it has no manual segments. Connect with a private key and create a manual segment in Customer.io.

### Will someone who unsubscribed be subscribed again?

No. Linkbreakers only sets `unsubscribed` for a person who does not exist in Customer.io yet.

### Which region does my key need?

The key names it: `sk_us_` for a US workspace, `sk_eu_` for an EU one. A key that says one region for a workspace in the other is refused when you connect.

### What happens when I disconnect Customer.io?

Visitors stop being synced and the stored key is deleted. People already in Customer.io stay there.

## Sources

- Linkbreakers Customer.io integration page, API and MCP tools, checked in the product on 2026-11-09.
- Customer.io Track API: https://docs.customer.io/integrations/api/track/

## Last reviewed

2026-11-09 by Laurent Schaffner.
