---
title: "Iterable Connector"
description: "Complete Iterable integration guide for syncing users, campaigns, experiments, and engagement events with Brevo via Tajo."
url: https://tajo.io/docs/connectors/marketing/iterable/
markdown: https://tajo.io/docs/connectors/marketing/iterable.md
lang: en-US
robots: noindex
---

# Iterable Connector

Connector status: Planned Not built yet. Tajo does not run this connector today.

| Source field | Destination field | Sample value |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Connect your Iterable growth marketing platform to Brevo for unified customer engagement, cross-channel campaign coordination, and consolidated analytics across marketing tools.

## Overview

| Property | Value |
| --- | --- |
| **Platform** | Iterable |
| **Category** | Marketing |
| **Setup Complexity** | Moderate |
| **Official Integration** | No |
| **Data Synced** | Users, Events, Campaigns, Catalogs |
| **API Type** | REST API |
| **Authentication** | API Key |
| **Base URL** | `https://api.iterable.com/api/` |

## Features

- **User profile sync** - Bidirectional user data synchronization with Brevo contacts
- **Campaign analytics** - Sync campaign send, open, and click metrics for unified reporting
- **Experiment data** - Track A/B test results and winning variants
- **Catalog sync** - Synchronize product and content catalogs across platforms
- **Workflow events** - Forward workflow trigger and completion events to Brevo
- **Channel preference sync** - Replicate user communication preferences in Brevo

## Prerequisites

Before you begin, ensure you have:

1. An Iterable account with API access
2. An Iterable API key with appropriate permissions
3. Your Iterable project ID
4. A Brevo account with API access
5. A Tajo account with an active subscription

## Authentication

Iterable uses API key authentication passed in the request header.

### Creating an API Key

1. Log in to your Iterable dashboard
2. Navigate to **Integrations** > **API Keys**
3. Click **New API Key**
4. Name it “Tajo Integration”
5. Select **Server-side** key type
6. Grant the following permissions:

```
Users: Read/Write
Events: Read/Write
Campaigns: Read
Lists: Read/Write
Catalogs: Read
Experiments: Read
Workflows: Read
Templates: Read
Channels: Read
Message Types: Read
```

Key Type Matters

Always use a **Server-side** API key for Tajo integration. Mobile and JavaScript-side keys have restricted permissions and cannot access all required endpoints.

### Connecting to Tajo

```bash
tajo connectors install iterable \
  --api-key $ITERABLE_API_KEY
```

## Configuration

### Basic Setup

```yaml
connectors:
  iterable:
    enabled: true

    sync:
      users: true
      events: true
      campaigns: true
      catalogs: true
      experiments: true

    lists:
      all_users: 16
      engaged_users: 17
      inactive_users: 18
```

### Field Mapping

Map Iterable user fields to Brevo contact attributes:

```yaml
field_mapping:
  # Standard fields
  userId: ITERABLE_ID
  email: email
  firstName: FIRSTNAME
  lastName: LASTNAME
  phoneNumber: SMS

  # Engagement data
  signupDate: SIGNUP_DATE
  totalPurchases: TOTAL_PURCHASES
  lastPurchaseDate: LAST_PURCHASE

  # Custom fields
  plan_name: PLAN_NAME
  company_size: COMPANY_SIZE
  preferred_channel: PREFERRED_CHANNEL
  lifecycle_stage: LIFECYCLE_STAGE
```

### Event Configuration

```yaml
event_mapping:
  # Iterable event -> Brevo event
  purchase: ORDER_PLACED
  addToCart: CART_UPDATED
  pageView: PAGE_VIEWED
  appOpen: APP_OPENED
  pushOpen: PUSH_ENGAGED
```

## API Endpoints

Tajo integrates with the following Iterable API endpoints:

| Endpoint | Method | Purpose |
| --- | --- | --- |
| `/users/update` | POST | Update user profiles |
| `/users/{email}` | GET | Retrieve user by email |
| `/users/bulkUpdate` | POST | Batch update users |
| `/events/track` | POST | Track custom events |
| `/events/trackBulk` | POST | Batch track events |
| `/campaigns` | GET | List all campaigns |
| `/campaigns/metrics` | GET | Campaign performance data |
| `/experiments/metrics` | GET | Experiment results |
| `/lists` | GET | List all user lists |
| `/lists/subscribe` | POST | Add users to a list |
| `/lists/unsubscribe` | POST | Remove users from a list |
| `/catalogs/{catalogName}/items` | GET | Retrieve catalog items |
| `/channels` | GET | List messaging channels |
| `/export/data.json` | GET | Export raw event data |

## Code Examples

### Initialize Connector

```javascript
import { TajoClient } from '@tajo/sdk';

const tajo = new TajoClient({
  apiKey: process.env.TAJO_API_KEY,
  brevoApiKey: process.env.BREVO_API_KEY
});

await tajo.connectors.connect('iterable', {
  apiKey: process.env.ITERABLE_API_KEY
});
```

### Sync Users

```javascript
// Incremental user sync from Iterable to Brevo
await tajo.connectors.sync('iterable', {
  type: 'incremental',
  resources: ['users'],
  since: '2024-01-01',
  batchSize: 50
});

const status = await tajo.connectors.status('iterable');
console.log(status);
// {
//   connected: true,
//   lastSync: '2024-03-15T09:45:00Z',
//   usersCount: 58700,
//   campaignsTracked: 42,
//   eventsProcessed: 210000
// }
```

### Track Events

```javascript
// Forward Iterable events to Brevo
await tajo.connectors.handleEvent('iterable', {
  type: 'custom_event',
  payload: {
    email: 'user@example.com',
    eventName: 'subscription_upgraded',
    dataFields: {
      previousPlan: 'starter',
      newPlan: 'pro',
      mrr: 99.00
    }
  }
});
```

### Webhook Handler

```javascript
// Handle Iterable system webhooks
app.post('/webhooks/iterable', async (req, res) => {
  const event = req.body;

  await tajo.connectors.handleWebhook('iterable', {
    type: event.eventName,
    payload: event
  });

  res.status(200).send('OK');
});
```

## Rate Limits

Iterable enforces rate limits based on your plan:

| Plan | Rate Limit | Bulk Endpoint Limit |
| --- | --- | --- |
| **Growth** | 500 requests/second | 500 requests/second |
| **Enterprise** | Custom | Custom |

Specific endpoint limits:

| Endpoint | Limit |
| --- | --- |
| `/users/update` | 500 req/s |
| `/users/bulkUpdate` | 500 req/s (1,000 users per request) |
| `/events/track` | 500 req/s |
| `/events/trackBulk` | 500 req/s (8,000 events per request) |
| `/export/data.json` | 4 concurrent requests |

Bulk Endpoints

Tajo automatically batches user updates (up to 1,000 per call) and event tracks (up to 8,000 per call) to maximize throughput while staying within rate limits.

## Troubleshooting

### Common Issues

| Issue | Cause | Solution |
| --- | --- | --- |
| 401 Unauthorized | Invalid API key | Verify key in Iterable > Integrations > API Keys |
| Users not syncing | Key type mismatch | Ensure you are using a Server-side API key |
| Missing campaign data | Insufficient permissions | Add Campaigns Read permission to API key |
| Export timeout | Large data volume | Use date range filters to reduce export size |
| Duplicate users | Inconsistent identifiers | Use email as primary identifier consistently |

### Debug Mode

```yaml
connectors:
  iterable:
    debug: true
    log_level: verbose
    log_api_calls: true
```

### Test Connection

```bash
tajo connectors test iterable
# ✓ API connection successful
# ✓ User data accessible
# ✓ Campaign list readable
# ✓ Event tracking operational
# ✓ List management available
```

## Best Practices

1. **Use bulk endpoints** - Always prefer `bulkUpdate` and `trackBulk` for large data volumes
2. **Deduplicate by email** - Use email as the consistent identifier across Iterable and Brevo
3. **Sync incrementally** - Use date ranges to avoid re-processing historical data
4. **Map channel preferences** - Sync opt-in/opt-out status to maintain compliance
5. **Monitor export jobs** - Large exports can take time; set up status polling
6. **Test with non-production project** - Validate mappings before syncing production data

## Security

- **API Key Authentication** - Server-side keys with granular permissions
- **HTTPS Only** - All API communication encrypted via TLS 1.2+
- **Key Rotation** - Support for multiple active API keys during rotation
- **Encrypted Storage** - API credentials encrypted at rest in Tajo
- **JWT Webhooks** - Webhook payloads signed with JWT for verification

## Related Resources

- [Braze Connector](https://tajo.io/docs/connectors/marketing/braze)
- [Customer.io Connector](https://tajo.io/docs/connectors/marketing/customerio)
- [Customer Sync Skill](https://tajo.io/docs/skills/data-sync/customer-sync)
- [Brevo Contacts API](https://tajo.io/docs/contact-management)

## Open-Source Implementation Map

No official open-source repository was found in the current Tajo connector catalog for Iterable. Keep this page focused on the verified public API contract and vendor documentation until an official schema, SDK, MCP server, or public integration repository is available.

### Tajo Revamp Checklist

- Verify authentication and scope requirements against the vendor documentation before each connector release.
- Document primary sync objects, external IDs, pagination strategy, and rate limits explicitly.
- Add smoke tests from public API examples rather than undocumented behavior.
- Capture webhook signature verification and replay protection when the vendor supports webhooks.
- Record gaps where no official public repository or schema exists so future maintainers know what still needs source-backed validation.
