Use this guide to quickly get started working through the typical email campaign creation workflow:
Before You Begin
Verify the following:
- You have a Constant Contact V3 API developer account and a registered application in the Developer Portal.
- OAuth2 authentication is configured for your integration. Learn more
- You are authorized to access the necessary scopes and privileges that allow you to get and change campaign data:
- Constant Contact users who are granting your application access to data in their Constant Contact account must have
campaign:write
andcampaign:read
email campaigns privileges. Developers can verify a user’s privileges by making a GET call to the/account/user/privileges
endpoint. Learn more - You requested and received the
campaign_data
scope from your Constant Contact users. For example:campaign_data
scope is required to access campaign reporting data. Learn more Note: Adding a contact without their explicit consent is a serious violation of anti-spam laws and Constant Contact’s Terms of Service.
- Constant Contact users who are granting your application access to data in their Constant Contact account must have
Custom Code Email Campaigns
Constant Contact uses format types (format_type
) to support their different email editor versions and API email formats. You use the V3 API to create email campaigns using the custom code format type. You can still retrieve, update, and schedule the other email format types, but you cannot use the V3 API to create them.
Custom code emails provide you with a flexible way to control how your emails look and support many of the new Constant Contact email features. Custom code type 5
supports all features allowing you to:
- Send email to segments. Segments are dynamic lists of contacts that you create using different kinds of criteria.
- Use personalization tags to pull contact, custom field, or account information into your email.
- Be flexible with how you style your email. You can choose to use a style element or use inline CSS. Constant Contact will automatically convert your email to use inline css when you send the email to improve compatibility with email clients.
- You can also use the new custom code editor UI to view a live preview of your email and check for layout issues as you edit it.
Learn more about format type schema differences
Plan
Step 1: Define Your Goal
[CLICK] for details...
Clearly articulate what you want to achieve with your email campaign. This goal will guide all subsequent email campaign related decisions.
Example Goals- Increase sales
- Drive website traffic
- Generate leads
- Announce a new product or service
- Build brand awareness
- Nurture existing customers
Example Use Case
For all eight car dealerships, I want to increase older tire inventory sales and make room for more current tire inventory.
Step 2: Identify Your Target Contacts
[CLICK] for details...
Who are you trying to reach with this email campaign? Identifying the correct contacts to target for your email campaign will help to increase open rates and avoid non-applicable contacts from opting out of receiving your future campaigns.
To identify a subset of contacts to which to send your email campaign, you can create or select from existing lists or segments. Later in this workflow, you'll use the contact_list_ids
or segment_id
in the PUT /emails/activities/{campaign_activity_id}
call to identify your target contacts. We recommended that you create the segment or lists now, if they don't already exist.
Example Targeted Contacts Criteria
I want to target existing customers (contacts) whose car tire specifications match tire specifications in my older inventory. For this example, to identify my target contacts, I might choose to create a segment that uses tags to identify contacts with certain car makes, models, and years.
Create a New Email Campaign
[CLICK] for details...
To create a new email campaign, make a POST call to the /emails
endpoint. The request body must contain a unique email_campaign_activities
array.
The email_campaign_activities
array contains the main content of your email campaign and must include format_type
, from_name
, from_email
, reply_to_email
, and subject
properties. If the format_type
is 5
then the html_content
property is also required.
The from_email
address must be a verified email address for your account. It is an array because a single email campaign can contain multiple types of email interactions, such as a resend or an A/B test email.
Email campaign activities are different types of email interactions with your contacts. For example, sending an initial email to contacts uses the primary_email
activity. The primary_email
activity can be used to create an A/B email subject line test. In addition, resending an email to non-openers creates a resend
activity. Constant Contact also provides you with a permalink
activity that contains a permanent link to a web accessible version of your email.
Note: Contacts to which to send the email campaign are specified after the email campaign is created.
[CLICK] to view an example request...
{
"name": "Inventory close out sale",
"email_campaign_activities": [{
"format_type": 5,
"from_email": "jdodge@example.com",
"reply_to_email": "jdodge@example.com",
"from_name": "Jake Dodge",
"subject": "Our BIGGEST Tire Sale of the Year!!",
"html_content": "<html><body>[[trackingImage]]<a href=\"http://www.constantcontact.com\">Visit ConstantContact.com!</a></body></html>",
"preheader": "Best Deals 4 Wheels",
"physical_address_in_footer": {
"address_line1": "123 Maple Street",
"address_line2": "Unit 1",
"address_optional": "Near Boston Fire Station",
"city": "Boston",
"country_code": "US",
"country_name": "United States",
"organization_name": "Jake Dodge's Tire Warehouse",
"postal_code": "02451",
"state_code": "MA"
}
}]
}
[CLICK] to view an example response...
{
"campaign_activities": [
{
"campaign_activity_id": "0f9b6b51-7d01-4d7c-b4f4-ff41c39cf90d",
"role": "primary_email"
},
{
"campaign_activity_id": "3a66f67b-f518-47d7-bcca-101225031ec1",
"role": "permalink"
}
],
"campaign_id": "68560983-829b-4825-a660-b072ed2fb177",
"created_at": "2025-08-12T17:44:22.029Z",
"current_status": "Draft",
"name": "Inventory close out sale",
"type": "CUSTOM_CODE_EMAIL",
"type_code": 26,
"updated_at": "2025-08-12T17:44:22.029Z"
}
In the response, be sure to save the primary email campaign_activity_id
required later to:
- Update the email campaign to add contacts as recipients.
- Test send or preview the email campaign.
- Schedule or send the email campaign.
Test Send
[CLICK] for details...
Always send a test email to yourself and a few trusted colleagues to proofread and check functionality (links, images). Also, test to see how your email will look on different devices (desktop, mobile).
Make a POST call to the /emails/activities/{campaign_activity_id}/tests
endpoint and use the previously saved campaign_activity_id
to send a test email. Test emails also allow you to verify how the email campaign activity will look before sending it to contacts.
[CLICK] to view an example request...
curl --request POST \
--url https://api.cc.email/v3/emails/activities/%7Bcampaign_activity_id%7D/tests \
--header 'content-type: application/json' \
--header 'Authorization: Bearer {access token}' \
--data '{"email_addresses":["dlang@example.com"],"personal_message":"This is a test send of the email campaign activity."}'
A successful send returns a 204 response (no response body).
To help maximize contact open rates for a draft primary email campaign, use A/B subject line testing to determine the best subject line to use before sending the email campaign to contacts.
Note: You can also preview how the complete HTML for an email campaign activity looks before sending to contacts by making a GET call to the /emails/activities/{campaign_activity_id}/previews
endpoint and use the previously saved campaign_activity_id
.
- Learn more about email campaign activity test sends
- Learn more about AB tests
- Learn more about previewing an email campaign
Select Contacts
[CLICK] for details...
To select contacts to which to send your campaign, make a PUT call to the /emails/activities/{campaign_activity_id}
endpoint (use the previously saved campaign_activity_id
). This endpoint is used for both adding contacts to the email campaign and to update email campaign properties.
When you use a PUT method to update a resource, the V3 API overwrites any properties that are missing in the request body. However, this method does not overwrite sub-resources that you omit in the request body or missing properties in sub-resources. This method requires physical_address_in_footer
, document_properties
, html_content
, and permalink_url
sub-resources.
In the request body, specify which contacts to send your campaign to using either the segment_ids
or contact_list_ids
array. Use the segment_ids
array to specify a single segment_id
used to dynamically get contacts that meet that segment's criteria. Use the contact_list_ids
array to specify the unique contact list_id
string values used to get contacts.
[CLICK] to view an example request...
The following example request uses a single contact list to identify contacts to which to send the email campaign.
curl --request PUT \
--url https://api.cc.email/v3/emails/activities/%7Bcampaign_activity_id%7D \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'Authorization: Bearer {access token}' \
--data '{"contact_list_ids":["da10f460-3072-11e9-b282-fa163e6b01c1"],"from_email":"jdodge@constantcontact.com","from_name":"Jake Dodge","reply_to_email":"jdodge@constantcontact.com","subject":"Holiday Special Newsletter","html_content":"<html><body>[[trackingImage]] <a href=\"http://www.constantcontact.com\">Visit ConstantContact.com!</a> </body></html>","preheader":"You don'\''t want to miss this.","physical_address_in_footer":{"address_line1":"123 Maple Street","address_line2":"Unit 1","address_line3":"string","address_optional":"Near Boston Fire Station","city":"Boston","country_code":"US","organization_name":"Jake Dodge'\''s Pancakes","postal_code":"02451","state_code":"MA","state_non_us_name":"Victoria"},"document_properties":{"style_content":".white{color: #ffffff;}","greeting_salutation":"Dear","greeting_name_type":"F","greeting_secondary":"Greetings!","subscribe_link_enabled":"false","subscribe_link_name":"Subscribe to my email list!","text_content":"<Text><Greeting/></Text>","permission_reminder_enabled":"false","permission_reminder":"Hi, just a reminder that you'\''re receiving this email because you have expressed an interest in our company.","view_as_webpage_enabled":"false","view_as_webpage_text":"Having trouble viewing this email?","view_as_webpage_link_name":"Click here to view this email as a web page","forward_email_link_enabled":"true","forward_email_link_name":"Forward email"}}'
[CLICK] to view an example response...
{
"campaign_activity_id": "4c08372c-957a-48b5-bc45-72c7f00796cd",
"campaign_id": "8987dc1a-48ef-433a-b836-7ca4f9aa3481",
"role": "primary_email",
"contact_list_ids": [
"da10f460-3072-11e9-b282-fa163e6b01c1"
],
"segment_ids": [
1
],
"current_status": "DRAFT",
"format_type": 5,
"from_email": "jdodge@constantcontact.com",
"from_name": "Jake Dodge",
"reply_to_email": "jdodge@constantcontact.com",
"subject": "Holiday Special Newsletter",
"html_content": "<html><body>[[trackingImage]] <a href=\"http://www.constantcontact.com\">Visit ConstantContact.com!</a> </body></html>",
"template_id": "1000755366001",
"permalink_url": "https://conta.cc/2GaQ8AY",
"preheader": "You don't want to miss this.",
"physical_address_in_footer": {
"address_line1": "123 Maple Street",
"address_line2": "Unit 1",
"address_line3": "string",
"address_optional": "Near Boston Fire Station",
"city": "Boston",
"country_code": "US",
"country_name": "United States",
"organization_name": "Jake Dodge's Pancakes",
"postal_code": "02451",
"state_code": "MA",
"state_name": "string",
"state_non_us_name": "Victoria"
},
"document_properties": {
"style_content": ".white{color: #ffffff;}",
"letter_format": "XHTML",
"greeting_salutation": "Dear",
"greeting_name_type": "F",
"greeting_secondary": "Greetings!",
"subscribe_link_enabled": "false",
"subscribe_link_name": "Subscribe to my email list!",
"text_content": "<Text><Greeting/></Text>",
"permission_reminder_enabled": "false",
"permission_reminder": "Hi, just a reminder that you're receiving this email because you have expressed an interest in our company.",
"view_as_webpage_enabled": "false",
"view_as_webpage_text": "Having trouble viewing this email?",
"view_as_webpage_link_name": "Click here to view this email as a web page",
"forward_email_link_enabled": "true",
"forward_email_link_name": "Forward email"
}
}
Learn more about updating an email campaign activity
Schedule or Send
[CLICK] for details...
Make a POST call to the /emails/activities/{campaign_activity_id}/schedules
endpoint to specify when to send the email campaign activity. Use the scheduled_date
request body property to:
- Schedule to send: enter the date (ISO-8601 format) to send the email campaign. This is often recommended for optimal engagement times. You must add contacts to an email campaign activity before you can schedule it.
- Send now: enter
0
to send the email campaign now.
If it's an automation campaign, you'll activate the series once configured, and emails will send based on the triggers you set. You can only schedule email campaign activities that have the primary_email
role and the status is DRAFT
, DONE
, or ERROR
.
- DRAFT — An email campaign activity you created but have not sent to contacts. You can update email campaign activities when they are in
DRAFT
status for each email campaign activityformat_type
. - DONE — An email campaign activity that Constant Contact successfully sent to contacts. You can update email campaign activities when they are in
DONE
status if the email campaign activity usesformat_type
3
. - ERROR — An email campaign activity that encountered an error.
[CLICK] to view an example request...
The following example uses the scheduled send option.
curl --request POST \
--url https://api.cc.email/v3/emails/activities/%7Bcampaign_activity_id%7D/schedules \
--header 'content-type: application/json' \
--header 'Authorization: Bearer {access token}' \
--data '{"scheduled_date":"2024-08-24T14:15:22Z"}'
[CLICK] to view an example response...
[
{
"scheduled_date": "2019-08-24T14:15:22Z"
}
]
Learn more about scheduling email campaign activities
Monitoring & Analysis
[CLICK] for details...
Email campaigns and email campaign activities allow you to better manage and report on different kinds of email marketing.
For example, if you are using the email reporting unique opens endpoint to track performance, a resend
email campaign activity will return data on a resend to non-openers email. If you want to get data on your initial send, you can use the primary_email
email campaign activity. Both of these separate activities are associated with the same email campaign.
After sending an email campaign, use reporting endpoints to get detailed analytics on your campaign's performance, including:
- Open Rate: Percentage of recipients who opened your email.
- Click-Through Rate (CTR): Percentage of recipients who clicked a link in your email.
- Conversion Rate: (If tracked) Percentage of recipients who completed your desired action (e.g., made a purchase).
- Bounce Rate: Emails that couldn't be delivered.
- Unsubscribe Rate: How many people opted out.
- Spam Complaints: How many marked your email as spam.
- Optimize: Use the data from your reports to understand what worked and what didn't. This informs your strategy for future campaigns.
- A/B Testing: Constant Contact allows you to test different subject lines, content, or send times to see which performs best.
Learn more about email reporting
[]: