{"id":364861,"date":"2026-09-09T04:09:49","date_gmt":"2026-09-09T04:09:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/acs-contact-form\/"},"modified":"2026-09-09T04:09:30","modified_gmt":"2026-09-09T04:09:30","slug":"acs-contact-form","status":"publish","type":"plugin","link":"https:\/\/vec.wordpress.org\/plugins\/acs-contact-form\/","author":18367462,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.2","stable_tag":"2.0.2","tested":"7.1","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"ACS Contact Form","header_author":"ACS","header_description":"A light contact form that also follows up: every message is saved, sorted into estimate, consultation, recruiting, sales or spam, and a reminder arrives when one has been left unanswered.","assets_banners_color":"6b7788","last_updated":"2026-09-09 04:09:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/acs-developer.com\/acs-contact-form\/","header_author_uri":"https:\/\/acs-developer.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.2":{"tag":"2.0.2","author":"hanchan","date":"2026-09-09 04:09:30","revision":3687557}},"upgrade_notice":{"2.0.2":"<p>Internal names now use the acscf prefix and your data is migrated automatically. The AI reply draft moved to the WordPress core AI Client, so connect a provider under Settings &gt; Connectors. Requires WordPress 7.0.<\/p>","2.0.0":"<p>Your forms and settings are kept. New submissions are now saved in WordPress, sorted into categories, and chased with a reminder if nobody answers them.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3687557,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3687557,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3687557,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3687557,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"acs-contact-form\/form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"acs-contact-form\/form","version":"2.0.2","title":"ACS Form","category":"widgets","icon":"email-alt","description":"Place a form built with ACS Contact Form.","textdomain":"acs-contact-form","supports":{"html":false},"attributes":{"formId":{"type":"string","default":""}},"editorScript":"acscf-block"}},"tagged_versions":["2.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3687557,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3687557,"resolution":"2","location":"assets","locale":"","width":1440,"height":1250},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3687557,"resolution":"3","location":"assets","locale":"","width":1440,"height":1500},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3687557,"resolution":"4","location":"assets","locale":"","width":1440,"height":1050},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3687557,"resolution":"5","location":"assets","locale":"","width":1440,"height":1400},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3687557,"resolution":"6","location":"assets","locale":"","width":1200,"height":1750}},"screenshots":{"1":"Enquiries \u2014 every submission with its category, status and how long it has been waiting, with filters and CSV export","2":"One enquiry \u2014 the full message, the attachments, a reply draft and your own notes, with status on the right","3":"Settings \u2014 which categories notify you, how many days before the reminder, and the keyword rules for each category","4":"Settings \u2014 the optional reply draft, off until an AI provider is connected to WordPress","5":"The form builder \u2014 field order, standard fields, custom fields, attachments and mail settings on one screen","6":"The form as a visitor sees it"}},"plugin_section":[],"plugin_tags":[358,2253,4040,1159,599],"plugin_category":[54],"plugin_contributors":[271046],"plugin_business_model":[],"class_list":["post-364861","plugin","type-plugin","status-publish","hentry","plugin_tags-contact-form","plugin_tags-form-builder","plugin_tags-inbox","plugin_tags-notification","plugin_tags-spam","plugin_category-security-and-spam-protection","plugin_contributors-hanchan","plugin_committers-hanchan"],"banners":{"banner":"https:\/\/ps.w.org\/acs-contact-form\/assets\/banner-772x250.png?rev=3687557","banner_2x":"https:\/\/ps.w.org\/acs-contact-form\/assets\/banner-1544x500.png?rev=3687557","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/acs-contact-form\/assets\/icon-128x128.png?rev=3687557","icon_2x":"https:\/\/ps.w.org\/acs-contact-form\/assets\/icon-256x256.png?rev=3687557","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/acs-contact-form\/assets\/screenshot-1.png?rev=3687557","caption":"Enquiries \u2014 every submission with its category, status and how long it has been waiting, with filters and CSV export"},{"src":"https:\/\/ps.w.org\/acs-contact-form\/assets\/screenshot-2.png?rev=3687557","caption":"One enquiry \u2014 the full message, the attachments, a reply draft and your own notes, with status on the right"},{"src":"https:\/\/ps.w.org\/acs-contact-form\/assets\/screenshot-3.png?rev=3687557","caption":"Settings \u2014 which categories notify you, how many days before the reminder, and the keyword rules for each category"},{"src":"https:\/\/ps.w.org\/acs-contact-form\/assets\/screenshot-4.png?rev=3687557","caption":"Settings \u2014 the optional reply draft, off until an AI provider is connected to WordPress"},{"src":"https:\/\/ps.w.org\/acs-contact-form\/assets\/screenshot-5.png?rev=3687557","caption":"The form builder \u2014 field order, standard fields, custom fields, attachments and mail settings on one screen"},{"src":"https:\/\/ps.w.org\/acs-contact-form\/assets\/screenshot-6.png?rev=3687557","caption":"The form as a visitor sees it"}],"raw_content":"<!--section=description-->\n<p>Most contact forms end at \"mail sent\". The enquiry then lives in an inbox, next to newsletters and invoices, and the one that mattered gets answered four days late \u2014 or not at all.<\/p>\n\n<p><strong>ACS Contact Form<\/strong> keeps the light, dependency free form of version 1 and adds the part that comes after the send button.<\/p>\n\n<h4>Every message is kept in WordPress<\/h4>\n\n<p>Submissions are stored in your own database and listed in the admin: form name, sender, subject, category, status, when it arrived and how long it has been sitting there. Nothing depends on a mail server that may or may not deliver.<\/p>\n\n<ul>\n<li>Status is <strong>Untouched<\/strong>, <strong>In progress<\/strong> or <strong>Done<\/strong>, and starts at Untouched<\/li>\n<li>Change status and category straight from the list, or open one message for the full detail<\/li>\n<li>Filter by form, category and status, search the saved text, and export the current view to CSV<\/li>\n<li>The detail screen shows every field, the attachments, the reply draft and a history of your own notes<\/li>\n<\/ul>\n\n<h4>Messages sort themselves<\/h4>\n\n<p>Each submission is scored against keyword rules and filed as <strong>Estimate<\/strong>, <strong>Consultation<\/strong>, <strong>Recruiting<\/strong>, <strong>Sales<\/strong> or <strong>Spam<\/strong>. Anything that matches nothing becomes Consultation, so nothing disappears.<\/p>\n\n<ul>\n<li>The rules are plain keyword lists you can edit \u2014 the defaults are written for Japanese enquiries<\/li>\n<li>Subject, body and the sender's mail domain are all considered<\/li>\n<li>On a tie, the category that does <strong>not<\/strong> suppress the notification wins, so an ambiguous message is never quietly filed away<\/li>\n<li>Spam signals: the honeypot field, a body full of links, and text with no Japanese in it at all<\/li>\n<\/ul>\n\n<p><strong>Sales and spam do not send you a notification mail by default.<\/strong> They still appear in the list, so you can look when you feel like it instead of every time a cold pitch arrives. Which categories notify you is a setting.<\/p>\n\n<h4>A reminder when something is left<\/h4>\n\n<p>If a message is still Untouched after three days, a single daily mail lists everything that has been forgotten, with a link to each one. The threshold is a setting, zero switches it off, and messages marked In progress are left alone.<\/p>\n\n<h4>An optional reply draft<\/h4>\n\n<p>If \u2014 and only if \u2014 you have connected an AI provider to WordPress itself under <strong>Settings &gt; Connectors<\/strong>, the detail screen gains a <strong>Write a draft reply<\/strong> button. The draft appears in an editable box; you read it, fix it, and send it from your own mail client. The plugin asks the WordPress core AI Client for the text; it holds no API key of its own and never contacts a provider directly. With nothing connected, the button is not shown. See <strong>External services<\/strong> below.<\/p>\n\n<h4>Still the same form<\/h4>\n\n<p>The form builder, the shortcode, the block, the design settings and the auto-reply from version 1 all work exactly as before. Updating from 1.1.2 keeps every form and every setting.<\/p>\n\n<ul>\n<li>Drag-free ordering of standard fields, custom fields and the attachment field<\/li>\n<li>Text, textarea, select, radio and checkbox custom fields<\/li>\n<li>Colours, radii and required badges per form<\/li>\n<li>Ajax submission with no jQuery<\/li>\n<li>Honeypot spam trap, no third-party captcha, no external request<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external service, and it stores no API key.<\/p>\n\n<p>One optional feature, <strong>the AI reply draft<\/strong>, is built on the AI Client that ships with WordPress 7.0. The plugin hands the prompt to <code>wp_ai_client_prompt()<\/code> and reads the answer back. Which provider that reaches, which model it uses and where the credentials live are decided by WordPress itself, on <strong>Settings &gt; Connectors<\/strong>. If no provider is connected there, the draft button is not shown and nothing is ever sent.<\/p>\n\n<p>When you press \"Write a draft reply\" (or, if you switch that option on, when a submission arrives), the text handed to the AI Client contains: the subject and the field values of that one submission, the sender's name, your site name, the name you set as the person replying, and the tone you selected. Nothing else is included, and nothing is sent for messages you do not act on.<\/p>\n\n<p>Please read the terms of whichever provider you connect to WordPress before switching the feature on, and tell your visitors in your own privacy policy if you enable it.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin stores what a visitor typed into your form, plus the page the form was submitted from and, unless you switch that off, the sender's IP address. Attachments are stored as files inside your uploads directory.<\/p>\n\n<p>This data stays on your own server. It is registered with the WordPress personal data tools, so an export request includes the stored submissions of that email address and an erasure request deletes them together with their attachments. Individual messages can also be deleted from the list at any time.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP under Plugins &gt; Add New &gt; Upload Plugin, then activate it<\/li>\n<li>Open <strong>ACS Forms &gt; Add New<\/strong>, name the form, and switch on the fields you need<\/li>\n<li>Set the destination address under <strong>Mail settings<\/strong>, and send yourself a test mail from the box on the right<\/li>\n<li>Copy the shortcode from the form list, or place the <strong>ACS Form<\/strong> block on a page<\/li>\n<li>Open <strong>ACS Forms &gt; Enquiries<\/strong> to see what arrives, and <strong>ACS Forms &gt; Settings<\/strong> to adjust the categories, the reminder and, if you want one, the reply draft<\/li>\n<\/ol>\n\n<p>Updating from version 1: activate as usual. Forms, mail settings and design settings are read from the same place as before; storage, classification and the reminder start with the next submission.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20the%20submissions%20stored%3F\"><h3>Where are the submissions stored?<\/h3><\/dt>\n<dd><p>In your own WordPress database, as a private post type that is not readable from the front end, plus its post meta. Attachments are written to a separate folder inside your uploads directory under a random, unguessable file name, with an Apache deny rule and an index file, and the download links in the admin check both a nonce and a capability. You can switch storage off entirely and go back to mail-only behaviour.<\/p><\/dd>\n<dt id=\"who%20can%20read%20the%20enquiries%3F\"><h3>Who can read the enquiries?<\/h3><\/dt>\n<dd><p>Users who can manage options \u2014 administrators by default. The capability can be changed with the <code>acscf_manage_capability<\/code> filter.<\/p><\/dd>\n<dt id=\"why%20does%20the%20plugin%20not%20send%20the%20reply%20for%20me%3F\"><h3>Why does the plugin not send the reply for me?<\/h3><\/dt>\n<dd><p>Because <code>wp_mail()<\/code> is not a reliable way to reach a customer's inbox, and a misfired reply from a web server is worse than a late one. The draft is written for you to copy, and there is a link that opens your own mail client with the address, the subject and the draft already filled in.<\/p><\/dd>\n<dt id=\"the%20classification%20put%20a%20message%20in%20the%20wrong%20box.\"><h3>The classification put a message in the wrong box.<\/h3><\/dt>\n<dd><p>Open <strong>Settings &gt; Classification<\/strong> and edit the keyword list. You can also change the category of any single message from the list or the detail screen; the change is kept.<\/p><\/dd>\n<dt id=\"will%20the%20reminder%20mail%20me%20forever%3F\"><h3>Will the reminder mail me forever?<\/h3><\/dt>\n<dd><p>It only counts messages that are still Untouched and in a category you have chosen to be notified about. Marking a message In progress or Done takes it out of the reminder immediately.<\/p><\/dd>\n<dt id=\"does%20anything%20leave%20my%20site%3F\"><h3>Does anything leave my site?<\/h3><\/dt>\n<dd><p>Nothing is sent by this plugin. The optional reply draft goes through the WordPress core AI Client, so a request leaves your site only if you have connected an AI provider to WordPress under Settings &gt; Connectors and you press the draft button. There is no license check, no telemetry, no update server and no external font or script.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20my%20data%20when%20i%20delete%20the%20plugin%3F\"><h3>Can I keep my data when I delete the plugin?<\/h3><\/dt>\n<dd><p>Yes, and that is the default. Deletion of your forms, submissions and attachments happens only if you switch on \"delete data on uninstall\" in the settings first.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Changed: every function, class, constant, option, post type, meta key, shortcode, hook, cron event and script handle now uses the <code>acscf<\/code> prefix, so no name is shorter than four characters. A one-time migration runs on the first admin page load and carries your settings, forms, submissions and embedded shortcodes over; the old options are left untouched so the update can be rolled back.<\/li>\n<li>Changed: the AI reply draft now uses the WordPress core AI Client (WordPress 7.0 and later). The provider, model and API key fields have been removed from the plugin: connect a provider under Settings &gt; Connectors instead. The plugin makes no direct provider connections.<\/li>\n<li>Changed: requires WordPress 7.0 or later.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fix: frontend submissions failed with a nonce error because the AJAX request did not include the frontend nonce. The nonce is now sent with every submission.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New: submissions are stored in WordPress and listed in the admin, with status, category, search, filters and CSV export<\/li>\n<li>New: a detail screen with the full message, attachments, a reply draft, reply history notes and a \"mark as replied\" action<\/li>\n<li>New: automatic classification into estimate, consultation, recruiting, sales and spam, with editable keyword rules<\/li>\n<li>New: sales and spam no longer send a notification mail by default; which categories notify you is a setting<\/li>\n<li>New: a daily reminder about submissions left untouched for a configurable number of days<\/li>\n<li>New: an optional AI reply draft, off by default, using an API key you provide yourself<\/li>\n<li>New: attachments are kept with the submission in a protected folder and served only to authorised users<\/li>\n<li>New: personal data exporter and eraser, and an uninstall routine that only removes data if you ask it to<\/li>\n<li>Improved: stricter attachment checks (extension allow list, real file type verification, size and count limits, random file names)<\/li>\n<li>Improved: every screen goes through nonce and capability checks, and every output is escaped<\/li>\n<li>Removed: the external update check of the previous distribution<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Improved: test mail from the form edit screen<\/li>\n<li>Fixed: field order handling for custom fields<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Improved: design settings<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: attachment support and field ordering<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release<\/li>\n<\/ul>","raw_excerpt":"A contact form that also follows up: every message is saved, sorted, and chased with a reminder until somebody answers it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/364861","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=364861"}],"author":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hanchan"}],"wp:attachment":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=364861"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=364861"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=364861"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=364861"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=364861"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=364861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}