In this tutorial, you will learn about how to create leads in Salesforce programmatically, without the use of plugins. This tutorial focuses on integrating Contact Form 7 to SF using the Web-to-Lead method.
The full code can be found at the end of the tutorial.
If you are interested in a different integration please let us know in the comments section.
First we need to hook into the CF7’s “before send email”.
add_action("wpcf7_before_send_mail", "web_to_salesforce");
Code language: JavaScript (javascript)
We then create a function where we do the logic. The CF7 hook passes one variable which I called “$cf7”.
function web_to_salesforce($cf7){
// do logic here
}
Code language: PHP (php)
Inside our function we retrieve the submission instance and the current contact form information.
function web_to_salesforce($cf7){
$submission = WPCF7_Submission::get_instance();
$wpcf = WPCF7_ContactForm::get_current();
}
Code language: PHP (php)
We can use the $wpcf object to to get the id and compare it to the id of the CF7 form we want to target. Bonus: we can also use the object to get the mail prop.
Using the $submission object we get the user-posted form data.
function web_to_salesforce($cf7){
$submission = WPCF7_Submission::get_instance();
$wpcf = WPCF7_ContactForm::get_current();
if( $wpcf->id == 99){ // 99 being the id of the CF7 form
if ( !$submission ) {
return false;
}
$mail = $wpcf->prop('mail');
$posted_data = $submission->get_posted_data();
}
}
Code language: PHP (php)
In the next step, we prepare the fields we want to send to Salesforce.
$url = 'https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
$fields = array(
'debug' => 0, // set to 1 to active debug mode
'debugEmail' => 'admin@website.com',
'oid' => '00A100000000abc',
'first_name' => $posted_data['first-name'],
'last_name' => $posted_data['last-name'],
'email' => $posted_data['email'],
'phone' => $posted_data['telephone'],
'company' => $posted_data['company'],
'state' => $posted_data['state'],
'description' => $posted_data['enquiry'],
'country' => $posted_data['your-country'],
'emailOptOut' => true,
'lead_source' => 'Contact form',
);
Code language: PHP (php)
We then call our cURL function that we will create next.
Code language: PHP (php)curl_send_to_salesforce($url, $fields);
Bonus: you can edit the email CF7 recipient here based on various rules on the posted data.
$mail['recipient'] = 'sales@website.com';
// Save the email to field
$wpcf->set_properties(array(
"mail" => $mail
));
// Return current cf7 instance
return $wpcf;
Code language: PHP (php)
Now for our cURL function:
function curl_send_to_salesforce($url, $fields){
// URL-ify the data for the POST
foreach($fields as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');
// Open connection
$ch = curl_init();
// Set the url
// Set the number of POST vars
// Set the POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
// Execute post
$result = curl_exec($ch);
// Close connection
curl_close($ch);
return $result;
}
Code language: PHP (php)
Now for the full code:
<?php
function web_to_salesforce($cf7){
$submission = WPCF7_Submission::get_instance();
$wpcf = WPCF7_ContactForm::get_current();
if( $wpcf->id == 99 ){ // 99 being the id of the CF7 form
if ( !$submission ) {
return false;
}
$mail = $wpcf->prop('mail');
$posted_data = $submission->get_posted_data();
$url = 'https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
$fields = array(
'debug' => 0, // set to 1 to active debug mode
'debugEmail' => 'admin@website.com',
'oid' => '00A100000000abc',
'first_name' => $posted_data['first-name'],
'last_name' => $posted_data['last-name'],
'email' => $posted_data['email'],
'phone' => $posted_data['telephone'],
'company' => $posted_data['company'],
'state' => $posted_data['state'],
'description' => $posted_data['enquiry'],
'country' => $posted_data['your-country'],
'emailOptOut' => true,
'lead_source' => 'Contact form',
);
curl_send_to_salesforce($url, $fields);
$mail['recipient'] = 'sales@website.com';
// Save the email to field
$wpcf->set_properties(array(
"mail" => $mail
));
// return current cf7 instance
return $wpcf;
}
}
function curl_send_to_salesforce($url, $fields){
// URL-ify the data for the POST
foreach($fields as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');
// Open connection
$ch = curl_init();
// Set the url
// Set the number of POST vars
// Set the POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
// Execute post
$result = curl_exec($ch);
// Close connection
curl_close($ch);
return $result;
}
Code language: HTML, XML (xml)
Hope this helped you get a head start with your integration. If you have any questions or need help with anything else, feel free to leave a comment below.
Hello Dragos,
first thank you for the slick script, the one I had before was quite longer and had more code… 🙂
Your script used to work beautifully on my site, but since a few days all dropdown fields in CF7 are send as “=array” to salesforce.
Do you have an idea what could have caused this? The last CF7 Update perhaps?
Kind Regards
Seb
Hey Seb,
Glad it helped you! I was not aware of that, let me update CF7 and test it and come back to you. 🙂
Thanks,
Dragos
I rolled back CF7 5.2.1 to 5.2 and the salesforce integration is working again. So I can confirm it’s related to the latest CF7 update.
Though the release notes don’t show any substantial changes:
https://contactform7.com/2020/08/05/contact-form-7-521/#more-36962
Greetings Seb
Ah right, thanks for coming back to let me know! I need to investigate this soon as I have this implemented on a few clients websites…
Hi Seb,
It finally surfaced for me as well. So far, it seems that dropdown fields return as an array, so you need to do something like:
‘state’ => $posted_data[‘state’][0];
Best wishes,
Dragos
Hi! This plugin works for me, but only in debug mode 🙁 If i turn off debug, dosent send the user to my salesforce account. Any ideas?
Thanks in advance 🙂
Hi Benjamin,
Are you using Google ReCaptcha by any chance? Also, are you getting any errors in the Network’s XHR tab?
Best wishes
Dragos
Hi! Its working 😉 The thing is that its takes one hour aprox to show data in Salesforce. It could be something with my salesforce or my WordPress? I am using the code in a sandbox area.
Thanks again and sorry for so many questions 🙁
Hi Benjamin,
I believe it’s usual with Salesforce to sometimes take a while to show up the data. It happed to me before also.
Best wishes,
Dragos