{"id":400289,"date":"2026-11-09T21:04:03","date_gmt":"2026-11-09T21:04:03","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/send4\/"},"modified":"2026-11-09T21:00:09","modified_gmt":"2026-11-09T21:00:09","slug":"send4","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/send4\/","author":23600660,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.2","stable_tag":"0.2.2","tested":"7.1.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Send4 \u2013 AI SMS Lead Follow-up for Contact Forms","header_author":"Send4","header_description":"Sends your form submissions to Send4 so an AI can follow up with the lead over SMS. Works with Contact Form 7, WPForms, Gravity Forms and Elementor Pro.","assets_banners_color":"048760","last_updated":"2026-11-09 21:00:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/send4.ai\/integrations\/wordpress","header_author_uri":"https:\/\/send4.ai","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.2":{"tag":"0.2.2","author":"send4","date":"2026-11-09 21:00:09","revision":3793253}},"upgrade_notice":{"0.2.2":"<p>Needs WordPress 6.2 or later. Includes 0.2.0 and 0.2.1: the dashboard shows what your Send4 account still needs before it can text your leads, and you are told when Send4 needs a newer version of this plugin.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3793253,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3793253,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3793253,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3793253,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3793253,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3793253,"resolution":"1","location":"assets","locale":"","width":1920,"height":1860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3793253,"resolution":"2","location":"assets","locale":"","width":1920,"height":1860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3793253,"resolution":"3","location":"assets","locale":"","width":1920,"height":1290}},"screenshots":{"1":"Send4 \u2192 Dashboard: what has been sent, the retry queue, and recent activity.","2":"Choosing which field holds the phone number.","3":"The forms list, showing delivery status per form."}},"plugin_section":[],"plugin_tags":[1152,337,335,711,130711],"plugin_category":[41],"plugin_contributors":[291708],"plugin_business_model":[],"class_list":["post-400289","plugin","type-plugin","status-publish","hentry","plugin_tags-contact-form-7","plugin_tags-lead-generation","plugin_tags-leads","plugin_tags-sms","plugin_tags-wpforms","plugin_category-communication","plugin_contributors-send4","plugin_committers-send4"],"banners":{"banner":"https:\/\/ps.w.org\/send4\/assets\/banner-772x250.png?rev=3793253","banner_2x":"https:\/\/ps.w.org\/send4\/assets\/banner-1544x500.png?rev=3793253","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/send4\/assets\/icon.svg?rev=3793253","icon":"https:\/\/ps.w.org\/send4\/assets\/icon.svg?rev=3793253","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/send4\/assets\/screenshot-1.png?rev=3793253","caption":"Send4 \u2192 Dashboard: what has been sent, the retry queue, and recent activity."},{"src":"https:\/\/ps.w.org\/send4\/assets\/screenshot-2.png?rev=3793253","caption":"Choosing which field holds the phone number."},{"src":"https:\/\/ps.w.org\/send4\/assets\/screenshot-3.png?rev=3793253","caption":"The forms list, showing delivery status per form."}],"raw_content":"<!--section=description-->\n<p>Send4 texts every new lead from your WordPress contact forms within seconds. When someone submits a Contact Form 7,\nWPForms, Gravity Forms or Elementor Pro form on your site, this plugin hands the submission to your Send4 account, and\nthe AI flow you set up there starts an SMS conversation with that person: it answers their questions, asks what you\nneed to know, and can book a call.<\/p>\n\n<p>Most leads that come through a contact form go cold before anybody answers them. Send4 is the follow-up that\nanswers first.<\/p>\n\n<p>You do not have to build a payload, sign a webhook, or write a line of code. Install the plugin, connect it to\nyour Send4 account with one button, pick which form field holds the phone number, and turn the form on.<\/p>\n\n<p><strong>What it does<\/strong><\/p>\n\n<ul>\n<li>Works with Contact Form 7, WPForms, Gravity Forms and Elementor Pro.<\/li>\n<li>Maps the phone number, name and email once per form, in wp-admin.<\/li>\n<li>Passes every other field through as context, so the AI knows what the person asked for.<\/li>\n<li>Retries for about a day and a half if Send4 is briefly unreachable, so a lead is never lost.<\/li>\n<li>Tells you, per form, whether the last submission arrived and whether a Send4 flow is listening for it.<\/li>\n<li>Optionally adds a country picker to your phone field, and refuses a number with no country code while the\nvisitor is still on the form \u2014 so the number Send4 gets is one it can text.<\/li>\n<\/ul>\n\n<p><strong>You need a Send4 account and a number to text from.<\/strong> Send4 is a paid service; this plugin is the WordPress half\nof it. Send4 texts your leads through your own Twilio or Vonage account, which you connect in Send4. If your leads are\nin Lithuania, Send4 can provide the sending number instead. Until everything is in place, the plugin's dashboard lists\nwhat is still missing, with a link to fix each step in Send4.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin sends data to Send4 (https:\/\/send4.ai), the service it integrates with. Nothing is transmitted\nuntil you start connecting the site to Send4, and no visitor's submission is sent until you also enable a form.<\/p>\n\n<ul>\n<li><strong>Connecting.<\/strong> Pressing <strong>Connect with Send4<\/strong> sends your site's address and the address of this plugin's\nConnection screen in wp-admin, so that Send4 can create an API key bound to this site and send you back here\nto finish; the one-time code it returns is then exchanged for that key. If you paste an API key instead, the\nkey is sent to Send4 to obtain an access token and to confirm which account it belongs to.<\/li>\n<li><strong>What is sent:<\/strong> for each submission on an enabled form \u2014 the phone number, name and email address you\nmapped, the remaining form fields, the form's name and key, your site URL, and a random submission\nidentifier used to avoid sending the same lead twice.<\/li>\n<li><strong>When:<\/strong> at the moment the form is submitted, and again on retry if the first attempt failed.<\/li>\n<li><strong>Where:<\/strong> to <code>https:\/\/app.send4.ai<\/code> by default, over HTTPS.<\/li>\n<li><strong>A list of your forms.<\/strong> So that Send4 can offer your forms by name when you build a flow, the plugin\nalso sends a description of every form it detects: the form's name and key, whether you have enabled it\nhere, and each field's label and type. <strong>No submitted values are included<\/strong> \u2014 this describes the shape of\nyour forms, not anything a visitor typed. It is sent when you connect the site (before any form is\nenabled), when you change a form's settings, once a day, and when you press <strong>Sync forms to Send4<\/strong>.<\/li>\n<li><strong>Which versions this site runs.<\/strong> With the list of forms, the plugin sends the version of this plugin, of\nWordPress, of PHP and, when it is installed, of WooCommerce, the site's language, and whether the site is part of\na multisite network. Send4 uses this to know which versions are still in use before it changes anything they\ndepend on.<\/li>\n<li><strong>Checking the account.<\/strong> When you open the plugin's screens, and once a day, the plugin asks Send4 which flows\nlisten for this site's forms, whether your account is ready to text leads, and which version of this plugin Send4\nneeds. That request sends nothing but the connection's credentials and the User-Agent described below.<\/li>\n<li><strong>With every request<\/strong> the plugin identifies itself and its version, and includes your site's address, in the\nHTTP User-Agent header.<\/li>\n<li>Send4's terms of service: https:\/\/send4.ai\/terms \u2014 privacy policy: https:\/\/send4.ai\/privacy<\/li>\n<\/ul>\n\n<p>Because the data you forward includes personal information about your visitors, tell them so. Your form\nneeds a clear consent line explaining that submitting it means Send4 may text them, and your privacy policy\nshould name Send4 as a processor. In the United States, SMS follow-up is also regulated by the TCPA and\ncarrier 10DLC rules; get consent language right before you switch a form on.<\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<p>The country picker bundles <strong>intl-tel-input<\/strong> 29.2.3 by Jack O'Connor, under the MIT licence\n(https:\/\/github.com\/jackocnr\/intl-tel-input). It is shipped unmodified in <code>public\/lib\/intl-tel-input\/<\/code>, with its\nlicence, and the unminified source sits next to the minified build. One image is renamed, <code>flags@2x.webp<\/code> to\n    flags-2x.webp, because the plugin directory does not accept an \"@\" in a file name. Everything is served from your\nown site; nothing is loaded from a third-party host.<\/p>\n\n<pre><code>utils.js, which formats and checks the number, is a compiled build. It is Google's libphonenumber (Apache License\n<\/code><\/pre>\n\n<p>2.0, https:\/\/github.com\/google\/libphonenumber) with intl-tel-input's wrapper, compiled by Google Closure Compiler.\nThe sources and the build script, at the version shipped:<\/p>\n\n<ul>\n<li>Wrapper source: https:\/\/github.com\/jackocnr\/intl-tel-input\/blob\/v29.2.3\/packages\/core\/src\/js\/utils.js<\/li>\n<li>Build script: https:\/\/github.com\/jackocnr\/intl-tel-input\/blob\/v29.2.3\/scripts\/build-utils.js (<code>npm run build:utils<\/code>\nin that repository, which pulls libphonenumber in as a git submodule)<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>In WordPress, go to <strong>Send4 \u2192 Connection<\/strong> and press <strong>Connect with Send4<\/strong>. Approve the connection in\nSend4; you are brought back to WordPress and should see \"Connected to <em>your account<\/em>\".<\/li>\n<li>Prefer to paste a key? In your Send4 dashboard, create an API key with the <strong>WordPress plugin<\/strong>\npermission, copy the client ID and secret (the secret is shown only once), and paste both on the same\nscreen instead.<\/li>\n<li>Go to <strong>Send4 \u2192 Forms &amp; Triggers<\/strong>, choose a form, pick the field that holds the phone number, and enable it.<\/li>\n<li>In Send4, create a flow whose trigger is <strong>WordPress form<\/strong>, and tick the forms it should listen for \u2014\nthey are listed by name, because the plugin reports them. Choose \"All forms\" to accept every form on\nthis site.<\/li>\n<\/ol>\n\n<p>Use one API key per website. Send4 binds a key to the site it was created for and refuses\nsubmissions that arrive from anywhere else.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20text%20a%20lead%20as%20soon%20as%20they%20submit%20a%20contact%20form%3F\"><h3>How do I text a lead as soon as they submit a contact form?<\/h3><\/dt>\n<dd><p>Connect the plugin to Send4, then go to <strong>Send4 \u2192 Forms &amp; Triggers<\/strong>, pick the form, choose the field that holds the\nphone number and turn the form on. In Send4, a flow with a <strong>WordPress form<\/strong> trigger texts each new lead within\nseconds. The steps are the same for Contact Form 7, WPForms, Gravity Forms and Elementor Pro.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20phone%20number%20field%3F\"><h3>Do I need a phone number field?<\/h3><\/dt>\n<dd><p>Yes. Send4 follows up by SMS, so a submission with no phone number has nobody to reach. The plugin refuses\nto enable a form until you tell it which field holds the number.<\/p><\/dd>\n<dt id=\"a%20form%20sends%2C%20but%20nobody%20is%20texted.%20why%3F\"><h3>A form sends, but nobody is texted. Why?<\/h3><\/dt>\n<dd><p>Open <strong>Send4 \u2192 Dashboard<\/strong>. When your Send4 account cannot text anyone yet, a card at the top, \"Before Send4 can text\nyour leads\", lists each missing step: an active plan, a flow listening for your forms, the phone number Send4 texts\nfrom, and the account that number sends through. Each step links to the page in Send4 that fixes it. The submissions\nthemselves are not lost: Send4 has them.<\/p><\/dd>\n<dt id=\"which%20number%20are%20my%20leads%20texted%20from%3F\"><h3>Which number are my leads texted from?<\/h3><\/dt>\n<dd><p>One you connect in Send4. Send4 sends through your own Twilio or Vonage account: add the account's keys under\n<strong>Settings \u2192 Integrations \u2192 Provider credentials<\/strong> in Send4, add the phone number under <strong>Settings \u2192 Phones<\/strong>, and\nput the reply addresses Send4 shows you into your Twilio or Vonage console so that answers come back. The account, the\nnumber and what they cost are yours, and so are the rules your country sets for business texting, such as 10DLC\nregistration in the United States.<\/p>\n\n<p>If your leads are in Lithuania, Send4 can provide the number instead: ask us to add one to your account. It texts\nLithuanian numbers only.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20fields%20i%20do%20not%20map%3F\"><h3>What happens to fields I do not map?<\/h3><\/dt>\n<dd><p>They are all sent as context, keyed by their label, and Send4 gives them to the AI so it can answer\nquestions about what the person actually asked for. Nothing is dropped.<\/p><\/dd>\n<dt id=\"does%20the%20visitor%20wait%20for%20send4%3F\"><h3>Does the visitor wait for Send4?<\/h3><\/dt>\n<dd><p>No longer than three seconds. If Send4 does not answer within that, the submission goes into a local retry\nqueue and the visitor sees their normal confirmation immediately.<\/p><\/dd>\n<dt id=\"what%20if%20send4%20is%20down%3F\"><h3>What if Send4 is down?<\/h3><\/dt>\n<dd><p>The submission is stored in a table in your database and retried on a backoff \u2014 after a minute, five\nminutes, fifteen, an hour, then every six hours for about a day and a half. Retries reuse the same\nsubmission identifier, so a lead cannot be delivered twice.<\/p><\/dd>\n<dt id=\"which%20form%20plugins%20does%20it%20work%20with%3F\"><h3>Which form plugins does it work with?<\/h3><\/dt>\n<dd><p>Contact Form 7, WPForms (including Lite), Gravity Forms and Elementor Pro are supported today. Each one is\na small adapter class; ask us and we will add yours.<\/p><\/dd>\n<dt id=\"why%20would%20a%20form%20refuse%20a%20phone%20number%3F\"><h3>Why would a form refuse a phone number?<\/h3><\/dt>\n<dd><p>Only if you turned on <strong>Refuse a submission whose phone number has no country code<\/strong> for that form (it is off\nby default). Send4 texts the lead, and a text needs the full international number: <code>+44 20 7946 0958<\/code>, not\n    020 7946 0958. The plugin never guesses a country code for a number that has none \u2014 it asks the visitor to\nadd one instead, with the message \"Please enter your phone number with its country code, starting with + \u2014\notherwise we cannot text you back.\"<\/p>\n\n<p>The check is deliberately loose: a leading <code>+<\/code> (or <code>00<\/code>) and a real country code, 7 to 15 digits. It does not\nsecond-guess the length of a number inside a country. An empty, optional phone field is never refused.<\/p>\n\n<p>Every refusal is written to the activity log on the Send4 dashboard with the form, the reason and the shape of\nwhat was typed \u2014 the first two or three digits and how many there were, as in <code>86\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (9 digits)<\/code> \u2014 but never\nthe number itself. That is enough to see that visitors are typing the national format, and not enough to call\none of them. The dashboard also counts refusals per form. To see which forms check, run <code>wp send4 forms<\/code> and read the <code>validates<\/code> column.<\/p>\n\n<p>Developers can change the message with the <code>send4_phone_error_message<\/code> filter, and add a country calling code\nwith <code>send4_phone_calling_codes<\/code>.<\/p><\/dd>\n<dt id=\"what%20does%20the%20country%20picker%20do%3F\"><h3>What does the country picker do?<\/h3><\/dt>\n<dd><p>With <strong>Add a country picker to the phone field<\/strong> on, the visitor chooses a country from a searchable list, the\nnumber is formatted as they type, and it is sent to your form plugin as <code>+37060012345<\/code>. It is added to the field\nyou mapped as the phone number, whatever kind of field that is \u2014 you do not need to rebuild your form.<\/p>\n\n<p>It loads only on pages that show a form with the picker on. If you use a page cache, clear it after changing\nthe setting.<\/p>\n\n<p>On Gravity Forms, set the phone field's format to <strong>International<\/strong>. The \"Standard\" format only accepts\nNorth American numbers written <code>(###) ###-####<\/code> and would refuse the number the picker sends, so a field in\nthat format gets no picker and no country-code check. The form's Send4 settings say so when that is the case.<\/p><\/dd>\n<dt id=\"what%20about%20visitors%20with%20javascript%20turned%20off%3F\"><h3>What about visitors with JavaScript turned off?<\/h3><\/dt>\n<dd><p>They see your form exactly as before, with no picker. If the form refuses numbers without a country code, the\ncheck still runs when they submit, so they will be asked to type the <code>+<\/code> and country code themselves. Nothing\nis lost: they can fix it and send the form again.<\/p><\/dd>\n<dt id=\"the%20picker%20does%20not%20appear%20in%20my%20elementor%20popup\"><h3>The picker does not appear in my Elementor popup<\/h3><\/dt>\n<dd><p>A popup Elementor loads <em>after<\/em> the page has loaded, over AJAX, is the one case the plugin cannot see \u2014 Elementor\ndecides what that response contains. The check on submission still works; only the picker is missing. Declare\nthe form yourself, with the popup's form widget id (the <code>data-id<\/code> on the widget) and the phone field's ID:<\/p>\n\n<pre><code>add_filter( 'send4_phone_targets', function ( $targets ) {\n    $targets[] = array(\n        'scope'    =&gt; '[data-id=\"a1b2c3d\"]',\n        'input'    =&gt; '[name=\"form_fields[phone]\"]',\n        'validate' =&gt; true,\n    );\n    return $targets;\n} );\n<\/code><\/pre><\/dd>\n<dt id=\"i%20use%20wpforms%20pro%27s%20smart%20phone%20field.%20will%20i%20get%20two%20pickers%3F\"><h3>I use WPForms Pro's Smart phone field. Will I get two pickers?<\/h3><\/dt>\n<dd><p>No. If a field already has a picker, Send4 leaves it alone, and the check on submission still applies.<\/p><\/dd>\n<dt id=\"does%20it%20phone%20home%20if%20i%20do%20not%20configure%20it%3F\"><h3>Does it phone home if I do not configure it?<\/h3><\/dt>\n<dd><p>No. Until you start connecting the site, the plugin makes no outbound requests at all.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Listing assets for WordPress.org: the plugin directory now has Send4's icon, banner and screenshots.<\/li>\n<li>The plugin is now called \"Send4 \u2013 AI SMS Lead Follow-up for Contact Forms\" in the directory and on the Plugins screen. Nothing else changes.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Needs WordPress 6.2 or later. The retry queue now names its database table through WordPress's own\nplaceholder for table names, which arrived in 6.2.<\/li>\n<li>A client secret pasted on the Connection screen is checked before it is tried. One that cannot be a Send4\nsecret, for example with a space inside it, is refused with a message saying so.<\/li>\n<li>Every Send4 screen action checks its security token in the action itself. Nothing changes on screen.<\/li>\n<\/ul>\n\n<p>Older releases are listed in <code>changelog.txt<\/code> in the plugin folder.<\/p>","raw_excerpt":"Text every new form lead within seconds. Send4's AI follows up over SMS for Contact Form 7, WPForms, Gravity Forms and Elementor Pro.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/400289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=400289"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/send4"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=400289"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=400289"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=400289"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=400289"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=400289"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=400289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}