Fluent Forms
These abilities register when Fluent Forms is detected on the site and a Pro licence is active. If either is missing the module stays absent rather than failing at call time.
At a glance
Fluent Forms registers 37 abilities: 21 that only read, 5 that write, and 11 marked destructive. That split is the practical answer to how much of this module can run unattended. Reads cost nothing and are safe to repeat, so discovery is the part to be generous with; the writes are where review belongs, and the destructive calls stop for an explicit confirmation every single time regardless of which profile is active.
What this module is for
Manage Fluent Forms forms, fields, settings, confirmations, notifications, submissions, integrations, subscriptions, and transactions through WPPilot Pro.
Before you rely on it: Financial and subscription operations deserve least-privilege access, human review, and provider-side verification.
Typical workflows
- Build and test a multi-step form configuration
- Summarize submissions without altering the form
- Review subscription and transaction records separately from content edits
The Fluent Forms integration page covers the same module from the workflow side, with the capability map and the questions worth asking before a first write.
Availability on your site
The Fluent Forms module needs three things at once: WPPilot Free as the MCP foundation, an active Pro licence, and the companion plugin detected on the site. Miss any one and the module does not register, which is deliberate: an ability that appears in the tool list but fails at call time is worse than an ability that was never offered. What the connected agent can actually call is then narrowed twice more: by the safety profile active on the site, and by the WordPress capabilities of the user behind the credential. A read that succeeds for an administrator can be absent entirely for an editor.
Every write these abilities perform is recorded in the change ledger, and destructive calls can be routed through the approval queue so a person signs off before anything is applied. A successful tool result means the operation returned, not that the front end, the cache, and every dependent template are correct: that still needs a look.
Reads
Available in every safety profile, including Read Only. Inspection costs nothing and is not rate limited.
| Ability | What it does |
|---|---|
wppilot/fluentforms-check-setupCheck Fluent Forms Setup | See the plugin source for this ability's contract. |
wppilot/fluentforms-export-submissionsExport Fluent Forms Submissions | See the plugin source for this ability's contract. |
wppilot/fluentforms-get-confirmationGet Fluent Forms confirmation | See the plugin source for this ability's contract. |
wppilot/fluentforms-get-field-type-schemaGet a Fluent Forms Field Type Detail | Detailed schema for ONE Fluent Forms field type. Returns {type, label, description, category, pro_only, supported_settings[] — the WHITELIST of keys add-field/edit-field accept under settings.*, default_attributes (FF-native), default_settings, example_input — a ready-to-pass {type, label, required, settings:{…}} payload}. Returns fluentforms_invalid_input (400) when the type is absent from the catalog. The catalog ALWAYS includes Pro types — even on a free install — so the agent can learn what would unlock with Pro; add-field still rejects Pro-only types on a free install. |
wppilot/fluentforms-get-field-types-schemaList Fluent Forms Field Types | Return the catalog of every Fluent Forms field type the integration can build via add-field / create-form. Output is compact: per entry {type, label, category, pro_only}. Use this FIRST when constructing a form, then call wppilot/fluentforms-get-field-type-schema for the per-type setting whitelist + example_input. When Pro is absent, entries with pro_only=true are filtered out — the agent never sees a type it cannot use. Categories: general (12 standard inputs + choices), advanced (composite + decorative), pro_advanced (file/image/repeater/NPS/phone/chained-select/post-selection/rich-text/…), pro_container (multi-step form_step), pro_payment (payment_method/coupon/subscription/…). |
wppilot/fluentforms-get-formGet a Fluent Forms Form | Fetch one Fluent Forms form by id. Always returns id, title, status, type, has_payment, has_conversion, created_at, updated_at. The fields[] array, settings blob, notifications list, confirmation block, and meta_keys index are OPT-IN via the include parameter — progressive disclosure keeps the default payload small. Valid include values: "fields" (decoded form_fields.fields[] + submit_button), "settings" (decoded formSettings JSON), "notifications" (decoded notifications JSON), "confirmation" (the formSettings.confirmation sub-block), "meta_keys" (deduplicated list of meta_key column values for this form). Returns fluentforms_form_not_found (404) when the id is absent. |
wppilot/fluentforms-get-form-canonicalGet Fluent Forms Form (Canonical) | Reads a single Fluent Forms form by id and returns it mapped to the plugin-agnostic form-model-schema vocabulary (17 canonical types: text/email/tel/url/number/textarea/date/time/datetime/select/radio/checkbox/file/hidden/submit/consent/group) used by the form-model-migration skill. Fluent Forms native field elements (~40 including Pro) fold onto those 17 — composites (input_name, address, container, accordion) collapse to canonical group; structural-only types (section_break, custom_html, shortcode, action_hook) drop with informational warnings; anti-spam (recaptcha, hcaptcha, turnstile), multi-page (form_step, save_progress_button), and Pro payment types (payment_method, subscription_payment, item_quantity, multi_payment_component, custom_payment_component, payment_summary_component, coupon) drop with structural warnings. The form fields blob lives at wp_fluentform_forms.form_fields (JSON-encoded {fields:[], submitButton:{}}); notifications live in wp_fluentform_form_meta (one row per notification, meta_key="notifications"); the single confirmation lives at formSettings.confirmation. Output keys: fields[] with canonical types, mail_config{} from the first enabled notification, notifications[] from the remaining ones, messages{} (empty — Fluent has no built-in message catalogue), conditional_rules[] from per-field settings.conditional_logics (mapped 1:1 when expressible), meta{} (source plugin + version + lossless formSettings echo for round-trip), plus warnings[] for everything that does not fit the canonical shape (anti-spam, payments, conversational mode, custom redirects). Smart-tag syntax {inputs.<name>} inside subject / message / recipient is rewritten to [<name>] to match the CF7 / WPForms / Gravity Forms canonical convention. Honours the same max_field_bytes truncation contract as the other canonical readers (default 8192 bytes for mail_config.body, notifications[].body, with *_truncated flags); pass max_field_bytes: 0 to disable truncation when full-fidelity canonical is required before an execute-mode migration. Returns WP_Error fluentforms_form_not_found when the id does not exist. Use this ability inside the form-model-migration workflow (Phase 2 — read source schema); for ad-hoc inspection outside the migration pipeline, prefer fluentforms-get-form which returns the Fluent-native shape. |
wppilot/fluentforms-get-form-settingsGet Fluent Forms form settings | See the plugin source for this ability's contract. |
wppilot/fluentforms-get-notificationGet a Fluent Forms notification | Fetch one notification by id. Required: form_id, notification_id. Returns {form_id, notification}. Returns fluentforms_notification_not_found (404) when no matching id exists on the form. Capability: fluentform_settings_manager. |
wppilot/fluentforms-get-quiz-reportGet Fluent Forms quiz report | See the plugin source for this ability's contract. |
wppilot/fluentforms-get-submissionGet a Fluent Forms Submission | Fetch one Fluent Forms submission by id. Always returns the compact row PLUS the decoded response mapped to friendly triples [{field_name, label, value, truncated?, full_size?}]. When Pro is loaded AND the submission has payment data, the payment block surfaces (status, method, type, currency, total, paid) — read-only. Optional: fields (whitelist — only return these field names in response[]); max_field_bytes (per-field byte cap, default 4 KiB, capped at 64 KiB). Returns fluentforms_submission_not_found (404) for missing ids. |
wppilot/fluentforms-get-subscriptionGet a Fluent Forms subscription | See the plugin source for this ability's contract. |
wppilot/fluentforms-get-transactionGet a Fluent Forms transaction | See the plugin source for this ability's contract. |
wppilot/fluentforms-list-draft-submissionsList Fluent Forms draft submissions | List save-and-resume draft submissions (partial entries the user has not yet finalised). Filterable by form_id, user_id, used (true = the user resumed and submitted; false = abandoned drafts). Compact rows include id, form_id, hash (resume token), type, step_completed, user_id, source_url, browser, device, used, created_at, updated_at. Per_page capped at 100. Capability: fluentform_entries_viewer (per-form when form_id is supplied). |
wppilot/fluentforms-list-formsList Fluent Forms | List Fluent Forms forms with optional filters. Returns compact rows (id, title, status, type, has_payment, has_conversion, submissions_total, submissions_unread, created_at, updated_at) plus pagination metadata (page, per_page, total, total_pages). Fields[] and full settings are NOT included — fetch them with wppilot/fluentforms-get-form when needed (progressive disclosure). Filters: search (partial title match), status (published|unpublished), type (form|post), has_payment (bool), page (default 1), per_page (default 25, max 200). Use this before any per-form CRUD ability to discover form ids. |
wppilot/fluentforms-list-integrationsList Fluent Forms integration feeds | List the marketing-integration / webhook / payment-platform feeds configured on a Fluent Forms form. Each entry returns {feed_id, integration, name, enabled, raw — the decoded feed body}. Required: form_id. The integration vocabulary (mailchimp / activecampaign / hubspot / convertkit / getresponse / mailerlite / google_sheet / slack / discord / zapier / make / webhook / trello / airtable / hubspot / …) is the same surface check-setup advertises under integrations_active.feeds. Empty list when the form has no configured feeds. Capability: fluentform_settings_manager (falls back to forms_manager). |
wppilot/fluentforms-list-notificationsList Fluent Forms notifications | List the email notifications configured on a Fluent Forms form. Progressive disclosure: each entry is a COMPACT row {id (the storage row id), name, subject, enabled, recipient (a flat summary of sendTo — the address, or "field:<name>" / the routing type), has_conditionals}. The heavy fields are omitted by default and opted into via include: pass any of ["message","sendTo","conditionals"] to materialise them inline; or fetch one notification in full with wppilot/fluentforms-get-notification. Required: form_id. Returns {form_id, notifications: list}. Capability: fluentform_settings_manager (falls back to forms_manager). |
wppilot/fluentforms-list-quiz-questionsList Fluent Forms quiz questions | List the quiz-enabled questions on a Fluent Forms Pro quiz form. Each entry returns {field_name, label, type, answer (correct value), points, weight}. Reads the _quiz_settings form_meta key (set when an admin enables Quiz on a form via Settings → Quiz Settings). Returns is_quiz=false and an empty list when the form has no quiz settings. Required: form_id. Capability: fluentform_settings_manager (falls back to forms_manager). |
wppilot/fluentforms-list-submissionsList Fluent Forms Submissions | See the plugin source for this ability's contract. |
wppilot/fluentforms-list-subscriptionsList Fluent Forms subscriptions | List recurring-billing subscriptions captured by Fluent Forms Pro. Filterable by form_id, submission_id, status (active|trialing|cancelled|expired|past_due), billing_interval (day|week|month|year). Compact rows include item_name, plan_name, recurring_amount, billing_interval, bill_times, bill_count, vendor_subscription_id, status, expiration_at. Per_page capped at 50. Capability: fluentform_view_payments. |
wppilot/fluentforms-list-transactionsList Fluent Forms transactions | List payment transactions captured by Fluent Forms Pro. Filterable by form_id, submission_id, subscription_id, status (paid|pending|failed|refunded|cancelled), payment_method (stripe|paypal|square|razorpay|offline|…), payment_mode (test|live), from / to (ISO date range on created_at). Returns compact rows (no payment_note / billing_address blobs to keep the payload small) plus pagination metadata. Per_page capped at 100. Capability: fluentform_view_payments. |
Writes
Gated by the active profile and your WordPress capabilities. Rate limited to 120 per minute per credential.
| Ability | What it does |
|---|---|
wppilot/fluentforms-add-fieldAdd a Field to a Fluent Forms Form | Append a new field to an existing form. Required: form_id, field — the agent-facing descriptor {type, label?, required?, name?, settings?}. The ability resolves the form, decodes form_fields.fields[], appends the new element (or inserts it at the optional position index, 0-based), re-encodes and persists. Unknown field types are rejected with fluentforms_invalid_input. Pro-only field types on a free install are rejected with fluentforms_pro_field_not_available. The name is auto-assigned (collision-safe within the form) when omitted. Returns {form_id, field — the FF-native element row just inserted, position, dropped_settings — keys filtered by the catalog whitelist}. Capability: fluentform_forms_manager. |
wppilot/fluentforms-create-formCreate a Fluent Forms Form | Create a new Fluent Forms form. Required: title (non-empty string). Optional: status ("published" | "unpublished", default "published"; an "unpublished" form renders as EMPTY output on the front end, with no message); type ("form" | "post", default "form"); fields[] — list of field descriptors using the agent-facing input shape ({type, label, required, name?, settings?}). Each field is run through ff_build_element so it lands as the native FF {element, attributes, settings, editor_options} structure. Returns the freshly-created form (compact shape) plus optional warnings.dropped_settings_per_field listing settings keys that fell outside the catalog whitelist for each field. Use wppilot/fluentforms-get-field-types-schema first to discover available field types and supported settings. |
wppilot/fluentforms-create-notificationCreate a Fluent Forms notification | See the plugin source for this ability's contract. |
wppilot/fluentforms-duplicate-formDuplicate a Fluent Forms Form | Clone an existing Fluent Forms form. Required: form_id. Optional: title — when omitted, the duplicate is titled "{original title} (copy)". Optional: include_meta (default true) — when true, copies every form_meta row so notifications, confirmations, settings, and conditional logic transfer to the clone. Submissions are NEVER copied. Returns the freshly-created form (compact shape). Capability: fluentform_forms_manager. |
wppilot/fluentforms-mark-submissionMark a Fluent Forms Submission | Mark one submission. Required: submission_id. Mutually exclusive — pass exactly ONE of: status (unread|read|spam|trashed) — sets the submission status; favourite (bool) — toggles the is_favourite flag. Returns the updated compact row. Idempotent: marking an already-read submission as read is a no-op success. Returns fluentforms_submission_not_found (404) for missing ids; fluentforms_invalid_input (400) when neither (or both) action is passed. Capability: fluentform_manage_entries. |
Destructive
Marked destructive in the source, so each call needs an explicit confirmation flag, every time.
| Ability | What it does |
|---|---|
wppilot/fluentforms-cancel-subscriptionCancel a Fluent Forms subscription | See the plugin source for this ability's contract. |
wppilot/fluentforms-delete-draft-submissionDelete a Fluent Forms draft submission | See the plugin source for this ability's contract. |
wppilot/fluentforms-delete-fieldDelete a Fluent Forms Field | Remove a field from a form, identified by its name. Required: form_id, name. Returns {form_id, removed_name, fields_remaining: int, warnings?}. When the removed field was the last one, warnings.empty_form flags that the form now has no fields and renders as empty output. Returns fluentforms_field_not_found (404) when the name is absent. NOTE: existing submissions retain the value under the old field name in their response JSON — deleting the field on the form does not retroactively redact entries. Capability: fluentform_forms_manager. |
wppilot/fluentforms-delete-formDelete a Fluent Forms Form | Permanently delete a Fluent Forms form. Required: form_id. Optional: cascade (default false) — when true, also deletes all submissions, submission_meta, entry_details and form_meta rows associated with the form (irreversible). When false (default) the form row is deleted but related data stays orphaned in the FF tables. Returns {success: true, form_id, cascaded: bool, deleted: {submissions, submission_meta, entry_details, form_meta}}. Returns fluentforms_form_not_found (404) if the id is absent. Capability: fluentform_forms_manager. |
wppilot/fluentforms-delete-notificationDelete a Fluent Forms notification | Remove one notification by id. Required: form_id, notification_id. Returns fluentforms_notification_not_found (404) when the id is absent. Other notifications keep their ids — there is no reindexing. Capability: fluentform_settings_manager. |
wppilot/fluentforms-delete-submissionDelete a Fluent Forms Submission | Permanently delete one Fluent Forms submission, including its submission_meta + entry_details rows. Required: submission_id. Returns {success: true, submission_id, form_id, deleted: {submission, submission_meta, entry_details}}. There is NO trash bin — use wppilot/fluentforms-mark-submission with status=trashed for soft-delete semantics. Returns fluentforms_submission_not_found (404) for missing ids. Capability: fluentform_manage_entries. |
wppilot/fluentforms-edit-confirmationEdit Fluent Forms confirmation | Partial-update the confirmation block. The confirmation payload is shallow-merged into formSettings.confirmation — only whitelisted keys are kept (messageToShow, redirectTo, customPage, customUrl, samePageFormBehavior); unknown keys land in warnings.dropped_keys. Pass null on a whitelisted key to remove it. When redirectTo=customUrl the customUrl must be a valid URL (esc_url_raw is applied). Required: form_id, confirmation. Capability: fluentform_settings_manager. |
wppilot/fluentforms-edit-fieldEdit a Fluent Forms Field | Patch one field in an existing form, identified by its name (the FF submission-key under attributes.name). Required: form_id, name. Mutable: label, required, settings (partial merge into the existing settings, NOT a replace — pass null on a key to remove it). Returns {form_id, field — updated FF-native row, dropped_settings}. Returns fluentforms_field_not_found (404) when the name is absent. Renaming a field is NOT supported via this ability (would orphan existing submissions); to rename, delete + add. Capability: fluentform_forms_manager. |
wppilot/fluentforms-edit-formEdit a Fluent Forms Form | Partial-update a Fluent Forms form. Required: form_id. Mutable attributes (all optional, omitted means "leave as-is"): title, status, type, fields[]. fields[] is REPLACE-semantics (passing it overwrites the entire form_fields array) — for partial field-level changes use wppilot/fluentforms-add-field / edit-field / delete-field instead. Returns the updated compact form plus optional warnings.dropped_settings_per_field. Returns fluentforms_form_not_found (404) for missing ids, fluentforms_invalid_input (400) for bad shapes. |
wppilot/fluentforms-edit-form-settingsEdit Fluent Forms form settings | Partial-update the formSettings blob. The settings payload is shallow-merged into the stored blob — only whitelisted top-level keys are accepted (restrictions, layout, submitButton, conditionals); unknown keys land in warnings.dropped_keys. Pass null on a whitelisted key to remove it. Login-required and form scheduling are NOT top-level keys — they live under restrictions (restrictions.requireLogin, restrictions.scheduleForm). Confirmation is NOT mutable here — use wppilot/fluentforms-edit-confirmation for that. Required: form_id, settings. Capability: fluentform_settings_manager (falls back to forms_manager). Returns the updated settings + warnings.dropped_keys. |
wppilot/fluentforms-edit-notificationEdit a Fluent Forms notification | Patch one notification by id. Shallow merge — only the keys you pass in notification are touched; pass null on a key to delete it. The id is immutable. Required: form_id, notification_id, notification. Returns fluentforms_notification_not_found (404) on missing id. Capability: fluentform_settings_manager. |