If you’re building a web app and need to add users to a Mailchimp audience programmatically, you can do it easily using PHP and the Mailchimp API.
In this post, I’ll show you how to add or update a subscriber, apply tags, and store merge fields like first name and last name.
Step 1: Set Up Your Mailchimp API Key
You can generate your API key from the Mailchimp dashboard:
- Go to Account → Extras → API Keys
- Create a new key and copy it
Example:
$apiKey = 'YOUR_API_KEY';
Step 2: Get Your Audience (List) ID
To find your audience ID:
- Navigate to Audience → Audience settings
- Copy the Audience ID
Example:
$listId = 'YOUR_LIST_ID';
Step 3: Identify Your Server Prefix
Your Mailchimp server prefix is visible in the Mailchimp dashboard URL.
Example:
https://us18.admin.mailchimp.com/...
So your server prefix would be:$server = 'us18';
Step 4: Prepare the Subscriber Data
Next, collect user data (usually from a form request) and define any tags you want to apply.
$email = $request->email; $tags = ['Tag 1']; // You can add multiple tags $data = [ 'email_address' => $email, 'merge_fields' => [ 'FNAME' => $request->fname, 'LNAME' => $request->lname, ], 'status_if_new' => 'subscribed', 'tags' => $tags ]; $jsonData = json_encode($data);
Step 5: Build the Mailchimp API URL
Mailchimp identifies list members using an MD5 hash of the lowercase email address.
$url = 'https://' . $server . '.api.mailchimp.com/3.0/lists/' . $listId . '/members/' . md5(strtolower($email));
Step 6: Send the PUT Request Using cURL
We’ll use a PUT request so the subscriber is created if new or updated if they already exist.
$ch = curl_init($url); curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode == 200) { echo "Subscriber added or updated successfully!"; } else { echo "Error: " . $response; }
Step 7: One Complete PHP Example
Below is the full working PHP example that adds or updates a subscriber in Mailchimp, applies tags, and saves merge fields like first and last name.
<?php // Mailchimp configuration $apiKey = 'YOUR_API_KEY'; // Mailchimp API key $listId = 'YOUR_LIST_ID'; // Audience ID $server = 'us18'; // Server prefix (e.g. us18) // Subscriber data (example from form request) $email = $request->email; $fname = $request->fname; $lname = $request->lname; // Tags $tags = ['Tag 1']; // Prepare data $data = [ 'email_address' => $email, 'merge_fields' => [ 'FNAME' => $fname, 'LNAME' => $lname, ], 'status_if_new' => 'subscribed', 'tags' => $tags ]; // Convert data to JSON $jsonData = json_encode($data); // Mailchimp API endpoint $url = 'https://' . $server . '.api.mailchimp.com/3.0/lists/' . $listId . '/members/' . md5(strtolower($email)); // Initialize cURL $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); // Execute request $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // Handle response if ($httpCode === 200) { echo "Subscriber added or updated successfully!"; } else { echo "Mailchimp API Error: " . $response; }
Notes
- PUT ensures the subscriber is created if they don’t exist, or updated if they do.
- Tags help segment users for campaigns and automations.
- merge_fields allow you to store additional user data like first and last names.
Conclusion
With just a few lines of PHP, you can integrate Mailchimp subscriptions into your web app, manage audience tags, and keep subscriber data organized automatically. This approach works perfectly for partners, customers, and any segmented email campaigns.
Top comments (0)