{"id":395647,"date":"2026-10-30T12:00:32","date_gmt":"2026-10-30T12:00:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/herobytes-confirm-masks-for-contact-form-7\/"},"modified":"2026-10-30T12:48:11","modified_gmt":"2026-10-30T12:48:11","slug":"herobytes-confirm-masks-for-contact-form-7","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/herobytes-confirm-masks-for-contact-form-7\/","author":23588307,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"HeroBytes Confirm & Masks for Contact Form 7","header_author":"Sebasti\u00e1n Pe\u00f1aranda","header_description":"Confirmation screen before sending, input masks (phone, ID documents, dates, money, custom patterns) and simple multi-step forms for Contact Form 7. No jQuery, no external services.","assets_banners_color":"a5b6e7","last_updated":"2026-10-30 12:48:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/herobytes-confirm-masks-for-contact-form-7\/","header_author_uri":"https:\/\/profiles.wordpress.org\/herovibes\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"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":"herovibes","date":"2026-10-30 12:48:11","revision":3775264}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3775163,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3775163,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3775163,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3775163,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3775163,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3775264,"resolution":"1","location":"assets","locale":"","width":2560,"height":1600},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3775264,"resolution":"2","location":"assets","locale":"","width":2560,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3775264,"resolution":"3","location":"assets","locale":"","width":2560,"height":1600},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3775264,"resolution":"4","location":"assets","locale":"","width":2560,"height":1600},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3775264,"resolution":"5","location":"assets","locale":"","width":2560,"height":1600},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3775264,"resolution":"6","location":"assets","locale":"","width":2560,"height":1600}},"screenshots":{"1":"The confirmation screen shown in place of the form.","2":"The confirmation screen as a pop-up.","3":"Input masks while typing: phone, date and money.","4":"A multi-step form with its progress list.","5":"The Confirm &amp; Masks tab in the form editor.","6":"Global settings under Contact &gt; Confirm &amp; Masks."}},"plugin_section":[],"plugin_tags":[8381,1152,289737,127662,269121],"plugin_category":[],"plugin_contributors":[288985],"plugin_business_model":[],"class_list":["post-395647","plugin","type-plugin","status-publish","hentry","plugin_tags-confirmation","plugin_tags-contact-form-7","plugin_tags-input-mask","plugin_tags-multi-step","plugin_tags-phone-mask","plugin_contributors-herovibes","plugin_committers-herovibes"],"banners":{"banner":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/banner-772x250.png?rev=3775163","banner_2x":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/banner-1544x500.png?rev=3775163","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/icon.svg?rev=3775163","icon":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/icon.svg?rev=3775163","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/screenshot-1.png?rev=3775264","caption":"The confirmation screen shown in place of the form."},{"src":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/screenshot-2.png?rev=3775264","caption":"The confirmation screen as a pop-up."},{"src":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/screenshot-3.png?rev=3775264","caption":"Input masks while typing: phone, date and money."},{"src":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/screenshot-4.png?rev=3775264","caption":"A multi-step form with its progress list."},{"src":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/screenshot-5.png?rev=3775264","caption":"The Confirm &amp; Masks tab in the form editor."},{"src":"https:\/\/ps.w.org\/herobytes-confirm-masks-for-contact-form-7\/assets\/screenshot-6.png?rev=3775264","caption":"Global settings under Contact &gt; Confirm &amp; Masks."}],"raw_content":"<!--section=description-->\n<p>Three things people keep asking Contact Form 7 for, in one small add-on:<\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=4PB7xqJh8mI<\/p>\n\n<p><strong>1. A confirmation screen.<\/strong> Before the message is sent, the visitor sees a summary of everything they typed, with a <em>Back<\/em> button and a <em>Send<\/em> button. Fewer typos in phone numbers and emails, fewer \"sorry, I meant...\" follow-ups. Standard practice in Japan, useful everywhere.<\/p>\n\n<p><strong>2. Input masks.<\/strong> Add <code>mask:phone-us<\/code>, <code>mask:cpf<\/code>, <code>mask:date<\/code>, <code>mask:money<\/code> or your own pattern to any text or tel field and the input formats itself while the visitor types. Mobile keyboards switch to numeric automatically. Incomplete values are rejected on the server too.<\/p>\n\n<p><strong>3. Multi-step forms.<\/strong> Write <code>[step \"Title\"]<\/code> where a new step begins. Each step is validated before moving on. One form, one submission, no extra pages.<\/p>\n\n<h4>Confirmation screen<\/h4>\n\n<ul>\n<li>Turn it on per form (its own <em>Confirm &amp; Masks<\/em> tab), for every form at once (<em>Contact &gt; Confirm &amp; Masks<\/em>), or with a line <code>confirm_screen: on<\/code> in the form's Additional Settings.<\/li>\n<li>Shown in place of the form or as a pop-up over the page.<\/li>\n<li>Title, intro and button labels are editable globally and per form.<\/li>\n<li>Labels are taken from your form's <code>&lt;label&gt;<\/code> elements. Fields hidden by conditional-fields plugins are left out. Add the class <code>avoid-confirm<\/code> to anything you do not want in the summary.<\/li>\n<li>Files, checkboxes, radio buttons, selects and acceptance boxes are summarised properly.<\/li>\n<li>Keyboard and screen-reader friendly: focus moves to the summary, the pop-up traps focus and closes with Escape.<\/li>\n<li>Templates built for the old \"Contact Form 7 add confirm\" plugin keep working: the <code>[confirm]<\/code> button opens the confirmation screen and <code>[back]<\/code> is ignored.<\/li>\n<\/ul>\n\n<h4>Input masks<\/h4>\n\n<p>Add <code>mask:NAME<\/code> to a <code>[text]<\/code> or <code>[tel]<\/code> field:<\/p>\n\n<pre><code>[tel* phone mask:phone-us]\n[text* document mask:cpf]\n[text birthday mask:date placeholder \"DD\/MM\/YYYY\"]\n[text* budget mask:money]\n[text plate mask:AAA-000]\n[tel* mobile mask placeholder \"+57 (000) 000-0000\"]\n<\/code><\/pre>\n\n<p>Presets: <code>phone<\/code>, <code>digits<\/code>, <code>money<\/code>, <code>phone-us<\/code>, <code>phone-br<\/code>, <code>phone-co<\/code>, <code>phone-mx<\/code>, <code>phone-ar<\/code>, <code>phone-cl<\/code>, <code>phone-es<\/code>, <code>phone-pt<\/code>, <code>phone-uk<\/code>, <code>phone-de<\/code>, <code>phone-fr<\/code>, <code>phone-it<\/code>, <code>phone-jp<\/code>, <code>date<\/code>, <code>date-us<\/code>, <code>date-iso<\/code>, <code>time<\/code>, <code>year<\/code>, <code>cpf<\/code>, <code>cnpj<\/code>, <code>cpf-cnpj<\/code>, <code>cep<\/code>, <code>nit<\/code>, <code>rut<\/code>, <code>dni<\/code>, <code>nie<\/code>, <code>curp<\/code>, <code>rfc<\/code>, <code>zip<\/code>, <code>zip-us<\/code>, <code>postcode<\/code>.<\/p>\n\n<p>Pattern tokens: <code>0<\/code> digit, <code>9<\/code> optional digit, <code>A<\/code> letter, <code>S<\/code> letter or digit, <code>#<\/code> any character. Anything else is printed literally. Contact Form 7 does not allow spaces or brackets inside tag options, so for those write a bare <code>mask<\/code> and put the pattern in the placeholder, or define a named mask under <em>Contact &gt; Confirm &amp; Masks<\/em>.<\/p>\n\n<p>Dates and times are also checked to be real (no 31\/02). The <code>[mask* name \"(___) ___-____\" \"Placeholder\"]<\/code> tag from the old \"Contact Form 7 - Phone mask field\" plugin keeps working.<\/p>\n\n<h4>Multi-step forms<\/h4>\n\n<pre><code>[step \"About you\"]\n&lt;label&gt; Your name [text* your-name] &lt;\/label&gt;\n[step \"Your message\"]\n&lt;label&gt; Message [textarea your-message] &lt;\/label&gt;\n[submit \"Send\"]\n<\/code><\/pre>\n\n<p>A progress list shows the steps. <em>Next<\/em> validates the current step with Contact Form 7's own rules. If the server rejects a field, the form jumps back to its step. The confirmation screen, if enabled, comes after the last step.<\/p>\n\n<h4>For developers<\/h4>\n\n<ul>\n<li>Events on the form element: <code>hvcm:confirmopen<\/code>, <code>hvcm:confirmback<\/code>, <code>hvcm:confirmsend<\/code>, <code>hvcm:stepchange<\/code>.<\/li>\n<li><code>window.hvcm.init(form)<\/code> for forms inserted after page load.<\/li>\n<li>Filters: <code>hvcm_confirm_enabled<\/code>, <code>hvcm_frontend_config<\/code>, <code>hvcm_mask_presets<\/code>, <code>hvcm_incomplete_message<\/code>, <code>hvcm_always_enqueue<\/code>.<\/li>\n<li>Per-form settings live in the <code>_hvcm<\/code> post meta of the contact form. Global settings in the <code>hvcm_settings<\/code> option.<\/li>\n<\/ul>\n\n<p>No external requests, no tracking, no accounts, no jQuery. Assets load only on pages that render a form using one of the features. Uninstalling removes the option and the per-form settings.<\/p>\n\n<p>This plugin is not affiliated with the developers of Contact Form 7.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Contact Form 7 (5.6 or newer).<\/li>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it from <em>Plugins &gt; Add New<\/em>.<\/li>\n<li>Activate it.<\/li>\n<li>Edit a form: the new <strong>Confirm &amp; Masks<\/strong> tab turns on the confirmation screen and shows the mask reference.<\/li>\n<li>Optional: set global defaults in <em>Contact &gt; Confirm &amp; Masks<\/em>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"the%20summary%20shows%20%22your%20name%22%20but%20my%20label%20says%20something%20else\"><h3>The summary shows \"Your name\" but my label says something else<\/h3><\/dt>\n<dd><p>The plugin reads <code>&lt;label&gt;<\/code> elements: either wrap the field in one, or give the field an <code>id:<\/code> option and a <code>&lt;label for=\"...\"&gt;<\/code>. You can also wrap the label text in <code>&lt;span class=\"title-contactform7 for-FIELDNAME\"&gt;<\/code>. When nothing is found, the field name is prettified.<\/p><\/dd>\n<dt id=\"can%20i%20leave%20a%20field%20out%20of%20the%20confirmation%20screen%3F\"><h3>Can I leave a field out of the confirmation screen?<\/h3><\/dt>\n<dd><p>Yes. Add the class <code>avoid-confirm<\/code> (or <code>hvcm-skip<\/code>) to the field's wrapper: <code>&lt;p class=\"avoid-confirm\"&gt;[text internal-note]&lt;\/p&gt;<\/code>. Fields hidden by conditional-fields plugins are skipped automatically.<\/p><\/dd>\n<dt id=\"does%20the%20confirmation%20screen%20work%20with%20recaptcha%2C%20turnstile%20or%20akismet%3F\"><h3>Does the confirmation screen work with reCAPTCHA, Turnstile or Akismet?<\/h3><\/dt>\n<dd><p>Yes. The form is submitted through Contact Form 7's normal path after the visitor confirms, so every spam check runs as usual.<\/p><\/dd>\n<dt id=\"my%20mask%20needs%20spaces%20or%20brackets\"><h3>My mask needs spaces or brackets<\/h3><\/dt>\n<dd><p>Tag options cannot contain them. Use <code>[tel* phone mask placeholder \"(000) 000-0000\"]<\/code> (bare <code>mask<\/code> takes the placeholder as pattern) or define a named mask in <em>Contact &gt; Confirm &amp; Masks<\/em> and use <code>mask:thatname<\/code>.<\/p><\/dd>\n<dt id=\"does%20mask%3Amoney%20accept%20decimals%3F\"><h3>Does mask:money accept decimals?<\/h3><\/dt>\n<dd><p>Visitors type digits and the amount fills from the right, like a cash register: typing 1 2 5 0 gives 12.50. The separators and the number of decimals are set under <em>Contact &gt; Confirm &amp; Masks<\/em> and apply to every form on the site: <code>mask:money<\/code> cannot use different separators or decimals per form.<\/p><\/dd>\n<dt id=\"can%20i%20validate%20masks%20on%20the%20server%20only%3F\"><h3>Can I validate masks on the server only?<\/h3><\/dt>\n<dd><p>Server validation is on by default and can be switched off in the settings. Client-side formatting cannot be disabled per field; just leave <code>mask:<\/code> out of fields that do not need it.<\/p><\/dd>\n<dt id=\"does%20the%20multi-step%20form%20save%20progress%20between%20pages%3F\"><h3>Does the multi-step form save progress between pages?<\/h3><\/dt>\n<dd><p>No. All steps live on one page and are sent together. This keeps things simple and avoids storing visitor data. If you need separate pages per step, look for a dedicated multi-page plugin.<\/p><\/dd>\n<dt id=\"i%20am%20migrating%20from%20%22contact%20form%207%20add%20confirm%22%20or%20%22phone%20mask%20field%22\"><h3>I am migrating from \"Contact Form 7 add confirm\" or \"Phone mask field\"<\/h3><\/dt>\n<dd><p>Deactivate the old plugin and activate this one. <code>[confirm]<\/code>, <code>[back]<\/code> and <code>[mask* name \"(___) ___-____\"]<\/code> tags keep working. Old CSS written for the <code>wpcf7c-<\/code> classes will no longer apply; the new confirmation screen uses <code>hvcm-<\/code> classes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: confirmation screen (inline or pop-up), input masks with presets and custom patterns, multi-step forms, compatibility tags for the old \"add confirm\" and \"phone mask field\" plugins.<\/li>\n<\/ul>","raw_excerpt":"Confirmation screen before sending, input masks (phone, ID, date, money, custom) and simple multi-step forms for Contact Form 7. No jQuery.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/395647","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=395647"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/herovibes"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=395647"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=395647"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=395647"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=395647"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=395647"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=395647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}