This post shows how to have data from a Kentico form builder pushed to SalesForce automatically using the Web-To-Lead functionality.
The two pieces of information you need from SalesForce is your OID and the Web-To-Lead post URL.
Below is the class to post to SalesForce from a BizFormItem. This class can be created in your App_Code folder. You want to make sure you set SalesForceOID and SalesForceWebToLeadURL to the correct values. Next set SalesForceWebToLeadForms to list each Kentico Form you want to push over.
You will also want to update the mapField(LeadModel, string) function to correctly map your Kentico Form field names to the corresponding SalesForce field. If you have any custom fields, you will need to generate the Web-To-Lead form html and find the custom field name used.
// add these includes using CMS.CMSHelper; using CMS.FormEngine; namespace roma { public class SalesForceService : IDisposable { // define sales force settings - should be in web.config public static string SalesForceOID = “00Di0000000AAAA”; public static string SalesForceWebToLeadURL = “https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8”; // define forms we should integrate public static string[] SalesForceWebToLeadForms = { “BizForm.ContactForm”, “BizForm.SignUpForm” } // function that posts from the given form record public void PostLeadFromForm(BizFormItem formObject) { // get the form name that represents the list var form = BizFormInfoProvider.GetBizFormInfo( formObject.BizFormClassName.ToLower().Replace(“bizform.”, “”), CMSContext.CurrentSiteID); string formName = form.FormDisplayName; // check if a web to lead if (SalesForceWebToLeadForms.Contains(formObject.BizFormClassName)) { // create the model var model = new LeadModel(); // map the fields foreach (var col in formObject.ColumnNames) { mapField(model, formObject, col); } // post to sales force PostWebToLead(model); } } // function that maps the col to the correct model field private void mapField(LeadModel model, BizFormItem formObject, string col) { // check the name switch (col.ToLower()) { // email case “email”: model.Email = formObject.GetStringValue(col, “”); break; // company case “company”: model.Company = formObject.GetStringValue(col, “”); break; // first name case “fname”: model.FirstName = formObject.GetStringValue(col, “”); break; // last name case “lname”: model.LastName = formObject.GetStringValue(col, “”); break; // title case “title”: model.Title = formObject.GetStringValue(col, “”); break; // phone case “phone”: model.Phone = formObject.GetStringValue(col, “”); break; // last name case “city”: model.City = formObject.GetStringValue(col, “”); break; // last name case “state”: model.State = formObject.GetStringValue(col, “”); break; // message case “comments”: model.Message = formObject.GetStringValue(col, “”); break; } } // function that sends the given data to sales fource public void PostWebToLead(LeadModel model) { // build the request var request = WebRequest.Create(Config.SalesForceWebToLeadURL); request.Method = “POST”; // build the post data var sb = new StringBuilder() .AppendFormat(“oid={0}”, Config.SalesForceOID) .AppendFormat(“&{0}={1}”, “company”, model.Company) .AppendFormat(“&{0}={1}”, “first_name”, model.FirstName) .AppendFormat(“&{0}={1}”, “last_name”, model.LastName) .AppendFormat(“&{0}={1}”, “email”, model.Email) .AppendFormat(“&{0}={1}”, “title”, model.Title) .AppendFormat(“&{0}={1}”, “city”, model.City) .AppendFormat(“&{0}={1}”, “state”, model.State) .AppendFormat(“&{0}={1}”, “phone”, model.Phone) .AppendFormat(“&{0}={1}”, “description”, model.Description) .AppendFormat(“&{0}={1}”, “lead_source”, model.LeadSource) ; // convert post data to byte[] byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString()); request.ContentType = “application/x-www-form-urlencoded”; request.ContentLength = byteArray.Length; // write to request Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); // get a response, read into string WebResponse response = request.GetResponse(); dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); // clean up reader.Close(); dataStream.Close(); response.Close(); } // dispose public void Dispose() { } // define model public class LeadModel { // define fields public string Company { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public string Title { get; set; } public string City { get; set; } public string State { get; set; } public string Phone { get; set; } public string Message { get; set; } public string Description { get; set; } public string LeadSource { get { return “Web”; } } } } }
Last, you need to add an event handler so we can pick up when a form has been submitted and push that data to SalesForce. Create a new class in your App_Code folder for the following class:
// add these includes using CMS.FormEngine; using CMS.SettingsProvider; [CustomDocumentEvents] public partial class CMSModuleLoader { // define class for events private class CustomDocumentEventsAttribute : CMSLoaderAttribute { // init - add events public override void Init() { // set event handlers ObjectEvents.Insert.After += Insert_After; } // event handler for after insert for an object void Insert_After(object sender, ObjectEventArgs e) { // check if a form record added if (e.Object is BizFormItem) { // push to sales force using( var s = new roma.SalesForceService()) { s.PostLeadFromForm((BizFormItem)e.Object); } } } } }