Import Contacts in Bulk using Constant Contact Email Marketing API in ASP.NET (C# and VB.NET)

In this post I will show you how to use the Bulk Activities from the Constant Contact API to import contacts from your custom application to your Constant Contact Account.

First of all, I should note that I created this as a Console Application, however the same concept should work for a web app.

You need to have your API Key and Access Token in handy, you will need them to connect to the Constant Contact API. Once you have them I would suggest to add them to your web.config or app.config, this way you don’t have to hard code them in your app.

In the code snippet below I am getting my data from a Database Access Layer class and passing it to the methods in a DataTable. The rest of the code should be pretty self explanatory.

C# Code

namespace ConstantContact {
    class Program {
        private static string _apiKey = ConfigurationManager.AppSettings["APIKey"].ToString();
        private static string _accessToken = ConfigurationManager.AppSettings["AccessToken"].ToString();
        private static DatabaseAccessLayer _dal = new DatabaseAccessLayer();
        private static IUserServiceContext _userServiceContext = new UserServiceContext(_accessToken, _apiKey);
        private static ConstantContactFactory _constantContactFactory = new ConstantContactFactory(_userServiceContext);

        static void Main(string[] args) {
            List<string> lists = new List<string>() { "1479986508" };

            DataTable dt = _dal.GetAllContacts();
            bulkCreateUpdate(dt, lists);

        private static void bulkCreateUpdate(DataTable dt, List<string> lists) {
            List<AddContactsImportData> bulkContacts = new List<AddContactsImportData>();
            var activityService = _constantContactFactory.CreateActivityService();

            foreach (DataRow row in dt.Rows) {
                Address address = new Address() {
                    Line1 = toString(row["address"]),
                    City = toString(row["city"]),
                    AddressType = "PERSONAL",
                    StateCode = toString(row["state"]),
                    PostalCode = toString(row["zip"])

                CustomField cfield = new CustomField() {
                    Name = "CUSTOM FIELD 1",
                    Value = toString(row["schoolname"])

                AddContactsImportData singleContact = new AddContactsImportData() {
                    EmailAddresses = new List<string> { toString(row["primaryemail"]) },
                    FirstName = toString(row["firstname"]),
                    LastName = toString(row["lastname"]),
                    BirthdayDay = toString(row["dob"]).Split('-')[1],
                    BirthdayMonth = toString(row["dob"]).Split('-')[0],
                    JobTitle = toString(row["job_role_name"]),
                    CompanyName = toString(row["districtname"]),
                    HomePhone = toString(row["primaryphone"]),
                    Addresses = new List<Address> { address },
                    CustomFields = new List<CustomField> { cfield }

            List<string> columnNames = new List<string>() {
                "FIRST NAME",
                "LAST NAME",
                "JOB TITLE",
                "COMPANY NAME",
                "HOME PHONE",
                "ADDRESS LINE 1",
                "ZIP/POSTAL CODE",
                "CUSTOM FIELD 1"

            var addContacts = new AddContacts(bulkContacts, lists, columnNames);
            var activity = activityService.CreateAddContactsActivity(addContacts);

        #region Helper Methods
        private static string toString(Object obj) {
            return Convert.ToString(obj).Trim();


Namespace ConstantContact
	Class Program
		Private Shared _apiKey As String = ConfigurationManager.AppSettings("APIKey").ToString()
		Private Shared _accessToken As String = ConfigurationManager.AppSettings("AccessToken").ToString()
		Private Shared _dal As New DatabaseAccessLayer()
		Private Shared _userServiceContext As IUserServiceContext = New UserServiceContext(_accessToken, _apiKey)
		Private Shared _constantContactFactory As New ConstantContactFactory(_userServiceContext)

		Private Shared Sub Main(args As String())
			Dim lists As New List(Of String)() From { _
				"1479986508" _

			Dim dt As DataTable = _dal.GetAllContacts()
			bulkCreateUpdate(dt, lists)
		End Sub

		Private Shared Sub bulkCreateUpdate(dt As DataTable, lists As List(Of String))
			Dim bulkContacts As New List(Of AddContactsImportData)()
			Dim activityService = _constantContactFactory.CreateActivityService()

			For Each row As DataRow In dt.Rows
				Dim address As New Address() With { _
					Key .Line1 = toString(row("address")), _
					Key .City = toString(row("city")), _
					Key .AddressType = "PERSONAL", _
					Key .StateCode = toString(row("state")), _
					Key .PostalCode = toString(row("zip")) _

				Dim cfield As New CustomField() With { _
					Key .Name = "CUSTOM FIELD 1", _
					Key .Value = toString(row("schoolname")) _

				Dim singleContact As New AddContactsImportData() With { _
					Key .EmailAddresses = New List(Of String)() From { _
						toString(row("primaryemail")) _
					}, _
					Key .FirstName = toString(row("firstname")), _
					Key .LastName = toString(row("lastname")), _
					Key .BirthdayDay = toString(row("dob")).Split("-"C)(1), _
					Key .BirthdayMonth = toString(row("dob")).Split("-"C)(0), _
					Key .JobTitle = toString(row("job_role_name")), _
					Key .CompanyName = toString(row("districtname")), _
					Key .HomePhone = toString(row("primaryphone")), _
					Key .Addresses = New List(Of Address)() From { _
						address _
					}, _
					Key .CustomFields = New List(Of CustomField)() From { _
						cfield _
					} _


			Dim columnNames As New List(Of String)() From { _
				"EMAIL", _
				"FIRST NAME", _
				"LAST NAME", _
				"JOB TITLE", _
				"HOME PHONE", _
				"ADDRESS LINE 1", _
				"CITY", _
				"STATE", _
				"CUSTOM FIELD 1" _

			Dim addContacts = New AddContacts(bulkContacts, lists, columnNames)
			Dim activity = activityService.CreateAddContactsActivity(addContacts)
		End Sub

		#Region "Helper Methods"
		Private Shared Overloads Function toString(obj As [Object]) As String
			Return Convert.ToString(obj).Trim()
		End Function
		#End Region
	End Class
End Namespace

If you do not have custom fields you do not have to create the columnNames list and just pass a null to the AddContacts method.

Bulk Activities documentation in Constant Contact.


Esau Silva
Software Engineer at Region One ESC
Full Stack Software Engineer working with Microsoft technologies, ReactJS is awesome and avid Brazilian Jiu-Jitsu practitioner
If you enjoyed this post, please consider leaving a comment or subscribing to the RSS feed.