{"id":358650,"date":"2026-09-03T14:28:19","date_gmt":"2026-09-03T14:28:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/leadbridge-for-salesforce\/"},"modified":"2026-09-17T02:23:54","modified_gmt":"2026-09-17T02:23:54","slug":"oddeven-lead-routing-for-salesforce","status":"publish","type":"plugin","link":"https:\/\/nl.wordpress.org\/plugins\/oddeven-lead-routing-for-salesforce\/","author":23554852,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.2","stable_tag":"1.6.2","tested":"7.1.3","requires":"6.8","requires_php":"8.0","requires_plugins":null,"header_name":"Oddeven Lead Routing for Salesforce","header_author":"Oddeven Infotech LLC","header_description":"Connect WordPress form submissions to Salesforce using External Client Apps and the OAuth client credentials flow. Submissions are queued and retried, never sent inside the form request.","assets_banners_color":"3c6264","last_updated":"2026-09-17 02:23:54","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/oddeveninfotech.com\/plugins\/lead-routing-for-salesforce\/","header_author_uri":"https:\/\/oddeveninfotech.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":373,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"oddeveninfotech","date":"2026-09-03 14:28:08","revision":3679898},"1.1.0":{"tag":"1.1.0","author":"oddeveninfotech","date":"2026-09-07 22:36:22","revision":3685692},"1.2.0":{"tag":"1.2.0","author":"oddeveninfotech","date":"2026-09-12 04:43:29","revision":3692324},"1.3.0":{"tag":"1.3.0","author":"oddeveninfotech","date":"2026-09-12 14:11:26","revision":3692747},"1.4.0":{"tag":"1.4.0","author":"oddeveninfotech","date":"2026-09-12 15:12:39","revision":3692864},"1.5.0":{"tag":"1.5.0","author":"oddeveninfotech","date":"2026-09-12 18:07:26","revision":3692982},"1.6.0":{"tag":"1.6.0","author":"oddeveninfotech","date":"2026-09-12 21:18:51","revision":3693144},"1.6.1":{"tag":"1.6.1","author":"oddeveninfotech","date":"2026-09-12 22:12:28","revision":3693157},"1.6.2":{"tag":"1.6.2","author":"oddeveninfotech","date":"2026-09-17 02:23:54","revision":3699449}},"upgrade_notice":{"1.6.2":"<p>Fixes a mapping row being silently dropped on save when its Salesforce field was not in the cached field list, and Record Type being ignored on Web-to-Lead forms. If a Record Type or Owner row went missing from a form, re-add it after updating.<\/p>","1.6.1":"<p>Security hardening: Web-to-Lead feeds take their org id from the connection, and changing a connection&#039;s address discards its stored credentials. Existing feeds keep working; a Web-to-Lead feed that names a connection with no org id will ask you to set one on the connection.<\/p>","1.6.0":"<p>Adds &quot;fields combined&quot; as a mapping source, so Company can be built from a person&#039;s name with fallbacks. Nothing changes for existing feeds.<\/p>","1.5.0":"<p>Upload Salesforce&#039;s Web-to-Lead form to get a fully paired mapping CSV; Web-to-Lead feeds now accept Lead API names, and an unconfirmed post can no longer be read as delivered. Nothing changes for existing feeds.<\/p>","1.4.0":"<p>Adds Start from a live form on the Forms screen, and fixes mapping of Formidable Name fields part by part. Nothing changes for existing feeds.<\/p>","1.3.0":"<p>Generate a key now writes wp-config.php for you where the server allows it. Nothing changes for sites that already have a key.<\/p>","1.2.0":"<p>Adds Formidable Forms support and a Generate a key button for sites without shell access. Nothing changes for existing feeds.<\/p>","1.1.0":"<p>Adds custom form support. Nothing changes for existing Contact Form 7 feeds.<\/p>","1.0.0":"<p>First stable release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3679892,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3679892,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3679892,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3679892,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0","1.3.0","1.4.0","1.5.0","1.6.0","1.6.1","1.6.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3679892,"resolution":"1","location":"assets","locale":"","width":1280,"height":950},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3679892,"resolution":"2","location":"assets","locale":"","width":1280,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3679892,"resolution":"3","location":"assets","locale":"","width":1280,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3679892,"resolution":"4","location":"assets","locale":"","width":1280,"height":2259},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3679892,"resolution":"5","location":"assets","locale":"","width":1280,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3679892,"resolution":"6","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"The dashboard answers \"is it working\" before it offers anything to configure: one plain sentence about the last seven days, then any problem with the fix beside it, then the latest submissions and what became of each.","2":"Activity, with a status in words for every submission. A delivered lead carries the Salesforce record id it created; anything else says plainly what it is, and nothing is coloured without also being labelled.","3":"A failure explains itself in terms you can act on. Salesforce's own validation message is quoted, the cause is attributed to the org rather than to the plugin, and the record can be sent again once the cause is fixed.","4":"Field mapping built on your org. The destination list comes from the object itself, required fields come first and are flagged, and fields Salesforce would never accept on create are not offered at all.","5":"Connection health, one row per thing that can be wrong. An expired token reads OK because it renews itself; an unrecorded app type reads Unknown rather than being guessed. The retirement panel links to this org's own schedule instead of printing a date it cannot know.","6":"Choosing how to connect, framed by outcome rather than by protocol. The basic method says before you pick it that Salesforce will not confirm delivery."}},"plugin_section":[262246],"plugin_tags":[1152,1150,601,335,9220],"plugin_category":[42,58],"plugin_contributors":[279035],"plugin_business_model":[],"class_list":["post-358650","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-contact-form-7","plugin_tags-crm","plugin_tags-forms","plugin_tags-leads","plugin_tags-salesforce","plugin_category-contact-forms","plugin_category-user-management","plugin_contributors-oddeveninfotech","plugin_committers-oddeveninfotech"],"banners":{"banner":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/banner-772x250.png?rev=3679892","banner_2x":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/banner-1544x500.png?rev=3679892","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/icon-128x128.png?rev=3679892","icon_2x":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/icon-256x256.png?rev=3679892","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/screenshot-1.png?rev=3679892","caption":"The dashboard answers \"is it working\" before it offers anything to configure: one plain sentence about the last seven days, then any problem with the fix beside it, then the latest submissions and what became of each."},{"src":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/screenshot-2.png?rev=3679892","caption":"Activity, with a status in words for every submission. A delivered lead carries the Salesforce record id it created; anything else says plainly what it is, and nothing is coloured without also being labelled."},{"src":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/screenshot-3.png?rev=3679892","caption":"A failure explains itself in terms you can act on. Salesforce's own validation message is quoted, the cause is attributed to the org rather than to the plugin, and the record can be sent again once the cause is fixed."},{"src":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/screenshot-4.png?rev=3679892","caption":"Field mapping built on your org. The destination list comes from the object itself, required fields come first and are flagged, and fields Salesforce would never accept on create are not offered at all."},{"src":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/screenshot-5.png?rev=3679892","caption":"Connection health, one row per thing that can be wrong. An expired token reads OK because it renews itself; an unrecorded app type reads Unknown rather than being guessed. The retirement panel links to this org's own schedule instead of printing a date it cannot know."},{"src":"https:\/\/ps.w.org\/oddeven-lead-routing-for-salesforce\/assets\/screenshot-6.png?rev=3679892","caption":"Choosing how to connect, framed by outcome rather than by protocol. The basic method says before you pick it that Salesforce will not confirm delivery."}],"raw_content":"<!--section=description-->\n<p>Oddeven Lead Routing connects your WordPress forms to Salesforce and keeps the connection\nworking through the 2026 and 2027 authentication changes.<\/p>\n\n<p><strong>Built for the auth Salesforce actually supports.<\/strong> Salesforce restricted new\nConnected App creation in Spring '26 and retires the OAuth username-password flow in\nWinter '27. Oddeven Lead Routing is built on External Client Apps with the client credentials\nflow, so a connection you set up today is still a supported configuration afterwards.\nThe username-password flow is not implemented, and never will be.<\/p>\n\n<p><strong>A submission is saved before it is sent.<\/strong> Every submission is written to the\ndatabase with a pending status before any outbound call, then delivered by a\nbackground worker through Action Scheduler. A Salesforce outage, a slow API or a\nvalidation error cannot break your form or lose the lead. Failed deliveries are\nretried with backoff and, if they keep failing, land in a dead letter list you can\ninspect and requeue.<\/p>\n\n<p><strong>Credentials are encrypted at rest.<\/strong> Client secrets and tokens are protected with\nlibsodium authenticated encryption, keyed from a constant you define in\nwp-config.php.<\/p>\n\n<p><strong>No phoning home.<\/strong> The plugin talks to your Salesforce org and nothing else. No\ntelemetry, no analytics, no licensing service.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Map form fields to any Salesforce object over the REST API<\/li>\n<li>Web-to-Lead and Web-to-Case as alternatives when you cannot use the API<\/li>\n<li>Per feed conditional logic<\/li>\n<li>Delivery log with retry, dead letter handling and manual requeue<\/li>\n<li>Ten granular capabilities, so watching the submission queue does not require the\nright to edit Salesforce credentials<\/li>\n<\/ul>\n\n<h4>Combining fields<\/h4>\n\n<p>A mapping row can send several fields as one value, with fallbacks: <code>{first} {last}<\/code>\nsends the name; <code>{company}||{first} {last}||Individual<\/code> sends the company when the\nform has one, the person's name when it does not, and a fixed word when it has\nneither. That is what Salesforce's mandatory Company field needs from a form most\npeople fill in as individuals.<\/p>\n\n<h4>Supported forms<\/h4>\n\n<ul>\n<li>Contact Form 7<\/li>\n<li>Formidable Forms<\/li>\n<li>Custom forms \u2014 any form your theme or a developer built, connected with one line of code<\/li>\n<\/ul>\n\n<h4>Formidable Forms<\/h4>\n\n<p>A Formidable form connects the same way a Contact Form 7 one does: choose Formidable\nForms as the source, enter the form's ID from its Forms list, and map its fields. Fields\nare identified by Formidable's field ID \u2014 the number the form itself posts \u2014 with the\nfield's label shown beside it, so nobody has to remember that \"Last name\" is field 7.\nA Name field is offered part by part \u2014 <code>82.first<\/code>, <code>82.last<\/code> \u2014 and so is an Address\nfield, because Salesforce wants FirstName and LastName apart; the field itself is\nstill available as one value. Entries are captured the moment Formidable saves them,\nbefore its own actions run, so a\nform whose email action is switched off still delivers. The free plugin is enough;\nrepeater sections from Formidable Pro are handled as one submission, not one per row.<\/p>\n\n<h4>Start from a live form<\/h4>\n\n<p>Paste the address of a page that shows a form and the plugin reads the form from it,\ntells you whether it can deliver from that form plugin, and hands you a mapping CSV\nwith the form id and every field already filled in \u2014 the obvious Lead fields\nsuggested, the rest left for you. Complete the Salesforce column and import it. No\nviewing page source, no typing field ids.<\/p>\n\n<p>Using Web-to-Lead? Upload the form Salesforce generated under Setup \u2192 Web-to-Lead as\nwell, and the CSV comes back with both sides filled in: each Salesforce field \u2014\nincluding custom fields by their 00N\u2026 id \u2014 paired with the matching form field by\nlabel, the org id set, and hidden values such as the record type carried as fixed\nvalues.<\/p>\n\n<h4>Custom forms<\/h4>\n\n<p>A form the plugin has never heard of can still reach Salesforce. From inside the code\nthat already handles the submission, after it has decided the submission is good:<\/p>\n\n<pre><code>do_action( 'lbsf_custom_form', 'quote-request', array( 'first_name' =&gt; $first_name, 'email' =&gt; $email ) );\n<\/code><\/pre>\n\n<p>Everything after that is identical to a Contact Form 7 lead: saved first, queued,\nretried, and visible in Activity. Declare the form and its fields under Forms \u2192 Custom\nforms so the mapping can be built before the form has ever been submitted. Fields that\nturn up in real submissions are recorded and offered there too, so a field added in code\nand forgotten in configuration shows up as something to click rather than as silence.<\/p>\n\n<p>It is a hook rather than an address the browser posts to, deliberately: your form keeps\nits own nonce, spam handling and redirect, and this plugin adds nothing new that faces\nthe public internet.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.8 or newer<\/li>\n<li>PHP 8.0 or newer with the sodium extension<\/li>\n<li>The ability to add one line to <code>wp-config.php<\/code>, which holds the encryption key<\/li>\n<li>A Salesforce org where you can create an External Client App<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to Salesforce, and to nothing else. It contacts no service\noperated by us, sends no telemetry, and transmits nothing at all until you have\nconfigured a connection and connected a form to it. A visitor loading a page never\ncauses an outbound request.<\/p>\n\n<h4>Your Salesforce org<\/h4>\n\n<p>The Salesforce org you connect, at the My Domain address you supply, for example\nhttps:\/\/yourcompany.my.salesforce.com. It is used to obtain an OAuth access token, to\nread the object and field list so you can map fields to it, and to create records from\nform submissions.<\/p>\n\n<p>What is sent, and when:<\/p>\n\n<ul>\n<li>Your External Client App's consumer key and secret, when an access token is requested\n-- when you connect, when you use \"Test connection\", and when a token expires.<\/li>\n<li>The name of the Salesforce object you chose and a field list request, when you open\nthe mapping editor.<\/li>\n<li>The form field values you have mapped, when a queued submission is dispatched. Only\nthe fields named in your mapping are sent; nothing else from the submission is.<\/li>\n<\/ul>\n\n<h4>Salesforce Web-to-Lead and Web-to-Case<\/h4>\n\n<p>Used only if you choose that delivery method for a form, instead of the API.<\/p>\n\n<ul>\n<li>https:\/\/webto.salesforce.com\/servlet\/servlet.WebToLead for production orgs<\/li>\n<li>https:\/\/test.salesforce.com\/servlet\/servlet.WebToLead for sandboxes<\/li>\n<\/ul>\n\n<p>Your Salesforce organisation id and the mapped form field values are sent when a\nqueued submission is dispatched.<\/p>\n\n<h4>Salesforce sign-in<\/h4>\n\n<p>Used only if you choose the browser sign-in method when creating a connection. Your\nbrowser is sent to https:\/\/login.salesforce.com, https:\/\/test.salesforce.com or your\nown My Domain address to authorise the plugin, and the resulting authorization code is\nexchanged there for an access token.<\/p>\n\n<p>All three are provided by Salesforce, Inc. Terms of service:\nhttps:\/\/www.salesforce.com\/company\/legal\/agreements\/ . Privacy policy:\nhttps:\/\/www.salesforce.com\/company\/legal\/privacy\/ .<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/oddeven-lead-routing-for-salesforce<\/code> and activate\nit.<\/li>\n<li>Add an encryption key to <code>wp-config.php<\/code>. This step is required: until it is done\nthe plugin stores no Salesforce credential at all, and says so on screen. Click\n<strong>Generate a key<\/strong> on that screen: the key is added to <code>wp-config.php<\/code> for you\nwhen the web server can write that file, and shown once so you can keep a copy\nsomewhere safe. If the file cannot be written, you are shown the line to add\nyourself \u2014 a hosting file manager or SFTP is enough \u2014 or run\n   wp oddeven-lead-routing key:generate:\n   define( 'LBSF_ENCRYPTION_KEY', 'base64 of exactly 32 bytes' );<\/li>\n<li>In Salesforce, create an External Client App and enable the client credentials\nflow for it.<\/li>\n<li>In WordPress, go to Oddeven Lead Routing, add a connection with your consumer key and\nsecret, and test it.<\/li>\n<li>Create a feed that binds one of your forms to a Salesforce object.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20do%20i%20need%20to%20define%20lbsf_encryption_key%3F\"><h3>Why do I need to define LBSF_ENCRYPTION_KEY?<\/h3><\/dt>\n<dd><p>It is the key your Salesforce credentials are encrypted with, and it is required.\nUntil it is defined the plugin stores no credential at all and tells you so.<\/p>\n\n<p>It does not invent a key of its own, and it never borrows one from WordPress. A key\ntaken from your site's authentication salts would look convenient right up to the day\nsomething rotated that salt -- several security plugins do, on a schedule -- at which\npoint every stored Salesforce credential would become permanently unreadable, with no\nway to recover it. Being asked for one line in wp-config.php is the cheaper end of\nthat trade.<\/p>\n\n<p>Click the <strong>Generate a key<\/strong> button the plugin shows while the key is missing. It\nadds the line to wp-config.php for you when the web server can write that file, and\nshows the key once so you can back it up; it is never kept in the database. If the file\ncannot be written \u2014 it is read-only, the host needs FTP credentials, or the site sets\nDISALLOW_FILE_MODS \u2014 you are shown the line to add yourself, with the reason. WP-CLI\nusers can run <code>wp oddeven-lead-routing key:generate<\/code> instead.<\/p><\/dd>\n<dt id=\"does%20this%20support%20the%20username-password%20oauth%20flow%3F\"><h3>Does this support the username-password OAuth flow?<\/h3><\/dt>\n<dd><p>No, deliberately. Salesforce retires it in Winter '27 and it requires storing a\nuser's password. Use the client credentials flow with an External Client App.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20salesforce%20is%20down%20when%20someone%20submits%20a%20form%3F\"><h3>What happens if Salesforce is down when someone submits a form?<\/h3><\/dt>\n<dd><p>Nothing visible to the visitor. The submission is already saved, and the delivery is\nretried in the background.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20any%20data%20anywhere%20else%3F\"><h3>Does the plugin send any data anywhere else?<\/h3><\/dt>\n<dd><p>No. There is no telemetry and no phone-home of any kind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.2<\/h4>\n\n<p>A mapping row could be lost on save, and a record type set through Web-to-Lead was ignored.<\/p>\n\n<ul>\n<li>The form editor keeps a mapping row whose Salesforce field is not in the cached field list, instead of dropping it silently on the next save. This affected any field added in Salesforce within the last twelve hours, any field typed in a different case through the CSV import, and any field the object description left out: Record Type, Owner, currency, custom lookups. A field written in a different case is corrected to Salesforce's own; one that really does not exist is refused with a message, as before.<\/li>\n<li>On a form using Web-to-Lead, a row sending to RecordTypeId now reaches Salesforce as its recordType parameter. It was previously sent under the API name, which Web-to-Lead ignores, so the lead was created on the default record type.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<p>Two hardenings from a whole-plugin security review. Neither was exploitable by a visitor or by any role short of a permission only administrators hold; both are closed so the plugin's guarantees hold without qualification.<\/p>\n\n<ul>\n<li>The Salesforce org id for Web-to-Lead is governed by the connections permission everywhere: a Web-to-Lead feed must name a connection, the org id comes from that connection, and a feed editor without permission to edit connections cannot set or change one. Upgrading copies a feed's org id onto a connection that had none, so nothing that works today stops; a Web-to-Lead connection now requires an org id and it can be corrected on the connection's edit screen.<\/li>\n<li>Changing a connection's Salesforce address discards its stored secret and sign-in, because a different host is a different org. The client credentials flow asks for the secret again; the signed-in flow needs reconnecting.<\/li>\n<li>Failure-alert settings are removed on uninstall like every other option.<\/li>\n<li>A security assurance document for site owners is included under docs\/.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<p>Combine fields in one mapping row, with fallbacks.<\/p>\n\n<ul>\n<li>A fourth source on the mapping screen, \"fields combined\", takes a pattern with field keys in braces and alternatives separated by two bars, tried left to right: {company}||{first} {last}||Individual sends the company when the form has one, the person's name when it does not, and a fixed word when it has neither. That is what Salesforce's mandatory Company field needs from a form that mostly hears from individuals. Whitespace is collapsed; context keys work in braces; the importer accepts \"template\" as a source; and the generated mapping CSV suggests the name pattern for Company when a form has a name but no company field.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<p>Pair a live form with Salesforce's own Web-to-Lead form, and Web-to-Lead fixes learned from a real cutover.<\/p>\n\n<ul>\n<li>Start from a live form takes an optional upload: the HTML Salesforce generates under Setup \u2192 Web-to-Lead. The plugin reads every parameter and 00N\u2026 custom field id with its label, the org id, and the hidden values such as record type and lead source, pairs each with the WordPress form's fields by label, and produces a Web-to-Lead mapping CSV with the org id filled in. A Salesforce field nothing matches is left blank for you and refused at import until decided. Nobody has to look up a 00N\u2026 id again.<\/li>\n<li>A connection set up for Web-to-Lead can no longer be chosen for Confirmed delivery: the feed editor refuses it and says what to change, the connection list labels such connections, the import preview warns, and the delivery error names both ways out.<\/li>\n<li>A mapping written with Lead API names (LastName, Website, PostalCode, \u2026) now works over Web-to-Lead: they are translated to last_name, URL, zip and the rest, so switching delivery method does not mean retyping the mapping. A __c API name on a Web-to-Lead form is refused with a pointer to the 00N\u2026 id.<\/li>\n<li>An unconfirmed Web-to-Lead post is labelled \"Sent \u2014 outcome unknown\", with the submission detail explaining that Web-to-Lead never reports whether the lead was created and naming the address Salesforce emails reports to. The connection's notification email is described accurately: Salesforce emails a report for every post, successes included, and the lead is still created.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<p>Start a mapping from a live form's page, and map Formidable Name and Address fields part by part.<\/p>\n\n<ul>\n<li>Beside Import mappings on the Forms screen, paste the address of a page that shows a form. The plugin fetches the page once \u2014 public addresses only, no redirects followed \u2014 reads every form on it, and says for each whether it can deliver from it: Contact Form 7 and Formidable Forms field by field with labels; WPForms, Gravity Forms, Ninja Forms, Fluent Forms, Elementor Pro Forms and Forminator named and marked unsupported. A supported form gets a Download mapping CSV button producing the importer's format with the form id and every field key filled in, the obvious Lead fields suggested and marked as suggestions, the rest left for you. Fill in the Salesforce column and import. Nothing is written by the analysis.<\/li>\n<li>Formidable Name and Address fields are now offered part by part \u2014 82.first, 82.last, and line1, city, state, zip, country \u2014 so FirstName and LastName can be mapped from a Name field. The field itself is still available as one joined value. Previously the parts were flattened into one list and could not be mapped separately.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<p>Generate a key now adds it to wp-config.php for you.<\/p>\n\n<ul>\n<li>Clicking Generate a key now writes the LBSF_ENCRYPTION_KEY line into wp-config.php itself when the web server can write that file \u2014 through WordPress's own filesystem layer, via a temporary file moved into place, read back and checked before success is reported. Most sites are run by someone with a wp-admin login and no hosting access, and \"paste this line\" was an instruction they could not follow.<\/li>\n<li>The key is still shown once afterwards so it can be backed up, and is still never kept in the database.<\/li>\n<li>When the file cannot be written \u2014 it is read-only, the host needs FTP credentials, DISALLOW_FILE_MODS is set, the user is not an administrator, or the file has no recognisable place for the line \u2014 the key is shown as before, with the reason and what to do instead. An existing unusable definition is replaced rather than duplicated.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<p>Formidable Forms support, and an encryption key you can generate without a shell.<\/p>\n\n<ul>\n<li>Formidable Forms submissions can now be delivered to Salesforce. Choose Formidable Forms as the source, enter the form's ID, and map its fields; each field is identified by its Formidable field ID with the label shown beside it. Entries are captured as Formidable saves them, so a form with no email action still delivers, and repeater rows from Formidable Pro do not produce duplicate submissions.<\/li>\n<li>While LBSF_ENCRYPTION_KEY is missing or unusable, the plugin's status region offers a Generate a key button. The key is generated on the spot, shown once with the exact line to add to wp-config.php, and never stored anywhere; reloading shows the button again until the constant is detected. With script enabled a Copy button copies the line and hides it. Requires the settings capability.<\/li>\n<li>The mapping screen's field suggestions show a field's label beside its key where the two differ, and the \"this form also collects\" note names such fields as Label (key). Nothing changes for Contact Form 7.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<p>Custom forms: deliver to Salesforce from a form this plugin does not know.<\/p>\n\n<ul>\n<li>A form built by your theme or a developer can now deliver to Salesforce by firing one action from the handler it already has. It is a hook rather than a public endpoint, so nothing new faces the internet.<\/li>\n<li>A Custom forms screen, under Forms, is where a hand built form's fields are declared \u2014 which is what lets a mapping be built before the form has ever been submitted. There is no form plugin to ask.<\/li>\n<li>Field keys that arrive in real submissions are recorded and offered on that screen with an Add button, because a developer adding a field and telling nobody is the normal case rather than an error. An undeclared key can be mapped either way.<\/li>\n<li>Custom form declarations are included in configuration export and import, and removed on uninstall.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>First stable release.<\/p>\n\n<ul>\n<li>Salesforce connections through External Client Apps, using the OAuth client credentials flow or a browser sign-in. The username-password flow is not implemented and never will be.<\/li>\n<li>Contact Form 7 submissions delivered to any Salesforce object through the REST API, or to Web-to-Lead where no Salesforce administrator is available.<\/li>\n<li>Every submission is saved before it is sent, then delivered in the background by Action Scheduler, so a slow or failing Salesforce cannot break a form or lose a lead. Failed deliveries retry with backoff and end in a dead letter list you can inspect and requeue.<\/li>\n<li>Field mapping built from the object's own describe, with validation that refuses a mapping Salesforce would reject on every submission.<\/li>\n<li>Test Mode records the exact payload that would have been sent without sending it.<\/li>\n<li>Credentials encrypted at rest with sodium, under a key you supply in wp-config.php.<\/li>\n<li>Ten capabilities, so the person who watches the queue need not be the person trusted with the client secret.<\/li>\n<li>Configuration export and import for moving a setup between sites, and WP-CLI commands for everything that does not need a browser.<\/li>\n<li>Registered with WordPress's own privacy exporter and eraser, plus a configurable retention sweep.<\/li>\n<li>No telemetry, no upsells, and no admin notices except for something that is actually wrong.<\/li>\n<\/ul>","raw_excerpt":"Send WordPress form submissions to Salesforce using External Client Apps and the OAuth client credentials flow. Queued, retried, never lost.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=358650"}],"author":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/oddeveninfotech"}],"wp:attachment":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358650"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358650"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358650"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358650"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358650"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}