Skip to content
Advertisement

Push data to Campaign Monitor using Python

Campaign Monitor is a service where we can send emails to a set of subscribers. We can create multiple lists within Campaign Monitor and add the required users to these lists as subscribers(to whom we can send personalised emails). So, here I am trying to send a set of customers’ details like their name, emails, total_bookings, and first_booking to the campaign monitor’s list using the API in Python so that I can send emails to this set of users. More details on campaign monitor: https://www.campaignmonitor.com/api/v3-3/subscribers/

I am new to using Campaign Monitor. I have searched documentation, a lot of posts and blogs for examples on how to push data with multiple custom fields to Campaign Monitor using Python. By default, a list in Campaign Monitor will have a name and an email that can be added, but I want to add other details for each subscriber(here I want to add total_bookings and first_booking data) and Campaign Monitor provides custom fields to achieve this.

For instance:

I have my data stored in a redshift table named customer_details with the fields name, email, total_bookings, first_booking. I was able to retrieve this data from redshift table using Python with the following code.

# Get the data from the above table:
cursor = connection.cursor()
cursor.execute("select * from customer_details")

creator_details = cursor.fetchall()
# Now I have the data as a list of sets in creator_details

Now I want to push this data to a list in the Campaign Monitor using API like request.put('https://api.createsend.com/api/../.../..'). But I am not sure on how to do this. Can someone please help me here.

Advertisement

Answer

400 indicated invalid parameters

we can first see the request is POST not PUT

so first change requests.put to requests.post

the next thing is that all the variables need to be sent either as www-formdata or as json body data not sure which

and lastly you almost certainly cannot verify with basic auth … but maybe

something like the following

some_variables = some_values
...
header = {"Authorization": f"Bearer {MY_API_KEY}"}
data = {"email":customer_email,"CustomFields":[{"key":"total_bookings","value":customer_details2}]}
url = f'https://api.createsend.com/api/v3.3/subscribers/{my_list_id}.json'
res = requests.post(url,json=data,headers=header)
print(res.status_code)
try:
   print(res.json())
except:
   print(res.content)

after looking more into the API docs it looks like this is the expected request

{
    "EmailAddress": "subscriber@example.com",
    "Name": "New Subscriber",
    "MobileNumber": "+5012398752",
    "CustomFields": [
        {
            "Key": "website",
            "Value": "http://example.com"
        },
        {
            "Key": "interests",
            "Value": "magic"
        },
        {
            "Key": "interests",
            "Value": "romantic walks"
        }
    ],
    "Resubscribe": true,
    "RestartSubscriptionBasedAutoresponders": true,
    "ConsentToTrack":"Yes"
}

which we can see has "EmailAddress" not "email" so you would need to do

data = {"EmailAddress":customer_email,"CustomFields":[{"key":"total_bookings","value":customer_details2}]}

Im not sure if all of the fields are required or not … so you may also need to provide "Name","MobileNumber",Resubscribe",etc

and looking at “Getting Started” it looks like the publish a python package to make interfacing simpler

http://campaignmonitor.github.io/createsend-python/

which makes it as easy as

import createsend
cli = createsend.CreateSend({"api_key":MY_API_KEY})
cli.subscriber.add(list_id,"user@email.com","John Doe",custom_fields,True,"No")

(which I found here https://github.com/campaignmonitor/createsend-python/blob/master/test/test_subscriber.py#L70)

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement