Campaign Monitor
Datafly Signal syncs identified contacts into Campaign Monitor server-to-server using the Subscriber Management API. When a visitor signs up, logs in, or submits a form, Signal upserts them as a subscriber on your chosen list — with email, name, mobile, tracking consent, and custom fields — so they enter your lists, automations, and journeys without any client-side script.
Campaign Monitor does not offer a behavioural-event or conversion ingestion API. Signal therefore delivers identity events only (sign-up, login, identify, lead). Page views, product views, and order events are not sent to Campaign Monitor — route those to an analytics or advertising destination instead.
Prerequisites
Before configuring Campaign Monitor in Signal, you need a Campaign Monitor account, an API key, and the ID of the subscriber list you want to sync contacts into.
Step 1: Get your API key
- Log in to Campaign Monitor.
- Go to Account settings (top-right menu) > API key.
- Click Show API key and copy it.
The API key is used as the HTTP Basic username; the password is not used.
Step 2: Find your List ID
- Go to Lists & subscribers and open the list you want to sync into.
- Open the list Settings (Change name/type).
- Copy the List API ID — a long alphanumeric string.
Step 3: Create your custom fields (if used)
Campaign Monitor only accepts custom data through fields that already exist on the list. If your blueprint maps custom fields (for example company or signup_method):
- In the list, go to Custom fields.
- Click Create custom field and add each field key your blueprint uses.
If a blueprint maps a custom field that does not exist on the list, the API rejects the request with a 400 error. Create the field first, or remove the mapping.
Configure in Signal
Configuration Fields
| Field | Required | Description |
|---|---|---|
api_key | Yes | Your Campaign Monitor API key (used as the HTTP Basic username). Found under Account settings > API key. |
list_id | Yes | The List API ID of the subscriber list contacts are added to. Found under the list’s Settings. |
Management UI Setup
- Go to Integrations > Add Integration > Campaign Monitor.
- Choose the Default preset (contact sync).
- Enter your
api_keyandlist_id. - Select the consent category that governs email tracking (typically
marketing). - Click Save.
API Endpoint
POST https://api.createsend.com/api/v3.3/subscribers/{list_id}.json
Authorization: Basic base64("{api_key}:")
Content-Type: application/jsonThe API key is the Basic-auth username; the password is left empty. A successful upsert returns 201 Created with the subscriber’s email address in the body. POSTing an email that already exists updates that subscriber.
Identity Signals
Campaign Monitor keys subscribers on email address. Signal populates the subscriber record from the traits supplied via datafly.identify():
| Signal trait | Campaign Monitor field | Notes |
|---|---|---|
email | EmailAddress | Required. The subscriber key. Sent as-is (not hashed — Campaign Monitor stores the raw address). |
name | Name | Optional display name. |
phone | MobileNumber | Optional. Normalised to E.164 (e.g. +447700900123) before sending. |
anonymous_id | CustomFields[].Value | Stored in the datafly_anonymous_id custom field for cross-system joins. |
Unlike advertising destinations, Campaign Monitor is a first-party email platform that stores contact details in the clear, so email, name, and phone are not hashed. Only send identity events for users who have given the appropriate consent.
Consent
Signal maps your canonical marketing consent to Campaign Monitor’s ConsentToTrack field:
| Canonical marketing consent | ConsentToTrack |
|---|---|
true | Yes |
false | No |
| unknown | Unchanged |
ConsentToTrack controls whether Campaign Monitor may track the subscriber’s email opens and link clicks.
How to Send User Data
Call datafly.identify() when a user registers, logs in, or submits a form:
datafly.identify("user-123", {
email: "jane.doe@example.com",
name: "Jane Doe",
phone: "+44 7700 900123",
company: "Acme Ltd"
});Event Mapping
Only identity events upsert a subscriber. Each maps to a single POST /subscribers/{list_id}.json call.
Default preset
| Signal event | Result |
|---|---|
Signed Up | Subscriber upsert (adds signup_method custom field) |
Logged In | Subscriber upsert |
Identified | Subscriber upsert (adds company custom field) |
Lead Generated | Subscriber upsert |
All other events (page, Product Viewed, Order Completed, …) are dropped, because Campaign Monitor cannot consume them.
To customise which traits map to which custom fields, edit the integration’s Field Mappings in the Management UI.
Example: Sign-up event
Datafly.js call:
datafly.identify("user-123", {
email: "jane.doe@example.com",
name: "Jane Doe",
phone: "+44 7700 900123"
});
datafly.track("Signed Up", {
method: "email"
});Campaign Monitor payload sent by Signal:
{
"EmailAddress": "jane.doe@example.com",
"Name": "Jane Doe",
"MobileNumber": "+447700900123",
"ConsentToTrack": "Yes",
"Resubscribe": true,
"CustomFields": [
{ "Key": "datafly_anonymous_id", "Value": "a1b2c3d4-..." },
{ "Key": "signup_method", "Value": "email" }
]
}Testing
Trigger an identify + sign-up
On a test page with Datafly.js installed, run the datafly.identify() / datafly.track("Signed Up", …) calls above with a real test email you control.
Check the subscriber in Campaign Monitor
In Campaign Monitor, open Lists & subscribers > your list. The test contact should appear as an active subscriber within a few seconds, with the Name, Mobile, and custom fields populated.
Verify in the Signal event debugger
In the Management UI, open the integration’s Event Debugger. A successful delivery shows a 201 Created response with the subscriber email returned in the body.
Troubleshooting
| Problem | Solution |
|---|---|
400 with a Code/Message body | The email is invalid or on the suppression list, the mobile number is malformed, or a mapped custom field does not exist on the list. Create the custom field, or fix the trait value. |
401 Unauthorized | The API key is wrong. Re-copy it from Account settings > API key and confirm it is the Basic-auth username. |
404 Not Found | The list_id is wrong. Re-copy the List API ID from the list’s Settings. |
| Contact not appearing | Confirm the event is an identity event (Signed Up, Logged In, Identified, Lead Generated) — other events are dropped. Confirm email was supplied via datafly.identify(). |
| Opens/clicks not tracked | ConsentToTrack is No or Unchanged. Confirm the visitor granted marketing consent so Signal sends Yes. |
| Re-subscribing opted-out users | Resubscribe is sent as true when marketing consent is granted; if you do not want previously unsubscribed contacts re-added, remove the Resubscribe mapping from the blueprint. |
Rate Limits
Campaign Monitor rate-limits the API and returns X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers, but does not publish a fixed requests-per-second figure for the subscriber endpoints. Signal applies a conservative sustained rate with a small burst and backs off automatically on 429 responses.