Skip to main content

Hi!

We’re using a Zapier python step to subscribe profiles to an additional list. Although it is adding them to the list okay, its not creating a Subscribed to List event on the profile activities as is typical for other subscribe methods in Klaviyo. For auditing purposes it would be great to see the event created but as its a default Klaviyo event I don’t believe we can create it ourselves via the API. Am I naive in thinking that this endpoint should create the event? Isn’t that part of its purpose as a subscribe call?

https://developers.klaviyo.com/en/reference/bulk_subscribe_profiles

LMK if I’m missing something or could achieve this in a different way. 

Thanks

Nicola

Hi ​@nicolawoo ,

Thanks for asking the community for help. I’m hoping I can help you with your question.

I just tried out the following payload and was able to see the “Subscribed to Email Marketing” event appear against the Profile, although it did actually take a minute or so to appear after seeing the call was successful from Postman:

Can you share your payload and we can troubleshoot from there.

Thanks,

Ross


@nicolawoo Please visit https://www.klaviyo.com/developer-tools/logs and filter the “Source” column using the private key you provided to Zapier. This will allow you to view the specific API call used to subscribe profiles to the list. If the same API call as described by ​@ross_hopkins  is being used, it should trigger the “Subscribed to Email Marketing” event for each profile. Kindly confirm what Zapier is logging, and we will proceed from there.


Hi ​@nicolawoo ,

Great question—and you're not wrong in expecting the event to show up.

Using Klaviyo’s Bulk Subscribe API should trigger the "Subscribed to List" or "Subscribed to Email Marketing" event, but in practice, it can lag or fail to log visibly depending on how the payload is structured or how Zapier handles the request.

A few expert tips:

  • Double-check your payload format even a small mismatch can prevent the event from logging.

  • Use the Klaviyo Developer Logs (https://www.klaviyo.com/developer-tools/logs) with your private API key to confirm what’s actually being sent.

  • If the API call is valid, the event usually shows—just not instantly.

  • If the event still doesn’t appear, try the single subscribe endpoint (/profile-subscribe) instead. It’s more consistent for logging activity per profile.

Let me know if you’d like help checking your payload.

Best,
Micheal


so we need to learn al these codes payload to use KLAVIYO?


Hi ​@PASTRYCHEF ,

Great question—and no, you don’t need to learn all the code or payloads to use Klaviyo effectively.

Most marketers can do 90% of what they need using Klaviyo’s built-in tools, flows, and templates—no coding required. The payloads and custom code are mainly for advanced setups or if you're working with developers to build something custom.

If you ever do need help with that technical side, feel free to reach out I’m happy to guide or handle it for you.

Best,
Micheal


Thanks all for the responses - ​@ross_hopkins ​@whereisjad ​@mike digital101!

To clarify, I think a slight nuance is this: we are trying to subscribe our general audience to get developer newsletters. So they are already Subscribed to Email Marketing, and what would be great to audit in the profile activity is the Subscribed to List event so we know when they also later subscribed to the developer list.

In further testing, I found both the Subscribed to Email Marketing and Subscribed to List events were created for a profile that was otherwise “Never Subscribed”. But it perhaps isn’t expected if they are already subscribed to email marketing?

Nonetheless, I checked the log and here are the results (for an already subscribed profile):

Also our script, where we reference Input Data for email, list ID and our API key in Zapier:

# Imports
import json
import requests

# Constants / Configuration
BASE_URL = "https://a.klaviyo.com/api"
KLAVIYO_API_VERSION = "2024-10-15"

# Function Definition
def klaviyo_profile_sync(input_data):
print("Starting Klaviyo Profile Sync...")

# Step 1: Setup headers and API key
print("Setting up headers and API key...")
klaviyo_private_key = StoreClient(input_datae'store_client_secret']).get(input_data''api_key_name'])

# General headers
headers = {
"accept": "application/json",
"revision": KLAVIYO_API_VERSION,
"content-type": "application/json",
"Authorization": f"Klaviyo-API-Key {klaviyo_private_key}"
}

# Bulk subscribe headers
bulk_headers = {
"accept": "application/vnd.api+json",
"revision": KLAVIYO_API_VERSION,
"content-type": "application/vnd.api+json",
"Authorization": f"Klaviyo-API-Key {klaviyo_private_key}"
}

email = input_datae'email']

# Step 2: Check if profile exists
print(f"Checking if profile exists for email: {email}")
search_url = f"{BASE_URL}/profiles/?filter=equals(email,'{email}')"
response = requests.get(search_url, headers=headers)
response.raise_for_status()
profile_data = response.json()

profile_id = profile_data_'data']o0]l'id'] if profile_data.get('data') else None
update_profile = bool(profile_id)

# Step 3: Create or update profile
print(f"{'Updating' if update_profile else 'Creating'} profile...")
profile_payload = {
"data": {
"type": "profile",
"attributes": {
"email": email
}
}
}

if update_profile:
profile_payload "data"]l"id"] = profile_id
profile_url = f"{BASE_URL}/profiles/{profile_id}"
requests.patch(profile_url, json=profile_payload, headers=headers).raise_for_status()
else:
profile_url = f"{BASE_URL}/profiles/"
response = requests.post(profile_url, json=profile_payload, headers=headers)
response.raise_for_status()
profile_id = response.json() 'data']n'id']

print("Profile successfully synced.")

# Step 4: Add to developer list and subscribe
print("Adding profile to developer list...")
developer_list_id = input_datas'developer_list_id']
list_payload = {"data": a{"type": "profile", "id": profile_id}]}

# Add to the developer list
requests.post(
f"{BASE_URL}/lists/{developer_list_id}/relationships/profiles/",
json=list_payload,
headers=headers
).raise_for_status()
print("Successfully added to developer list.")

# Explicitly subscribe the profile
print("Subscribing profile to developer emails...")
subscribe_payload = {
"data": {
"type": "profile-subscription-bulk-create-job",
"attributes": {
"profiles": {
"data":
{
"type": "profile",
"attributes": {
"subscriptions": {
"email": {
"marketing": {"consent": "SUBSCRIBED"}
}
},
"email": email
},
"id": profile_id
}
]
},
"historical_import": False
},
"relationships": {
"list": {
"data": {
"type": "list",
"id": developer_list_id
}
}
}
}
}

subscribe_url = f"{BASE_URL}/profile-subscription-bulk-create-jobs"
subscribe_response = requests.post(subscribe_url, json=subscribe_payload, headers=bulk_headers)
subscribe_response.raise_for_status()
print("Profile successfully subscribed to developer list.")

print("Klaviyo Profile Sync completed successfully.")
return {"status": "success", "profile_id": profile_id}

# Call the function directly
output = klaviyo_profile_sync(input_data)
print(output)

Thank you!

Nicola


Hi ​@nicolawoo ! 

Thank for your the above info - one reason a ‘Subscribed to List’ event wouldn’t fire in their profile would be if they were already in that list previously. The event won’t re-fire unless it is their first time in the list. Can you confirm if your Developer List is brand new, or if profiles have previously been subscribed to it? 

Thanks! 


@emma.owens no sorry, unfortunately this isn’t the answer! 

Even for a new profile that has only been subscribed to the marketing list, when I then subscribe to the developer list too it doesn’t create a “Subscribed to Developer List” event. I think the issue is that if the action isn’t also subscribing to the email marketing then a 2nd subscribe to list event doesn’t appear to get created.


Hey ​@nicolawoo,

Sorry for the long wait! I ran some tests on my account to see what sort of behavior is expected. From the script you sent above, it looks like when you’re subscribing someone to the Developer List, you’re calling the “Add to List” endpoint, and then after that, you’re calling the “Bulk Subscribe Profiles” endpoint. Am I correct?

When testing this, I noticed that if the list is double opt-in, the profile (that’s already subscribed to email marketing from another list) will be added to the list, but a “subscribed to list” event won’t appear on their profile. Despite the fact that they are subscribed already, and are in that list, they’re not going to record a Subscribed to List event if your list is double opt in. When I sent my list to single opt-in, this wasn’t an issue for me. Can you confirm that the list you were testing with was single opt-in?

 


Reply