# Linking Customer.io as a source - Docs

![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_9608fcca70)

![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_dark_a92b0e022d)

Let AI connect your sources for you

Skip the manual setup — run this in your project and the wizard auto-detects your databases and APIs and connects them to PostHog.

`npx @posthog/wizard warehouse`

[Learn more](/wizard.md)

![PostHog Wizard hedgehog](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png)

**Beta release**

This source is currently in **beta**. It works end to end, but you may still hit rough edges – [let us know](https://app.posthog.com/#panel=support%3Asupport%3Adata_warehouse%3A%3Atrue) if you do.

Connect your Customer.io workspace using an App API key. PostHog uses the key to pull campaigns, broadcasts, segments, newsletters, and more, and to register a reporting webhook for realtime message activity.

## Adding a data source

1.  Go to the [sources tab](https://app.posthog.com/data-management/sources) of the data pipeline section in PostHog.
2.  Click **\+ New source** and then click **Link** next to Customer.io.
3.  Generate an **App API key** in Customer.io under **API Credentials > App API Keys**. PostHog uses this key both to pull the list endpoints and to manage the reporting webhook automatically. Also note your workspace **Region** — **US** (`api.customer.io`) or **EU** (`api-eu.customer.io`).
4.  Back in PostHog, paste the App API key in the **App API key** field, select your **Region**, and click **Next**.
5.  To capture realtime message activity, PostHog tries to register a reporting webhook for you using your App API key. Customer.io doesn't return the signing key in the API response, so copy the **Signing key** from the **Reporting Webhooks** page in Customer.io (under **Integrations**) and paste it into the **Signing key** field. If auto-registration failed, add a **Reporting Webhook** integration manually in Customer.io, paste the webhook URL PostHog shows, select the events you want, save and enable it, then copy the signing key.
6.  Select the tables you want to sync, set the sync method and frequency, then click **Import**.

Once the syncs are complete, you can start using Customer.io data in PostHog.

## Available tables

The App API list endpoints sync via full refresh, and the webhook-backed event tables capture realtime message activity from Customer.io's reporting webhook.

| Table | Description | Sync method |
| --- | --- | --- |
| broadcasts | Broadcasts in your workspace | Full refresh |
| campaigns | Campaigns in your workspace | Full refresh |
| collections | Collections (data sets) | Full refresh |
| newsletters | Newsletters | Full refresh |
| object_types | Object type definitions | Full refresh |
| segments | Segments | Full refresh |
| sender_identities | Sender identities | Full refresh |
| snippets | Reusable content snippets | Full refresh |
| subscription_topics | Subscription topics | Full refresh |
| transactional | Transactional messages | Full refresh |
| customer_events | Customer subscription activity from the reporting webhook | Webhook |
| email_events | Email delivery activity from the reporting webhook | Webhook |
| push_events | Push notification activity from the reporting webhook | Webhook |
| sms_events | SMS delivery activity from the reporting webhook | Webhook |
| in_app_events | In-app message activity from the reporting webhook | Webhook |
| slack_events | Slack message activity from the reporting webhook | Webhook |
| webhook_events | Webhook delivery activity from the reporting webhook | Webhook |

**Full refresh** tables reload all data on each sync. **Webhook** tables are populated in realtime as Customer.io sends reporting-webhook events to PostHog.

## Configuration

| Option | Description |
| --- | --- |
| App API keyType: passwordRequired: True | Generate a key under [API Credentials > App API Keys](https://fly.customer.io/settings/api_credentials?keyType=app). PostHog needs this key both for pulling list endpoints and for managing the reporting webhook automatically. |
| RegionType: selectRequired: True |

## Supported tables

| Table | Description | Sync method | Incremental field | Primary key |
| --- | --- | --- | --- | --- |
| customer_events | Customer subscription events delivered via the Customer.io reporting webhook. | Webhook only | — | — |
| email_events | Email message activity events (sent, delivered, opened, clicked, bounced, etc.) delivered via the reporting webhook. | Webhook only | — | — |
| push_events | Push notification activity events delivered via the reporting webhook. | Webhook only | — | — |
| sms_events | SMS message activity events delivered via the reporting webhook. | Webhook only | — | — |
| in_app_events | In-app message activity events delivered via the reporting webhook. | Webhook only | — | — |
| slack_events | Slack message activity events delivered via the reporting webhook. | Webhook only | — | — |
| webhook_events | Outgoing webhook (reporting) action events delivered via the reporting webhook. | Webhook only | — | — |
| broadcasts | A broadcast — a one-time message sent to a segment or list of recipients. | Full refresh | — | — |
| campaigns | A campaign — an automated, triggered messaging workflow. | Full refresh | — | — |
| collections | A collection — structured reference data you can use in message content. | Full refresh | — | — |
| newsletters | A newsletter — a one-off email sent to a segment of customers. | Full refresh | — | — |
| object_types | An object type — a category of non-person objects (e.g. companies, accounts) in the workspace. | Full refresh | — | — |
| segments | A segment — a group of customers defined by attributes or behavior. | Full refresh | — | — |
| sender_identities | A sender identity — a configured from-name/address used to send messages. | Full refresh | — | — |
| snippets | A snippet — a reusable block of content for message templates. | Full refresh | — | — |
| subscription_topics | A subscription topic — a category customers can opt in or out of. | Full refresh | — | — |
| transactional | A transactional message — a template for one-off, triggered messages such as receipts or password resets. | Full refresh | — | — |

### Community questions

Ask a question

### Was this page useful?

HelpfulCould be better