Skip to main content

Constant Contact Connector (Technical Documentation)

Written by Philippe Trussart

Overview

The Constant Contact connector provides read-only access to Constant Contact v3 data, including:

  • Contacts, lists, tags, and custom fields

  • Email campaigns and campaign activity

  • Email sends, opens, clicks, opt-outs, and other engagement reporting

  • Segments and campaign summary/statistics data

  • Activity records

The connector does not create, update, or delete Constant Contact records. Each table has predefined unique key fields appropriate to that dataset.


Authentication

The connector uses Constant Contact OAuth and requires:

client_id client_secret access_token refresh_token

The access token is used for API requests against:

https://api.cc.email

The connector automatically refreshes the access token when it detects that the token is expired or when Constant Contact returns HTTP 401. Updated access and refresh tokens are retained for subsequent requests.

According to the operational settings captured in the connector:

Access token lifetime:  1 day Refresh token lifetime: 180 days

If the refresh token itself expires, the Constant Contact connection must be reauthorized.


API Requests

Most data retrieval is performed with GET requests.

There are two important exceptions related to authentication and contact exports:

Operation

Method

Purpose

Normal data/report retrieval

GET

Retrieves contacts-related metadata, campaigns, reporting, segments, etc.

/v3/activities/contact_exports

POST

Starts a bulk contact export

Contact export status/result URLs

GET

Polls the export and downloads the resulting CSV

OAuth token endpoint

POST

Exchanges an authorization code for access/refresh tokens

The OAuth token endpoint is:

https://authz.constantcontact.com/oauth2/default/v1/token

There are no PUT, PATCH, or DELETE operations used to modify Constant Contact business data.


Sync Behavior

The connector does not maintain incremental bookmarks. Selected tables are re-read from Constant Contact on each sync.

For normal endpoints, the connector follows Constant Contact pagination until no more records are returned.

Contacts use a bulk export

contacts is handled differently from the other tables.

Instead of paging through the contacts API, the connector:

  1. Starts a contact export using:

POST /v3/activities/contact_exports
  1. Polls the export status every 5 seconds.

  2. Waits until the export reaches completed.

  3. Downloads the exported CSV.

  4. Loads the CSV records into the contacts dataset.

The export can wait for up to:

24 hours

before the connector considers it timed out.

Bulk export is used because a large contact database could otherwise consume a significant portion of Constant Contact's daily API request quota.


Email Reporting Behavior

Email reporting is more API-intensive than most Constant Contact datasets.

Reports such as:

email_links email_sends email_opens email_unique_opens email_did_not_opens email_clicks email_optouts email_campaign_activity_stats

require a campaign_activity_id.

To determine those IDs, the connector first:

GET /emails

and then, for every campaign:

GET /emails/{campaign_id}

It extracts the campaign_activity_id values from each campaign's activities and then uses those IDs to retrieve the corresponding reporting data.

This means an email-reporting sync may require substantially more API calls than the number of final records suggests.

For email_campaign_activity_stats, activity IDs are grouped into batches of up to 10 IDs per request.


Schema Behavior

Schemas are predefined by the connector.

For normal API datasets:

  • Only fields defined in the connector schema are included.

  • Additional fields returned by Constant Contact are ignored.

  • If a configured field is missing from an API response, it is written as NULL.

This means new fields introduced by Constant Contact will not automatically become new columns until the connector schema is updated.

Contacts are sourced through the CSV export. CSV headers are normalized to lowercase snake case before records are loaded.


Deletes

The connector does not explicitly synchronize deletions.

Some Constant Contact responses contain fields such as:

deleted_at

which can indicate deletion-related state for particular objects or email-reporting records. However, the connector does not:

  • Consume a general deleted-record feed

  • Compare current and previous snapshots

  • Generate explicit downstream delete events

Consumers should therefore not assume that a source record disappearing from Constant Contact will automatically cause the existing downstream record to be removed.


Rate Limits & Retries

The connector documents Constant Contact v3 limits as:

10,000 API requests per day per API key 4 API requests per second

The daily quota resets at 00:00 UTC. Exceeding a limit can return HTTP 429.

Failed requests are retried up to 5 times, using exponential backoff:

1 second 2 seconds 4 seconds 8 seconds 16 seconds

with a maximum individual delay of 30 seconds. A 401 triggers an access-token refresh before retrying.


Known Limitations & Notable Behavior

  • Syncs are not incremental. The connector does not store a last-modified bookmark, so selected datasets are re-read each time.

  • Large contact databases use asynchronous bulk export. This reduces API request usage but means contact syncs may take longer while Constant Contact prepares the export.

  • Email reporting can consume many API requests. Campaign activity IDs must first be discovered by paging through campaigns and retrieving each campaign individually before many reporting endpoints can be queried.

  • The 10,000-request daily quota can affect large reporting syncs. This is particularly relevant for accounts with many campaigns and campaign activities.

  • Deletes are not explicitly propagated. A record disappearing upstream does not automatically generate a deletion downstream.

  • Schemas are fixed. New Constant Contact fields are dropped until explicitly added to the connector's schema.

  • OAuth authorization can eventually need user intervention. Access tokens are refreshed automatically, but once the refresh token is no longer valid, the connection must be authorized again.

  • Bulk contact exports can run for a long time. The connector allows an export to remain pending for up to 24 hours before treating it as failed.

  • Unexpected non-200 responses are retried rather than immediately failing. After the retry limit is reached, some normal paged operations return the last response to the calling logic, so unexpectedly low record counts should be investigated rather than automatically assumed to represent all available source data.

Did this answer your question?