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

# Campaign Monitor as a data source

> Bring your Campaign Monitor clients, lists, subscribers, campaigns and campaign reports to Nekt.

Campaign Monitor is an email marketing platform for creating, sending and measuring email campaigns and automated journeys. This connector reads your clients, subscriber lists and subscribers, your campaigns (sent, scheduled and drafts), the reports of each sent campaign (totals, recipients, opens, clicks, bounces, unsubscribes and spam complaints), and your journeys.

> [!NOTE]
>
> The connector only reads data. It never sends, schedules or changes campaigns, and never adds, edits or removes subscribers.

## Configuring Campaign Monitor as a Source

In the [Sources](https://app.nekt.ai/sources) tab, click on the "Add source" button located on the top right of your screen. Then, select the Campaign Monitor option from the list of connectors.

Click **Next** and you'll be prompted to add your access.

### 1. Add account access

In Campaign Monitor, click your profile image, open **Account settings** and then **API keys**. Copy the **API key**. The same page shows the **Client ID** of each client.

The following configurations are available:

* **API Key**: Your Campaign Monitor API key.
* **Start Date**: Campaign reports (summaries, lists and segments, email clients, recipients, opens, clicks, bounces, unsubscribes and spam complaints) cover the campaigns sent on or after this date. Clients, lists and the list of campaigns are read in full on every sync. Subscribers are read in full on the first sync and on full syncs; incremental syncs bring only the subscribers whose state changed (see the tip below).
* **Client IDs** (advanced): The Client IDs to sync, separated by commas. Leave it empty to sync every client of your account. If your API key belongs to a single client (a client API key), fill in that client's ID.
* **Campaign Reports Window (days)** (advanced): Each sync checks every campaign sent since the Start Date for new opens, clicks, bounces, unsubscribes and spam complaints. If you send many campaigns, set a number of days here and later syncs will only check the campaigns sent in that many days before the last activity read. Activity that still arrives for older campaigns is then **not loaded** (the sync log says how many campaigns were left out); only a full sync reads it. Leave it empty to check every campaign.

> [!WARNING]
>
> If Campaign Monitor does not allow your account to read a table (some reports are only available to agency accounts), that table is skipped and the sync log names it. The other tables keep syncing. Deselect the table to stop the warning.

Once you're done, click **Next**.

### 2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.

> Tip: The stream can be found more easily by typing its name.

Select the streams and click **Next**.

### 3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.

* **Layer**: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
* **Folder**: a folder can be created inside the selected layer to group all tables being created from this new data source.
* **Table name**: we suggest a name, but feel free to customize it. You have the option to add a **prefix** to all tables at once and make this process faster!
* **Sync Type**: you can choose between INCREMENTAL and FULL\_TABLE.
  * Incremental: every time the extraction happens, we'll get only the new data, which is good if, for example, you want to keep every record ever fetched.
  * Full table: every time the extraction happens, we'll get the current state of the data, which is good if, for example, you don't want to have deleted data in your catalog.

Once you are done configuring, click **Next**.

### 4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters.

To define your [Trigger](https://docs.nekt.com/runs/scheduling-and-triggers.md), consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times).

Optionally, you can define some additional settings:

* Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource [here](https://docs.nekt.com/get-started/core-concepts/resource-control).
* Determine when to execute an **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)**. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.

> [!TIP]
>
> The Subscribers table, in incremental mode, picks up every change of state (new, confirmed, bounced, unsubscribed, deleted). Changes to a subscriber's name or custom fields that do not change the state are **not** picked up by incremental syncs: only a full sync reads them. If you use names or custom fields, schedule an **Additional Full Sync** (for example, once a week), or set the Subscribers table to FULL\_TABLE. If you use the Campaign Reports Window, the same Additional Full Sync also brings the late activity of older campaigns.

Once you are ready, click **Next** to finalize the setup.

### 5. Check your new source

You can view your new source on the [Sources](https://app.nekt.ai/sources) page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.

> [!WARNING]
>
> For you to be able to see it on your [Catalog](https://app.nekt.ai/catalog), you need at least one successful source run.

## Good to know

* **Dates are in each client's time zone.** Campaign Monitor returns dates without a time zone, in the time zone set for each client. The `timezone` column of the Clients table shows it. The Start Date is read in the same way.
* **Campaign reports follow the Start Date.** Campaigns sent before the Start Date stay in the Campaigns table, but their reports and activity are not read.
* **Activity tables keep the full history.** Opens, clicks, bounces, unsubscribes and spam complaints are read incrementally: each sync reads the new activity of every campaign (one day before the last activity read, to catch late records).
* **Several opens in the same minute count once.** Campaign Monitor gives opens and clicks no ID and records their time to the minute, so two opens of the same email by the same subscriber in the same minute appear as one row.
* **Stats tables are snapshots.** Campaign Summaries, List Stats and Journey Emails hold the totals at the time of the sync.

# Streams and Fields

## Available streams

The table below lists every stream, its **slug** (the exact identifier to pass when creating the source via API) and a short description.

| Stream | Slug | Description |
| - | - | - |
| Clients | `clients` | Your clients (brands) with their details, time zone and billing settings. |
| Campaigns | `campaigns` | Every sent campaign, with its send date and number of recipients. |
| Scheduled Campaigns | `scheduled_campaigns` | Campaigns scheduled to be sent. |
| Draft Campaigns | `draft_campaigns` | Campaigns still in draft. |
| Segments | `segments` | Segments of your subscriber lists. |
| Suppression List | `suppression_list` | Email addresses that will never be emailed, with the reason. |
| Templates | `templates` | Email templates. |
| Tags | `tags` | Campaign tags and how many campaigns use each. |
| People | `people` | Users with access to each client (not subscribers). |
| Lists | `lists` | Subscriber lists and their settings. |
| List Stats | `list_stats` | Subscriber, unsubscribe, deletion and bounce counters of each list. |
| List Custom Fields | `list_custom_fields` | Custom fields defined on each list. |
| Subscribers | `subscribers` | Every subscriber of every list, in all states (active, unconfirmed, bounced, unsubscribed, deleted), with custom fields. |
| Campaign Summaries | `campaign_summaries` | Totals of each sent campaign: recipients, opens, clicks, unsubscribes, bounces, spam complaints. |
| Campaign Lists and Segments | `campaign_lists_and_segments` | The lists and segments each campaign was sent to. |
| Campaign Email Client Usage | `campaign_email_client_usage` | Email clients used to open each campaign. |
| Campaign Recipients | `campaign_recipients` | Who each campaign was sent to. |
| Campaign Opens | `campaign_opens` | Every open of every campaign, with location when available. |
| Campaign Clicks | `campaign_clicks` | Every link click of every campaign. |
| Campaign Bounces | `campaign_bounces` | Bounced emails of every campaign, with type and reason. |
| Campaign Unsubscribes | `campaign_unsubscribes` | Unsubscribes from every campaign. |
| Campaign Spam Complaints | `campaign_spam_complaints` | Spam complaints of every campaign. |
| Journeys | `journeys` | Journeys (automations) and what triggers them. |
| Journey Emails | `journey_emails` | Totals of each email of each journey. |

## Fields by stream

> [accordion] Clients
>
> **Primary key:** `client_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `name` - Name of the client as listed in the account
> * `company_name` - Company name of the client
> * `contact_name` - Name of the client's contact (returned only when the client has a single person)
> * `email_address` - Email address of the client's contact (returned only when the client has a single person)
> * `primary_contact_name` - Name of the client's primary contact
> * `primary_contact_email` - Email address of the client's primary contact
> * `country` - Country of the client
> * `timezone` - Time zone of the client, as named by Campaign Monitor. Dates of this client's records are in this time zone
> * `monthly_scheme` - Monthly billing plan of the client (Basic, Unlimited or Premier), when on a monthly plan
> * `access_details` - Access details of the client (JSON object with Username and AccessLevel), when returned
> * `billing_details` - Billing settings of the client (JSON object: credits, currency, rates and markups)

> [accordion] Campaigns
>
> **Primary key:** `campaign_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - Unique identifier of the campaign
> * `name` - Internal name of the campaign
> * `subject` - Subject line of the campaign email
> * `from_name` - Sender name of the campaign
> * `from_email` - Sender email address of the campaign
> * `reply_to` - Reply-to email address of the campaign
> * `tags` - Tags assigned to the campaign
> * `sent_date` - Date and time the campaign was sent, in the client's time zone
> * `total_recipients` - Number of recipients the campaign was sent to
> * `web_version_url` - URL of the web version of the campaign
> * `web_version_text_url` - URL of the text web version of the campaign

> [accordion] Scheduled Campaigns
>
> **Primary key:** `campaign_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - Unique identifier of the campaign
> * `name` - Internal name of the campaign
> * `subject` - Subject line of the campaign email
> * `from_name` - Sender name of the campaign
> * `from_email` - Sender email address of the campaign
> * `reply_to` - Reply-to email address of the campaign
> * `tags` - Tags assigned to the campaign
> * `date_created` - Date and time the campaign was created, in the client's time zone
> * `date_scheduled` - Date and time the campaign is scheduled to be sent, in the time zone given by scheduled\_time\_zone
> * `scheduled_time_zone` - Time zone of the scheduled send date
> * `preview_url` - URL of the campaign preview
> * `preview_text_url` - URL of the text preview of the campaign

> [accordion] Draft Campaigns
>
> **Primary key:** `campaign_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - Unique identifier of the campaign
> * `name` - Internal name of the campaign
> * `subject` - Subject line of the campaign email
> * `from_name` - Sender name of the campaign
> * `from_email` - Sender email address of the campaign
> * `reply_to` - Reply-to email address of the campaign
> * `tags` - Tags assigned to the campaign
> * `date_created` - Date and time the draft was created, in the client's time zone
> * `preview_url` - URL of the draft preview
> * `preview_text_url` - URL of the text preview of the draft

> [accordion] Segments
>
> **Primary key:** `segment_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `segment_id` - Unique identifier of the segment
> * `list_id` - ID of the subscriber list the segment belongs to
> * `title` - Name of the segment

> [accordion] Suppression List
>
> **Primary key:** `client_id`, `email_address` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `email_address` - Suppressed email address
> * `suppression_reason` - Why the address is suppressed (e.g. Unsubscribed, Bounced, Suppressed manually)
> * `date` - Date and time the address was suppressed, in the client's time zone
> * `state` - State of the suppressed address

> [accordion] Templates
>
> **Primary key:** `template_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `template_id` - Unique identifier of the template
> * `name` - Name of the template
> * `preview_url` - URL of the template preview
> * `screenshot_url` - URL of a screenshot of the template

> [accordion] Tags
>
> **Primary key:** `client_id`, `name` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `name` - Name of the tag
> * `number_of_campaigns` - Number of campaigns with this tag

> [accordion] People
>
> **Primary key:** `client_id`, `email_address` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `email_address` - Email address of the person (a user with access to the client, not a subscriber)
> * `name` - Name of the person
> * `access_level` - Access level of the person, as a Campaign Monitor permission bitmask
> * `status` - Status of the person (Active, or waiting to accept the invitation)

> [accordion] Lists
>
> **Primary key:** `list_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `list_id` - ID of the subscriber list
> * `name` - Name (title) of the list
> * `confirmed_opt_in` - Whether new subscribers must confirm their subscription (double opt-in)
> * `confirmation_success_page` - URL subscribers are sent to after confirming
> * `unsubscribe_page` - URL subscribers are sent to after unsubscribing
> * `unsubscribe_setting` - Whether unsubscribing removes the address from this list only or from all the client's lists

> [accordion] List Stats
>
> **Primary key:** `list_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `list_id` - ID of the subscriber list
> * `total_active_subscribers` - Total number of active subscribers of the list at the time of the sync
> * `new_active_subscribers_today` - Number of new active subscribers today (since midnight in the client's time zone)
> * `new_active_subscribers_yesterday` - Number of new active subscribers yesterday
> * `new_active_subscribers_this_week` - Number of new active subscribers this week (since Sunday)
> * `new_active_subscribers_this_month` - Number of new active subscribers this month
> * `new_active_subscribers_this_year` - Number of new active subscribers this year
> * `total_unsubscribes` - Total number of unsubscribes of the list at the time of the sync
> * `unsubscribes_today` - Number of unsubscribes today (since midnight in the client's time zone)
> * `unsubscribes_yesterday` - Number of unsubscribes yesterday
> * `unsubscribes_this_week` - Number of unsubscribes this week (since Sunday)
> * `unsubscribes_this_month` - Number of unsubscribes this month
> * `unsubscribes_this_year` - Number of unsubscribes this year
> * `total_deleted` - Total number of deleted subscribers of the list at the time of the sync
> * `deleted_today` - Number of deleted subscribers today (since midnight in the client's time zone)
> * `deleted_yesterday` - Number of deleted subscribers yesterday
> * `deleted_this_week` - Number of deleted subscribers this week (since Sunday)
> * `deleted_this_month` - Number of deleted subscribers this month
> * `deleted_this_year` - Number of deleted subscribers this year
> * `total_bounces` - Total number of bounced subscribers of the list at the time of the sync
> * `bounces_today` - Number of bounced subscribers today (since midnight in the client's time zone)
> * `bounces_yesterday` - Number of bounced subscribers yesterday
> * `bounces_this_week` - Number of bounced subscribers this week (since Sunday)
> * `bounces_this_month` - Number of bounced subscribers this month
> * `bounces_this_year` - Number of bounced subscribers this year

> [accordion] List Custom Fields
>
> **Primary key:** `list_id`, `key` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `list_id` - ID of the subscriber list
> * `key` - Key of the custom field, as it appears in subscribers' custom\_fields (e.g. \[website])
> * `field_name` - Name of the custom field
> * `data_type` - Data type of the custom field (Text, Number, Date, MultiSelectOne, MultiSelectMany, Country, USState)
> * `field_options` - Allowed options of a multi-option custom field
> * `visible_in_preference_center` - Whether subscribers can see and edit the field in the preference center

> [accordion] Subscribers
>
> **Primary key:** `list_id`, `email_address` · **Sync:** Incremental on `date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `list_id` - ID of the subscriber list
> * `email_address` - Email address of the subscriber
> * `name` - Name of the subscriber
> * `mobile_number` - Mobile number of the subscriber, when available
> * `state` - State of the subscriber in this list: Active, Unconfirmed, Bounced, Unsubscribed or Deleted
> * `date` - Date and time of the subscriber's current state (subscribed, confirmed, bounced, unsubscribed or deleted), in the client's time zone; used as the incremental replication key
> * `list_joined_date` - Date and time the subscriber joined the list, in the client's time zone
> * `custom_fields` - Custom field values of the subscriber (JSON array of objects with Key and Value; a multi-option field appears once per selected value)
> * `reads_email_with` - Email client the subscriber most recently opened with
> * `consent_to_track` - Whether the subscriber consented to tracking (Yes, No or Unchanged)
> * `consent_to_send_sms` - Whether the subscriber consented to receive SMS, when available

> [accordion] Campaign Summaries
>
> **Primary key:** `campaign_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `name` - Name of the campaign
> * `sent_date` - Date and time the campaign was sent, in the client's time zone
> * `recipients` - Number of recipients the campaign was sent to
> * `total_opened` - Total number of opens, counting repeated opens by the same subscriber
> * `unique_opened` - Number of distinct subscribers who opened the campaign
> * `clicks` - Number of distinct subscribers who clicked a link
> * `unsubscribed` - Number of subscribers who unsubscribed from the campaign
> * `bounced` - Number of bounced emails
> * `spam_complaints` - Number of spam complaints
> * `forwards` - Number of times the campaign was forwarded
> * `likes` - Number of likes
> * `mentions` - Number of social mentions
> * `web_version_url` - URL of the web version of the campaign
> * `web_version_text_url` - URL of the text web version of the campaign
> * `worldview_url` - URL of the Worldview report of the campaign

> [accordion] Campaign Lists and Segments
>
> **Primary key:** `campaign_id`, `type`, `id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `type` - Whether the campaign was sent to a whole list ('list') or to a segment of a list ('segment')
> * `id` - ID of the list or segment the campaign was sent to
> * `list_id` - ID of the list (for a segment, the list the segment belongs to)
> * `segment_id` - ID of the segment (empty for a whole list)
> * `name` - Name of the list, or title of the segment

> [accordion] Campaign Email Client Usage
>
> **Primary key:** `campaign_id`, `email_client`, `version` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `email_client` - Email client used to open the campaign (e.g. Gmail, iOS Devices)
> * `version` - Version of the email client
> * `percentage` - Share of the opening subscribers who used this email client, in percent
> * `subscribers` - Number of subscribers who opened the campaign with this email client

> [accordion] Campaign Recipients
>
> **Primary key:** `campaign_id`, `list_id`, `email_address` · **Sync:** Incremental on `sent_date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `sent_date` - Date and time the campaign was sent, in the client's time zone; used as the incremental replication key
> * `list_id` - ID of the list the recipient was on
> * `email_address` - Email address of the recipient

> [accordion] Campaign Opens
>
> **Primary key:** `campaign_id`, `list_id`, `email_address`, `date` · **Sync:** Incremental on `date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `list_id` - ID of the list the subscriber was on when the campaign was sent
> * `email_address` - Email address of the subscriber
> * `date` - Date and time of the open, in the client's time zone; used as the incremental replication key
> * `ip_address` - IP address the event came from
> * `latitude` - Approximate latitude of the event, when available
> * `longitude` - Approximate longitude of the event, when available
> * `city` - Approximate city of the event, when available
> * `region` - Approximate region or state of the event, when available
> * `country_code` - Two-letter country code of the event, when available
> * `country_name` - Country name of the event, when available

> [accordion] Campaign Clicks
>
> **Primary key:** `campaign_id`, `list_id`, `email_address`, `date`, `url` · **Sync:** Incremental on `date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `list_id` - ID of the list the subscriber was on when the campaign was sent
> * `email_address` - Email address of the subscriber
> * `date` - Date and time of the click, in the client's time zone; used as the incremental replication key
> * `url` - URL of the link that was clicked
> * `ip_address` - IP address the event came from
> * `latitude` - Approximate latitude of the event, when available
> * `longitude` - Approximate longitude of the event, when available
> * `city` - Approximate city of the event, when available
> * `region` - Approximate region or state of the event, when available
> * `country_code` - Two-letter country code of the event, when available
> * `country_name` - Country name of the event, when available

> [accordion] Campaign Bounces
>
> **Primary key:** `campaign_id`, `list_id`, `email_address`, `date` · **Sync:** Incremental on `date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `list_id` - ID of the list the subscriber was on when the campaign was sent
> * `email_address` - Email address of the subscriber
> * `date` - Date and time of the bounce, in the client's time zone; used as the incremental replication key
> * `bounce_type` - Type of bounce: Hard (permanent) or Soft (temporary)
> * `reason` - Reason given for the bounce

> [accordion] Campaign Unsubscribes
>
> **Primary key:** `campaign_id`, `list_id`, `email_address`, `date` · **Sync:** Incremental on `date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `list_id` - ID of the list the subscriber was on when the campaign was sent
> * `email_address` - Email address of the subscriber
> * `date` - Date and time of the unsubscribe, in the client's time zone; used as the incremental replication key
> * `ip_address` - IP address the unsubscribe came from

> [accordion] Campaign Spam Complaints
>
> **Primary key:** `campaign_id`, `list_id`, `email_address`, `date` · **Sync:** Incremental on `date`
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `campaign_id` - ID of the sent campaign
> * `list_id` - ID of the list the subscriber was on when the campaign was sent
> * `email_address` - Email address of the subscriber
> * `date` - Date and time of the spam complaint, in the client's time zone; used as the incremental replication key

> [accordion] Journeys
>
> **Primary key:** `journey_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `journey_id` - Unique identifier of the journey (automation)
> * `list_id` - ID of the list the journey is attached to
> * `name` - Name of the journey
> * `status` - Status of the journey (e.g. Active, Inactive)
> * `trigger_type` - What starts the journey for a subscriber (e.g. subscribe to a list, a date)

> [accordion] Journey Emails
>
> **Primary key:** `journey_id`, `email_id` · **Sync:** Full table
>
> * `client_id` - ID of the Campaign Monitor client (brand/account) the record belongs to
> * `journey_id` - ID of the journey the email belongs to
> * `email_id` - Unique identifier of the journey email
> * `name` - Name of the journey email
> * `sent` - Number of times the email was sent
> * `opened` - Total number of opens
> * `unique_opened` - Number of distinct subscribers who opened the email
> * `clicked` - Number of clicks
> * `bounced` - Number of bounces
> * `unsubscribed` - Number of unsubscribes from the email


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.