=== SSF Forms & Workflows ===
Contributors: ssfllc
Tags: forms, contact form, submissions, workflows, notifications
Requires at least: 6.4
Requires PHP: 8.1
Stable tag: 0.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Build website forms, keep private local submissions and inspect what happened to each notification.

== Description ==

SSF Forms & Workflows provides a visual form builder and a private submission inbox inside WordPress. Accepted entries are saved before notification work is queued. A submission reference and action receipts help distinguish a saved answer from an email that was accepted for sending.

Free includes:

* Contact, quotation-request and feedback templates, plus a blank canvas.
* Drag-and-drop ordering, labelled move controls and Alt + Up/Down keyboard ordering.
* Text, email, phone, website, paragraph, number, dropdown, single/multiple choice, date, time, hidden, section and consent fields.
* Required fields, help, choices, supported numeric/text-length bounds and basic conditional visibility.
* Appearance controls for form colors, borders, corners and width.
* A WordPress SSF Form block and the [ssf_form id="123"] shortcode.
* Local submission storage, search, form filters, pagination and private entry detail.
* CSV entry export, plus authenticated JSON export through the API.
* Portable JSON form definitions. Imports start as drafts with notifications off; private integration configuration is removed.
* Optional team email through the site's ordinary wp_mail transport, off by default.
* Queued notification receipts, bounded retries and an explicit review step for uncertain outcomes.
* Honeypot, published-form nonce checks and salted-address rate limiting.
* WordPress personal-data export/erasure and scheduled entry retention.

The separately installed SSF Forms & Workflows Pro add-on provides page steps, repeating groups, numeric calculations, private PDF/JPEG/PNG uploads, private save/resume drafts, local PDF export, conditional email routing and optional SSF workflow connections. Those features are not included in this Free package.

This release does not include payment processing, AI generation, a hosted inbox, a CRM, automatic WhatsApp sending, automatic software updates, broad third-party form migration or a remote licence server. There is no claim of WordPress.org acceptance or superiority to another form builder.

== Installation ==

1. Back up the target website and test on a separate staging site first.
2. Upload ssf-forms.zip through Plugins > Add New > Upload Plugin, then activate.
3. Open SSF Forms > All Forms and choose Create a form.
4. Edit labels, required fields, choices and visibility. Review Settings & workflows, especially retention and notification recipients.
5. Save and publish the form. Insert an SSF Form block or its shortcode on a page.
6. Open the actual public page and make a synthetic submission. Inspect the saved entry and notification receipts.
7. If notifications are needed, explicitly enable them, configure the site's mail transport and verify real receipt separately.

WordPress 6.4 and PHP 8.1 are the intended minimum platform. The accompanying release QA report records the environments actually exercised; a minimum-version header alone is not proof of compatibility testing.

== Frequently Asked Questions ==

= Where are form answers stored? =
Accepted answers, the form snapshot used for them and queued action records are stored in this WordPress installation's database. The plugin creates ssffw_forms, ssffw_entries, ssffw_actions and ssffw_rates tables with the site's database prefix. Application-level encryption at rest is not implemented. Protect database, administrator and backup access.

= Does Free send anything to SSF or an AI service? =
No SSF account, AI, telemetry or remote licence request is required. Optional email notifications use the website's existing WordPress mail transport. Another installed mail plugin may use an external email provider under its own configuration. Pro integrations send only administrator-configured data when explicitly enabled.

= What does an accepted email receipt mean? =
It means wp_mail returned true: the configured transport accepted the email for processing. It does not prove inbox delivery, reading or a customer response. Inspect the recipient mailbox or provider separately.

= How do queued actions run? =
WordPress cron processes due work in bounded batches. Site traffic and server cron configuration affect timing. An administrator can use Process queued actions in Entries. Failed actions have bounded retry handling; an interrupted worker with an unknown outcome is not automatically resent. Verify the destination before explicitly acknowledging another attempt.

= Can a lost response create duplicate entries? =
The enhanced public form keeps a stable submission identifier in session storage and reuses it after an interrupted request. The server returns the previously saved entry for the same form/key and matching canonical payload. Reusing that key with changed answers conflicts rather than replacing an entry. After confirmed success, Submit another response starts a new identifier.

= Does a normal form work without JavaScript? =
Free fields support ordinary browser posting through the same server validation and storage endpoint. The visual administrator builder needs JavaScript. Pro private uploads and repeating groups require JavaScript and display a clear notice when it is unavailable.

= Are published forms safe to page-cache? =
Exclude pages containing these forms from full-page caching that shares logged-in content or serves expired nonces. Public pages include a form nonce; signed-in forms also include a user-scoped REST nonce. Test the actual public page after theme/cache changes. Existing cache or optimization plugins are not configured automatically.

= How long are entries retained? =
New forms default to 90 days. An administrator can select another period, or 0 for manual retention. WordPress cron removes expired entries and their local queued actions in bounded batches. Timing is not guaranteed to the minute. Backups, recipient emails and copies in external services have separate retention.

= What do export and erasure cover? =
WordPress privacy tools match an explicitly submitted email field against the verified privacy-request email. Entries with no matching email may need administrator identification. CSV/JSON entry exports contain private submitted data; keep them private. Form-definition exports disable notification delivery and remove private integration configuration. Local erasure cannot recall email or delete independent external copies.

= What happens when a form or plugin is removed? =
The API's form-delete action unpublishes the form; it does not erase its entries. Deactivation stops the plugin's scheduled hooks. Removing the plugin files preserves its tables and saved data by default. Export and explicitly erase unwanted entries before retiring the plugin, under your retention policy.

= Can Pro be deactivated without losing old entries? =
Existing entries remain in the Free inbox. Published forms requiring an unavailable advanced field fail closed rather than silently collecting partial answers. Reactivate the matching Pro add-on to restore those controls. No paywall is used to prevent access to existing Free entry data.

= Is multisite or a large-volume service included? =
This is a site-level WordPress plugin. Network-wide administration, cross-site databases, unlimited archive/export size, every hosting environment and a universal throughput guarantee are not established. Exports are bounded to 10,000 matching entries and 16 MB; narrow the form/search filter for larger datasets.

== Screenshots ==

1. Form workspace and template selection.
2. Visual field canvas with keyboard and drag ordering.
3. Field conditions, appearance and notification settings.
4. Private submissions and action receipts.
5. Accessible public form and saved-submission reference.

== Changelog ==

= 0.1.0 =
Initial Free form builder, local submission storage, notification queue, entry exports, WordPress privacy integration and optional Pro extension interfaces.

== Upgrade Notice ==

= 0.1.0 =
Initial release. Review actual release QA and test a staging submission before production activation.
