
MailChimp Batch Operation: We can use the MailChimp API’s batch operation to complete multiple operations in a single call. Consider the case where you need to subscribe and unsubscribe to records. You must make a separate call in the simple API call to make the single record to subscribe and unsubscribe in the MailChimp list, which may exceed your API call-out limit. The batch operation runs in the background on the MailChimp server, performing multiple actions in a single API call. We can check the batch status after the callout.
Scenario: On Contact records, there is an ‘Email Opt Out’ field that is updated whenever the user unchecks subscribe to the record in the MailChimp list and vice versa.
MCSubscribeUnsubscribeTrg
/* Name:MCSubscribeUnsubscribeTrg | |
* Description: On contact record insert/update subscribe/unsubscribe member in Mailchimp list. | |
* Created Date: 05/05/2019 | |
* Last ModifiedDate : 05/05/2019 | |
* Created By: Arun Kumar | |
*/ | |
trigger MCSubscribeUnsubscribeTrg on Contact (after insert, after update) { | |
if(trigger.isAfter && trigger.isUpdate){ | |
system.debug('Contact Email has Opted Out: '); | |
set<string> contactEmailSet=new set<string>(); | |
for(contact co:trigger.new){ | |
if(co.HasOptedOutOfEmail==true && co.email!=null){ | |
contactEmailSet.add(co.email+'|false'); | |
} | |
if(co.HasOptedOutOfEmail==false && co.email!=null){ | |
contactEmailSet.add(co.email+'|true'); | |
} | |
} | |
system.debug('Contact Email has Opted Out: '+contactEmailSet); | |
if(contactEmailSet.size()>0){ | |
if (System.isFuture() || System.isBatch()){ // If Trigger initiated through future and Batch Process, | |
} | |
else{ | |
MCSubscribeUnsubscribeHelper.doSubscribeUnsubscribe(contactEmailSet); | |
} | |
} | |
} | |
} |
MCSubscribeUnsubscribeHelper
public class MCSubscribeUnsubscribeHelper { | |
@future(callout=true) // make callout in future method | |
//Future mehtod called by trigger to subscribe/unsubscribe the member from mailchimp list. | |
public static void doSubscribeUnsubscribe(Set<string> conEmail){ // | |
//Get member ids in MD5 format | |
map<string,string> emailMemberIdMap=new map<string,string>(); | |
map<string,boolean> emailBolMap = new map<string,boolean>(); | |
for(string str:conEmail){ // iterate over set of email ids. | |
String emailStr = str.substringBefore('|'); | |
//email into blob | |
Blob targetBlob = Blob.valueOf(emailStr); | |
Blob hash = Crypto.generateDigest('MD5', targetBlob); | |
String requestSignature = EncodingUtil.convertToHex(hash); | |
system.debug('MD5 '+requestSignature); | |
Boolean bool = Boolean.valueOf(str.substringAfter('|')); | |
emailBolMap.put(emailStr, bool); | |
emailMemberIdMap.put(emailStr,requestSignature); | |
} | |
string api_Key = 'ee6c451ec8c6057034568e7435dbxxxx-usxx'; // put your actual Mailchimp API key | |
String mailChimpListId = 'f37ef2xxxx'; // put your Mailchimp list id | |
Http h = new Http(); | |
HttpRequest req = new HttpRequest(); | |
string endPointValue ='https://usxx.api.mailchimp.com/3.0/batches'; // replace usxx = your mailchimp datacenter name | |
req.setEndpoint(endPointValue); | |
req.setHeader('Authorization', 'apikey '+api_Key); | |
req.setHeader('content-type', 'application/json'); | |
//req.setHeader('X-HTTP-Method-Override','PATCH'); | |
req.setMethod('POST'); | |
string requestBody; | |
JSONGenerator gen = JSON.createGenerator(true); | |
gen.writeStartObject(); | |
gen.writeFieldName('operations'); | |
//Start Array | |
gen.writeStartArray(); | |
for(string str:emailMemberIdMap.keyset()){ | |
system.debug('Email: '+str); | |
system.debug('Member Id: '+emailMemberIdMap.get(str)); | |
//Start object | |
gen.writeStartObject(); | |
gen.writeStringField('method','PUT'); | |
gen.writeStringField('path','lists/'+mailChimpListId+'/members/'+emailMemberIdMap.get(str)); | |
string stringBody; | |
if(emailBolMap.get(str)==true){ | |
stringBody='{\"email_address\":\"'+str+'\",\"status\":\"subscribed\"}'; //JSON string for subscribe | |
}else{ | |
stringBody='{\"email_address\":\"'+str+'\",\"status\":\"unsubscribed\"}'; //JSON string for unsubscribe | |
} | |
gen.writeStringField('body',stringBody); | |
//End object | |
gen.writeEndObject(); | |
//end object | |
} | |
//End Array | |
gen.writeEndArray(); | |
//End Object | |
gen.writeEndObject(); | |
String jsonBody = gen.getAsString(); | |
system.debug('Json string: #### '+jsonBody ); | |
req.setBody(jsonBody); | |
HttpResponse res; | |
try{ | |
//send request | |
res = h.send(req); | |
} | |
catch(Exception e){ | |
system.debug('Exception has Occured !'+ e.getMessage()); | |
} | |
system.debug('response returned: '+res.getBody()); | |
} | |
} |
Happy Coding…
Reference:
https://developer.mailchimp.com/documentation/mailchimp/reference/batches/
https://developer.mailchimp.com/