aminvincent
aminvincent

Reputation: 603

Your Campaign is not ready to send in mailchimp api v3 using C#

I created code to send campaign immediately by consuming mailchimp api v3.0 using C# console. When i tried in free account everything goes well, but when i upgrade my account in premium i got this problem (only add 2 members).

My scenario:

  1. create audience => success
  2. add member subscriber into audience that i created => success
  3. create campaign with specific template => success
  4. send cehcklist in campaign already created => return is_ready false
  5. send campaign => return Your Campaign is not ready to send

When I try to run my console program using console c# consume mailchimp api I got this error:

Type: http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/
Title: Bad Request
Status: 400
Detail: Your Campaign is not ready to send.
instance: 214b85f4-a288-44e7-b890-35925d8601ac

When I checked campaign into mailchimp website portal, I saw a message like this:

To send, you need at least 1 subscriber in your list.

This means that there is no recipients in my campaign, here is detail screenshot:

enter image description here

Please has anyone ever faced this, too? I really appreciate any suggestions.

Is there any way to resolve that issue before sending campaign? Because when I checked mailchimp portal (based on screenshot shown above), I back into campaign list then open my campaign above the problem automatically resolve, this is my confusing one.

Because mailchimp api v3.0 has limitation only 500 members subscriber on one call, finally I created class to partition my list:

//partition list of members more than 500 
public static class Extensions
{
    public static List<List<T>> SplitPartition<T>(this IEnumerable<T> collection, int size)
    {
        var chunks = new List<List<T>>();
        var count = 0;
        var temp = new List<T>();

        foreach (var element in collection)
        {
            if (count++ == size)
            {
                chunks.Add(temp);
                temp = new List<T>();
                count = 1;
            }
            temp.Add(element);
        }
        chunks.Add(temp);

        return chunks;
    }
}

this my main code using several scenario to handle single method can call in many way:

public class MailChimpProcessor
{
    static MailChimpProcessor()
    {
        //initialize 
        ApiHelper.InitializeClient(baseUrl, apiKey);
    }
    public class MailChimpResponse
    {
        public string result { get; set; }
        public GlobalErrorResponseModel error { get; set; }
    }

    public static MailChimpResponse MailChimpSendCampaign(SendEmailCampaignModel model)
    {
        MailChimpResponse mailchimpResult = new MailChimpResponse();

        #region PROPERTY OBJECT AUDIENCE
        Contact contact = new Contact()
        {
            company = model.audience_company,
            address1 = model.audience_address1,
            address2 = model.address2Config,
            city = model.audience_city,
            state = model.audience_state,
            zip = model.audience_zip,
            country = model.audience_country,
            phone = model.phoneConfig
        };

        CampaignDefaults campaign = new CampaignDefaults()
        {
            from_name = model.campaign_from_name,
            from_email = model.campaign_reply_to,
            subject = model.campaign_subject,
            language = "en"
        };

        AudienceRequestModel audienceModel = new AudienceRequestModel();
        audienceModel.name = model.audience_name;
        audienceModel.contact = contact;
        audienceModel.permission_reminder = permissionReminderConfig;
        audienceModel.use_archive_bar = true;
        audienceModel.campaign_defaults = campaign;
        audienceModel.notify_on_subscribe = "";
        audienceModel.notify_on_unsubscribe = "";
        audienceModel.email_type_option = true;
        #endregion

        #region PROPERTY OBJECT MEMBER
        List<Member> members = new List<Member>();
        //prevent duplicate email_address
        var queryMemberList = model.members.GroupBy(x => x.email_address).Select(x => x.First());
        foreach (var item in queryMemberList)
        {
            members.Add(new Member
            {
                email_address = item.email_address.ToLower(),
                status = "subscribed",
                status_if_new = "subscribed",
                merge_fields = new MergeFields()
                {
                    FNAME = item.merge_fields.FNAME,
                    LNAME = item.merge_fields.LNAME
                }
            });
        }

        bool isUploadContact = false;
        int offset = 0;
        const int numberPerBatch = 500; // maximum member per execution.
        double LoopMax = Math.Ceiling(members.Count / (double)numberPerBatch);
        
        //partition array
        var PartitionMembers = members.SplitPartition(numberPerBatch);

        #endregion
        
        //create audience using post method
        var audienceResult = AudienceProcessor.PostAudienceAsync(audienceModel).Result;

        #region PROPERTY OBJECT CAMPAIGN
        Recipients recipient = new Recipients()
        {
            list_id = audienceResult.ResponseModel != null ? audienceResult.ResponseModel.id : "0"
        };

        Settings setting = new Settings()
        {
            subject_line = model.campaign_subject,
            title = model.campaign_title,
            reply_to = model.campaign_reply_to,
            from_name = model.campaign_from_name,
            template_id = model.campaign_template_id
        };

        CampaignRequestModel campaignModel = new CampaignRequestModel();
        campaignModel.recipients = recipient;
        campaignModel.type = "regular";
        campaignModel.settings = setting;
        #endregion

        if (audienceResult.ResponseModel != null)
        {
            MemberProcessor.MemberResponse memberResult = new MemberProcessor.MemberResponse();

            while (offset < LoopMax)
            {
                MemberRequestModel memberModel = new MemberRequestModel();
                memberModel.members = PartitionMembers[offset];//list based on index of array
                memberModel.update_existing = true;
                
                //post contact member
                memberResult = MemberProcessor.PostContatcAsync(memberModel, audienceResult.ResponseModel.id).Result;
                
                if (memberResult.ResponseModel != null)
                {
                    isUploadContact = true;
                }
                else
                {
                    isUploadContact = false;
                }

                offset++;   // increment
            }

            //create campaign
            if (isUploadContact)//belum tereksekusi
            {
                //sleep thread 20 seconds after upload subcriber members
                System.Threading.Thread.Sleep(20000); 
                
                //create campaign using post method
                var campaignResult = CampaignProcessor.PostCampaignAsync(campaignModel).Result;

                if (campaignResult.ResponseModel.id != null)
                {
                    #region USING ITERATION TO CHECK CAMPAIGN                  
                    CampaignProcessor.CampaignResponseCheckList campaignChecklist = new CampaignProcessor.CampaignResponseCheckList();

                    bool isReadySend = false;
                    int check = 0;
                    while (check <= 10) //maksimum 10 iteration
                    {
                        //check campaign using get method
                        campaignChecklist = CampaignProcessor.GetCheckListCampaign(campaignResult.ResponseModel.id).Result;

                        if (campaignChecklist.ResponseModel.is_ready == true) //when error model is not null
                        {
                            isReadySend = true;
                            break;
                        }
                        else
                        {
                            isReadySend = false;
                        }

                        System.Threading.Thread.Sleep(1000); // will puase every 1 second

                        check++;
                    }

                    if (isReadySend)
                    {
                        //sleep action before send campaign
                        System.Threading.Thread.Sleep(2000);
                        
                        //send campaign
                        var sendCampaignResult = CampaignProcessor.SendCampaignAsync(campaignResult.ResponseModel.id).Result;
                                         
                        if (sendCampaignResult.ErrorModel == null)
                            mailchimpResult.result = sendCampaignResult.ResponseModel;
                        else
                            mailchimpResult.error = sendCampaignResult.ErrorModel; //i got this return indicate that my campaign is not ready
                    }
                    else
                    {
                        mailchimpResult.error = campaignChecklist.ErrorModel;
                        mailchimpResult.result = $"failed Check List Campaign / Your Campaign is not ready to send.";
                    }
                    #endregion
                }
                else
                {
                    mailchimpResult.error = campaignResult.ErrorModel;
                    mailchimpResult.result = "failed create Campaign";
                }
            }
            else
            {
                mailchimpResult.result = $"failed create contact: {offset}";
                mailchimpResult.error = memberResult.ErrorModel;
            }
        }
        else
        {
            mailchimpResult.error = audienceResult.ErrorModel;
            mailchimpResult.result = "failed create Audience";
        }
        
        return mailchimpResult;
    }
}

Upvotes: 1

Views: 1102

Answers (1)

Ade Budiman Hamdani
Ade Budiman Hamdani

Reputation: 1

Try this code below

 System.Threading.Thread.Sleep(40000); //try change this one

                //create campaign using post method
                var campaignResult = CampaignProcessor.PostCampaignAsync(campaignModel).Result;

                if (campaignResult.ResponseModel.id != null)
                {
                    #region USING ITERATION TO CHECK CAMPAIGN                  
                    CampaignProcessor.CampaignResponseCheckList campaignChecklist = new CampaignProcessor.CampaignResponseCheckList();

                    bool isReadySend = false;
                    int check = 0;
                    while (true) //just change this condition
                    {
                        //check campaign using get method
                        campaignChecklist = CampaignProcessor.GetCheckListCampaign(campaignResult.ResponseModel.id).Result;

                        if (campaignChecklist.ResponseModel.is_ready == true) //when error model is not null
                        {
                            isReadySend = true;
                            break;
                        }
                        else
                        {
                            isReadySend = false;
                        }



                        check++;
                    }

                    if (isReadySend)
                    {
                        //send campaign
                        var sendCampaignResult = CampaignProcessor.SendCampaignAsync(campaignResult.ResponseModel.id).Result;

                        if (sendCampaignResult.ErrorModel == null)
                            mailchimpResult.result = sendCampaignResult.ResponseModel;
                        else
                            mailchimpResult.error = sendCampaignResult.ErrorModel; //i got this return indicate that my campaign is not ready
                    }
                    else
                    {
                        mailchimpResult.error = campaignChecklist.ErrorModel;
                        mailchimpResult.result = $"failed Check List Campaign / Your Campaign is not ready to send.";
                    }
                    #endregion

Upvotes: 0

Related Questions