Automatically Sync Event Attendees to Mailchimp
What this Zap does
When your event ends in CE-Go, this Zap automatically adds all attendees to your Mailchimp email list—saving you hours of manual data entry and ensuring your marketing list is always up-to-date.
Perfect for:
- Event organizers who want to follow up with attendees
- Marketing teams building post-event campaigns
- Anyone who runs events and uses Mailchimp
Before you start
Make sure you have:
- A CE-Go account with at least one event
- A Mailchimp account (free or paid)
- A Mailchimp Audience (list) where you want to add attendees
- Your Mailchimp Audience ID and Server prefix (we'll show you how to find these)
⏱️ Time to set up: About 20-25 minutes
Step 1: Set Up the Trigger - When Event Ends
This tells Zapier to automatically start the workflow when an event ends in CE-Go.
- Click Create Zap in Zapier

- In the trigger step, search for CE-Go and select it

- Click Continue

- Connect your CE-Go account (if not already connected)
- Click Continue
- Click Test trigger to load a sample event

You'll see sample data like:
- Event ID: 1234
- Event Name: Summer Workshop 2026
- Total Users: 560
- Event End Date: 2026-01-19T18:00:00Z
- Click Continue with selected record
💡 Tip: Rename this step to "When Event Ends" by clicking the pencil icon. This makes your workflow easier to understand!
Step 2: Configure Mailchimp Settings
This step tells the Zap which Mailchimp list to use and prepares the data for syncing.
- Click the To continue, choose an event or + button to add a new step
- Search for Code and select it
- Choose Javascript in Code select

- Copy and paste this code into the Code field:
// ============================================
// ⚙️ Don't change below
// ============================================
const listId = inputData.list_id; // Get from: Mailchimp → Audience → Settings
const server = inputData.server; // Check your Mailchimp URL (us15, us19, etc.)
const limitPerPage = 100;
const eventId = inputData.event_id;
const totalUsers = inputData.total_users;
const totalPages = Math.ceil(totalUsers / limitPerPage);
const mailchimpApiUrl = `https://${server}.api.mailchimp.com/3.0/batches`;
const pages = [];
for (let i = 1; i <= totalPages; i++) {
pages.push(i);
}
return {
event_id: eventId,
total_users: totalUsers,
limit: limitPerPage,
pages: pages,
total_pages: totalPages,
list_id: listId,
server: server,
mailchimp_api_url: mailchimpApiUrl
};
After adding the code, you need to set up Input Data fields. These tell the code where to get information from.
- In the Input Data section (left side), click + Add value set
- Add these 4 fields:
| Field Name | Value | Where to get it |
|---|---|---|
list_id |
Your Mailchimp Audience ID | Type manually (e.g., de75ae35a2). Get from: Mailchimp → Audience → Settings |
server |
Your Mailchimp server prefix | Type manually (e.g., us15). Check your Mailchimp URL (us15, us19, etc.) |
event_id |
Event ID from webhook | Select: 1. Event ID |
total_users |
Total users from webhook | Select: 1. Total Users |

⚠️ Critical: You MUST enter your own list_id and server values here! If you skip this, the automation won't work.
To select data from Step 1:
- Click in the
event_idvalue field - Click the + icon or start typing to see available data
- Under 1. When Event Ends, select Event ID
- Repeat for
total_users- select Total Users


Your Input Data should now look like this:
list_id=de75ae35a2(your value)server=us15(your value)event_id= 1. Event ID: 1234total_users= 1. Total Users: 560
- Click Run Code or Continue
💡 Tip: Rename this step to "Setup Configuration" by clicking the pencil icon. This makes your workflow easier to understand!
Step 3: Check if Users Exist
This filter ensures the Zap only continues if there are actually users to sync. If the event has zero attendees, the Zap will stop here (saving you from unnecessary steps).
- Click the + button to add a new step
- Search for Filter
- Click Filter (it's a built-in tool, no account needed)
- Click Continue

Set up the filter condition
- In the Only continue if... section, click the first dropdown
- Select 2. Total Users (from the Mailchimp Settings step)
- In the second dropdown, select (Number) Greater than
- In the value field, type 0

Your filter should read: Only continue if 2. Total Users (Number) Greater than 0
- Click Continue
- Click Continue
Success! If you see "Your Zap would have continued", the filter is working correctly. The test event has 560 users, so it passes the check.
💡 Tip: Rename this step to "Check if Users Exist" for clarity!
Step 4: Loop Users Page by Page
Instead of trying to sync all users at once (which could fail with large events), this step processes users in small batches.
- Click the + button to add a new step
- Search for Looping
- Click Looping
- Click Continue

⚠️ Note: Looping by Zapier is currently in Beta, but it's stable and works great for this use case!
Configure the Loop
- In the Action Event field, click Create Loop From Line Items and click Continue
- In the Values to Loop field write pages, and in the next field click to insert data
- Select 2. Pages (this is the array of page numbers we created earlier in step)

- Set Trim Whitespace to True
- Set Loop iteration counter start to 1
- Set Maximum number of Loop iterations to 100

What does this do? If your event has 560 users and you're processing 5 at a time, this creates 112 "loops" (560 ÷ 5 = 112). Each loop will run through Steps 5-9 to sync one batch of users.
- Click Continue and Test Step
💡 Tip: Rename this step to "Loop Users Page by Page"
⚠️ Important: The next steps (5-9) will run INSIDE this loop. That means they'll execute multiple times - once for each page of users!
Step 5: Get Event Users
Now we're inside the loop! This step fetches one page (batch) of users from your CE-Go event. It will run multiple times - once for each page.
- Click the + button to add a new step
- Search for CE-Go
- Choose the Get Event Users action
- Click Continue

- Click Continue
Configure Event Users Settings
Now fill in these fields:
| Field | Value | How to set it |
|---|---|---|
| Event ID | Event ID from webhook | Select 2. Event Id |
| Limit | How many users per page | Select 2. Limit Per Page |
| Page | Current page number | Select 4. Loop Iteration |
| Status | Leave blank | Don't select anything |
| Evaluation | Leave blank | Don't select anything |
| Registration Date From | Leave blank | Don't enter anything |
| Registration Date To | Leave blank | Don't enter anything |
| Successful if no search results are found? | False (Default) | Leave as default |
| If multiple search results are found | Return all users | Select Return all results as line items. Step run status is “success”. |

What's happening here? On the first loop, this gets page 1 (users from page 1). On the second loop, page 2 (users from page 2). And so on until all users are fetched!
- Click Continue
- Click Test step

- Click Continue
💡 Tip: Rename this step to "Get Event Users"
Step 6: Skip if No Users on Page
This filter prevents errors by checking if the current page actually has users. Sometimes the last page might be empty, and this filter ensures we don't try to sync nothing to Mailchimp.
- Click the + button to add a new step
- Search for Filter
- Click Filter
- Click Continue

Set up the filter condition
- In the Only continue if... section, click the first dropdown
- Select 5. Count (this is the number of users returned from CE-Go)
- In the second dropdown, select (Number) Greater than
- In the value field, type 0

Your filter should read: Only continue if 5. Count (Number) Greater than 0
- Click Continue
- Click Continue
Success! The test shows Count: 11, so the filter passes. If a page had 0 users, this loop iteration would skip the remaining steps.
💡 Tip: Rename this step to "Skip if No Users on Page"
Step 7: Prepare Mailchimp Batch
This is where we transform your CE-Go user data into a format that Mailchimp can understand. Think of it as translating from one language to another!
- Click the + button to add a new step
- Search for Code
- Choose in Select Code option Javascript
Configure Input Data
- In the Input Data section, add these 4 fields:
| Field Name | Value to Select |
|---|---|
list_id |
2. List Id |
url |
2. Mailchimp Api Url |
data |
5. Step(Row) Output |
loop_iteration |
4. Loop Iteration |

Add the Code
- In the Code field, paste this entire code:
const crypto = require("crypto");
// Get Mailchimp settings
const listId = inputData.list_id;
const url = inputData.url;
try {
const data = JSON.parse(inputData.data);
const users = data.results;
// Create batch operations for Mailchimp
const operations = users.map(user => {
const email = user.email.toLowerCase().trim();
// Mailchimp requires MD5 hash of email for member ID
const hash = crypto
.createHash("md5")
.update(email)
.digest("hex");
return {
method: "PUT",
path: `/lists/${listId}/members/${hash}`,
body: JSON.stringify({
email_address: email,
status_if_new: "subscribed",
merge_fields: {
FNAME: user.first_name || "",
LNAME: user.last_name || ""
}
}),
operation_id: user.email
};
})
.slice(0, 500); // Mailchimp batch limit
return {
body: JSON.stringify({ operations }),
url: url,
operations_count: operations.length,
page_number: inputData.loop_iteration
};
} catch(e) {
return {
error: true,
error_title: "Failed to Prepare Batch",
page_number: inputData.loop_iteration || 1,
message: e.message
}
}
What does this code do?
- Takes the users from CE-Go
- Converts each email to an MD5 hash (Mailchimp requirement)
- Creates a "batch operation" for each user with their email, first name, and last name
- Packages everything into a format Mailchimp can process
- Limits to 500 users per batch (Mailchimp's maximum)
- Click Run Code
- Click Continue
You should see output like:
- Body: JSON string with operations
- Url: https://us15.api.mailchimp.com/3.0/batches
- Operations Count: 11 (or however many users on this page)
- Page Number: 1
💡 Tip: Rename this step to "Prepare Mailchimp Batch"
Step 8: Create Mailchimp Batch
Now we're ready to send the prepared data to Mailchimp! This step creates a "batch job" in Mailchimp that will process all the users in the background.
- Click the + button to add a new step
- Search for Mailchimp
- Choose API Request (Beta) action
- Click Continue

- Connect your Mailchimp account (if not already connected)
- Click Continue
Configure the API Request
| Field | Value | How to set it |
|---|---|---|
| Stop on error | Yes | Select Yes |
| HTTP Method | POST | Select POST |
| URL | Mailchimp API URL | Select 7. Url |
| Query string parameters | Leave empty | Don't add anything |
| Additional request headers | Leave empty | Don't add anything |
| Body | Prepared batch data | Select 7. Body |

Why don't we need to add headers? Mailchimp automatically adds the Authorization header using your connected account. That's the magic of using Zapier's native Mailchimp integration!
- Click Continue
- Click Test step
You should see a successful response with:
- Id: nfare81jim (a unique batch ID)
- Status: pending (Mailchimp is queuing the batch)
- Total Operations: 0 (this updates later as Mailchimp processes)
- Submitted At: timestamp when batch was created
Success! Your batch has been created in Mailchimp. Mailchimp will process it in the background (usually takes 15-30 minutes depending on the size).
- Click Continue
💡 Tip: Rename this step to "Create Mailchimp Batch"
Step 9: Validate Batch Response
This final check ensures that Mailchimp actually created the batch successfully. It's like getting a confirmation receipt after placing an order - you want to make sure it went through!
- Click the + button to add a new step
- Search for Code
- Choose Javascript
Configure Input Data
- In the Input Data section, add these 3 fields:
| Field Name | Value to Select |
|---|---|
mailchimp_response |
8. Response Body |
operations_count |
7. Operations Count |
page_number |
7. Page Number |

Add the Code
- In the Code field, paste this entire code:
// Parse Mailchimp response from Step 8
const response = JSON.parse(inputData.mailchimp_response);
try {
// Check if response exists
if (!response) {
return {
error: true,
error_title: "No Response from Mailchimp",
message: "Mailchimp API did not return a response",
page_number: inputData.page_number
};
}
// Check if batch ID exists
if (!response.id) {
return {
error: true,
error_title: "Batch ID Missing",
message: "Mailchimp response has no batch ID",
response_status: response.status || 'unknown',
page_number: inputData.page_number
};
}
// Verify batch status is valid
const validStatuses = ['pending', 'started', 'preprocessing', 'finished'];
if (!validStatuses.includes(response.status)) {
return {
error: true,
error_title: "Invalid Batch Status",
message: `Unexpected status: ${response.status}`,
batch_id: response.id,
page_number: inputData.page_number
};
}
// Success - batch created successfully
return {
error: false,
batch_id: response.id,
batch_status: response.status,
operations_sent: inputData.operations_count,
page_number: inputData.page_number,
submitted_at: response.submitted_at
};
} catch (error) {
return {
error: true,
error_title: "Failed to Validate Mailchimp Response",
message: error.message,
page_number: inputData.page_number
};
}
What does this code do?
- Checks if Mailchimp sent back a response
- Verifies that a batch ID was created
- Confirms the batch status is valid (pending, started, or finished)
- Returns an error if anything is wrong, or success data if everything is good
- Click Run Code
- Click Test step
You should see output like:
- Error: false (no errors!)
- Batch Id: nfare81jim
- Batch Status: pending
- Operations Sent: 11
- Page Number: 1
Perfect! The batch was validated successfully. Mailchimp has accepted your batch and will process it shortly.
💡 Tip: Rename this step to "Validate Batch Response"
⚠️ Almost done! Steps 5-9 will now repeat for each page of users. Once all pages are processed, the loop ends and we're done! The next step will only run after the entire loop completes.
🎉 You're Done! Publish Your Zap
Congratulations! You've built a complete automation workflow. Here's what your final Zap should look like:

Your workflow should have these 9 steps:
- When Event Ends - CE-Go trigger
- Mailchimp Settings - Code by Zapier
- Check if Users Exist - Filter by Zapier
- Loop Users Page by Page - Looping by Zapier
- Get Event Users - CE-Go action
- Skip if No Users on Page - Filter by Zapier
- Prepare Mailchimp Batch - Code by Zapier
- Create Mailchimp Batch - Mailchimp API Request
- Validate Batch Response - Code by Zapier
Publish Your Zap
- Review all your steps to make sure everything is configured correctly
- Double-check that you entered your Mailchimp Audience ID and Server in Step 2
- At the top right of the screen, click the Publish button

- Your Zap is now live!
Success! Your Zap is now running. From now on, whenever an event ends in CE-Go, all attendees will automatically be synced to your Mailchimp list!
💡 Tips & Troubleshooting
How do I check if it worked?
After your event ends:
- Go to Zapier → Zap History
- Look for runs of your "Sync Event Attendees" Zap
- Check that all steps show green checkmarks ✅
- In Mailchimp, go to your Audience → All contacts
- Search for a few attendee emails to verify they were added
What if I see errors in Zap History?
Common issues and fixes:
| Error | Solution |
|---|---|
| "Batch ID Missing" | Check your Mailchimp connection is still active. Try reconnecting your Mailchimp account. |
| "Invalid Audience ID" | Double-check the list_id in Step 2. Make sure it matches your Mailchimp Audience ID exactly. |
| "Server not found" | Verify the server value in Step 2 matches your Mailchimp URL (us15, us19, etc.) |
| "No users found" | The event might not have any registered users. This is normal and the Zap will stop safely. |
How do I sync users to a different Mailchimp list?
- Go to your Zap and click Edit
- Open Step 2: Mailchimp Settings
- Update the
list_idInput Data field with your new Audience ID - Click Save and test the Zap
- Click Publish to activate the changes
Need Help?
If you run into any issues or have questions:
- 📧 Contact CE-Go support
- 📚 Check Zapier's help docs: help.zapier.com
Happy automating! 🎉
You've just saved yourself hours of manual work. Enjoy the extra time!