Skip to content
Get Discount
Formidable Forms alternatives
  • Pricing
  • Features
  • Templates
  • Integrations
  • Blog
  • Docs
  • Account
Sign in

Get Discount
Formidable Forms alternatives
Popular Search submitsubmissionentryentriespayment

Developer Docs

  • Database Tables of Fluent Forms
  • Submission Lifecycle
  • Integration Feed – Fields API
  • Creating Custom SmartCode for Form Editor
  • Limit Email Domains in Fluent Forms Form Submission
  • Email verification with Emailable
  • Email Confirmation Field
  • How to make a login form with Fluent Form
  • How to make a strong password requirement in user registration forms with Fluent Forms
  • Create Unique Fields in Fluent Forms
  • Populate dropdown field options from Google Sheet
  • Form PHP API
  • PHP Action Hooks
  • PHP Filter Hooks
  • Useful Snippets
  • Creating Pretty Conversational Form URL Slug
  • How to create your own custom field with Fluent Forms

Action Hooks

  • fluentform/before_insert_submission
  • fluentform/submission_inserted
  • fluentform/before_submission_confirmation
  • fluentform/inserted_new_form
  • fluentform/before_form_render
  • fluentform/loaded
  • fluentform/before_form_actions_processing
  • fluentform/before_insert_payment_form
  • flentform/form_duplicated
  • fluentform/form_imported
  • fluentform/after_save_form_settings
  • fluentform/editor_init
  • fluentform/loading_editor_assets
  • fluentform/before_editor_start
  • fluentform/after_editor_start
  • fluentform/after_form_screen_wrapper
  • fluentform/before_form_screen_wrapper
  • fluentform/render_item_{$item}
  • fluentform/after_form_render
  • fluentform/form_element_start
  • fluentform/render_item_step_start
  • fluentform/render_item_step_end
  • fluentform/rendering_calculation_form
  • fluentform/maybe_scheduled_jobs
  • fluentform/do_email_report_scheduled_tasks
  • fluentform/before_permission_set_assignment
  • fluentform/after_permission_set_assignment
  • fluentform/global_menu
  • fluentform/after_form_navigation
  • fluentform/form_application_view_{$route}
  • fluentform/init_custom_stylesheet
  • fluentform/load_form_assets
  • fluentform/scripts_registered
  • fluentform/render_payment_entries
  • fluentform/pre_load_scripts
  • fluentform/submission_note_stored
  • fluentform/starting_file_upload
  • fluentform/global_notify_completed
  • fluentform/save_global_integration_settings_{ $settingsKey}
  • fluentform/integration_action_result
  • fluentform/email_summary_details
  • fluentform/email_template_after_footer
  • fluentform/addons_page_render_{$current_menu_item}
  • fluentform/before_form_settings_app
  • fluentform/after_form_settings_app
  • fluentform/form_settings_container_{$current_sub_route}
  • fluentform/before_global_settings_wrapper
  • fluentform/after_global_settings_wrapper
  • fluentform/global_settings_component_{$currentComponent}
  • fluentform/after_global_settings_option_render
  • fluentform/before_global_settings_option_render
  • fluentform/before_tools_wrapper
  • fluentform/after_tools_wrapper
  • fluentform/before_tools_container
  • fluentform/after_tools_container
  • fluentform/form_styler
  • fluentform/after_style_generated
  • fluentform/conversational_frame_head
  • fluentform/conversational_frame_footer
  • fluentform/user_registration_before_start
  • fluentform/created_user
  • fluentform/user_registration_completed
  • fluentform/post_integration_success
  • fluentform/entry_confirmation
  • fluentform/before_partial_entry_deleted
  • fluentform/after_partial_entry_deleted
  • flunetform/render_payment_entries
  • fluentform/before_all_entries_render
  • fluentform/after_all_entries_render
  • fluentform/before_deleting_entries
  • fluentform/after_deleting_entries
  • fluentform/payment_receipt_before_content
  • fluentform/payment_receipt_after_content
  • fluentform/payment_frameless_{$paymentMethod}
  • fluentform/rending_payment_method_{$methodName}
  • fluentform/payment_method_render_{$methodName}
  • fluentform/before_payment_status_change
  • fluentform/after_payment_status_change
  • fluentform/payment_refunded_{$method}
  • fluentform/payment_refunded
  • fluentform/payment_refund_updated_{$method}
  • fluentform/payment_refund_updated
  • fluentform/ipn_paypal_action_{$txn_type}
  • fluentform/ipn_endpoint_{$paymentMethod}
  • fluentform/ipn_paypal_action_web_accept

Filter Hooks

  • fluentform/insert_response_data
  • fluentform/filter_insert_data
  • fluentform/submission_confirmation
  • fluentform/validate_input_item_{input_key}
  • fluentform/entry_statuses_core
  • fluentform/rendering_field_data_{INPUT_KEY}
  • fluentform/email_body
  • fluentform/rendering_field_data_select
  • fluentform/filter_email_attachments
  • fluentform/rendering_form
  • fluentform/is_form_renderable
  • fluentform/is_handling_submission
  • fluentform/validation_errors
  • fluentform/honeypot_name
  • fluentform/before_render_item
  • fluentform/rendering_field_html_{$elementName}
  • fluentform/skip_no_conflict
  • fluentform/load_styles
  • fluentform/load_default_public
  • fluentform/is_hide_submit_btn_{ $formId}
  • fluentform/form_class
  • fluentform/html_attributes
  • fluentform/editor_shortcodes
  • fluentform/shortcode_parser_callback_{smart_code_name}
  • fluentform/all_editor_shortcodes
  • fluentform/smartcode_group_{$group}
  • fluentform/payment_smartcode
  • fluentform/entry_statuses_core
  • fluentform/nonce_verify
  • fluentform/nonce_error
  • fluentform/numeric_styles
  • fluentform/akismet_fields
  • fluentform/will_return_html
  • fluentform/honeypot_status
  • fluentform/dashboard_notices
  • fluentform/is_admin_page
  • fluentform/single_response_data
  • fluentform/available_date_formats
  • fluentform/permission_set
  • fluentform/api_all_logs
  • fluentform/api_success_log
  • fluentform/api_failed_log
  • fluentform/truncate_password_values
  • fluentform/verify_user_permission_{ $eachPermission}
  • fluentform/permission_callback
  • fluentform/nonce_error
  • fluentform/editor_init_element_{$element}
  • fluentform/editor_validation_rule_settings
  • fluentform/editor_element_settings_placement
  • fluentform/editor_components
  • fluentform/editor_countries
  • fluentform/editor_element_customization_settings
  • fluentform/addons_extra_menu
  • fluentform/global_addons
  • fluentform/global_integration_settings_{$settingsKey}
  • fluentform/global_integration_fields_{$settingsKey}
  • fluentform/global_notification_active_types
  • fluentform/notifying_async_{$integrationKey}
  • fluentform/mailchimp_keep_existing_interests
  • fluentform/mailchimp_keep_existing_tags
  • fluentform/global_notification_feed_{$meta_key}
  • fluentform/integration_data_{$integrationKey}
  • fluentform/shortcode_defaults
  • fluentform/info_shortcode_defaults
  • fluentform/get_raw_responses
  • fluentform/export_data
  • fluentform/shortcode_feed_text
  • fluentform/entry_lists_labels
  • fluentform/all_entries
  • fluentform/step_string
  • fluentform/global_form_vars
  • fluentform/all_entry_labels
  • fluentform/all_entry_labels_with_payment
  • fluentforms/recaptcha_v3_ref_score
  • fluentform/auto_read
  • fluentform/create_default_settings
  • fluentform/form_fields_update
  • fluentform/submissions_widgets
  • fluentform/disabled_analytics
  • fluentform/submission_notes
  • fluentform/store_submission_note
  • fluentform/disable_attachment_delete
  • fluentform/response_render_{element}
  • fluentform/settings_module_{$module}
  • fluentform/rendering_field_html_{$element}
  • fluentform/validation_message_{$ruleName}
  • fluentform/item_rules_{$item}
  • fluentform/send_plain_html_email
  • fluentform/submission_message_parse
  • fluentform/email_subject
  • fluentform/email_body
  • fluentform/email_to
  • fluentform/email_header
  • fluentform/email_footer
  • fluentform/email_styles
  • fluentform/email_template_footer_text
  • fluentform/email_attachments
  • fluentform/email_summary_body_text
  • fluentform/email_summary_footer_text
  • fluentform/email_content_type_header
  • fluentform/email_template_header_image
  • fluentform/email_template_email_heading
  • fluentform/email_template_colors
  • fluentform/nonce_verify
  • fluentform/popup_shortcode_defaults
  • fluentform/survey_shortcode_defaults
  • fluentform/itl_options
  • fluentform/ip_provider
  • fluentform/post_type_selection_types_args
  • fluentform/post_selection_types
  • fluentform/post_selection_posts_pre_data
  • fluentform/post_selection_label_by
  • fluentform/user_registration_field_defaults
  • fluentform/icontact_request_args
  • fluentform/user_registration_feed_fields
  • fluentorm/user_registration_creatable_roles
  • fluentform/payment_settings_{$method}
  • fluentform/payment_method_settings_validation_{$method}
  • fluentform/payment_submission_data
  • fluentform/submission_order_items
  • fluentform/payment_field_{$elementName}
  • fluentform/stripe_checkout_args
  • fluentform/uploader_args
  • fluentform/file_uploaded
  • fluentform/file_upload_params
  • fluentform/default_upload_path
  • fluentform/file_upload_validations
  • fluentform/file_upload_validation_error
  • fluentform/disable_inputmode
  • fluentform/file_type_options
  • fluentform/default_upload_path

Reference API Classes

  • BaseFieldManager Class
  • Integration Manager Class
  • PDF Template Manager Class
  • Base Payment Method Class
  • BaseProcessor Class

Data Definations

  • $submission_data Array
  • $form Object
View Categories
  • Home
  • Docs
  • Developer Documentation
  • Developer Docs
  • Submission Lifecycle

Submission Lifecycle

In this article, we will cover how the Fluent Forms submission Life-cycle happens under the hood. From submit button click to get a confirmation message.

If you are an advanced user open the file app/Modules/SubmissionHandler/SubmissionHandler.php file and check the submit() method to see the full implementation.

Server Side Lifecycle #

The following steps completed one by one

  1. Prepare the submitted the data
  2. Validate the data
  3. Prepare to insert data
  4. Insert the data & initiate integrations and notifications
  5. Send the response to the browser as a JSON response
ff submission life cycle 601

Step 1: Preparing the Data #

In this step, Fluent Forms set up the form data, available inputs, and submitted data from the browser. No major hooks fired in this step.

// Parse the url encoded data from the request object.
parse_str($this->app->request->get('data'), $data);

// Merge it back again to the request object.
$this->app->request->merge(['data' => $data]);

$formId = intval($this->app->request->get('form_id'));

$this->setForm($formId);

// Parse the form and get the flat inputs with validations.
$fields = FormFieldsParser::getInputs($this->form, ['rules', 'raw']);

// Sanitize the data properly.
$this->formData = fluentFormSanitizer($data, null, $fields);

Step 2: Validate the data #

In this step, Fluent Forms validate the submitted data. If there has been any error or validation failure then it sends an error response to the client with in details errors object as JSON.

private function validate(&$fields)
{
    // Validate the form restrictions
    $this->validateRestrictions($fields);
    // Validate the form nonce. By default it does not verify as many people use caching
    $this->validateNonce();
    // If recaptcha enabled then it verify it.
    $this->validateReCaptcha();

    // Validate the required fields and offer each element to do their own validation. 
    // Please check the source code to get elements level validation filter hook.
}

Step 3: Prepare insert data #

In this step, Fluent Forms prepare the data to insert into the database. You can use the following hooks to alter/format the data as per your need.

  • fluentform/insert_response_data -> Use this to filter the actual response from the client
  • fluentform/filter_insert_data -> The full entry. You don’t need to use this for almost 99% of cases.

Please check the corresponding filter hook doc for more information and its structure.

Step 4: Insert the data #

In this step Fluent Forms provide an action hook before inserting data, inserting the data, and as well as after the submission hook. It’s an important hook for developers to do extended validations and post custom integrations.

Before Insert Action Hook: fluentform/before_insert_submission

After Insert Action Hook: fluentform/submission_inserted

If you want to do extended validation please use the fluentform/before_insert_submission hook. Check the corresponding hook documentation for more details.

Step 5: Send a response #

This is the final step as everything is done and all the integrations and notifications are being processed. Fluent Forms finds the appropriate confirmation and send a response accordingly. You can use fluentform/submission_confirmation filter to alter the confirmation programmatically.

Server Side Hooks List for Submission #

The hooks are fired as below (Step by Step)

  • fluentform/insert_response_data [filter]
  • fluentform/filter_insert_data [filter]
  • fluentform/before_insert_submission [action]
  • fluentform/submission_inserted [action]
  • fluentform/submission_confirmation [filter]
  • fluentform/before_submission_confirmation [action]

Client Side Submission Lifecycle #

When you click the submit button the following steps are completed step by step

  1. Validate the data
    • If validation is OK go to step 2
    • If validation failed, Stop and show the error messages
  2. prepare form data
  3. add loading icon to submit button
  4. make the Ajax call to the server and wait for the server’s response
    • If the response success then go to step 5
    • If the response is failed, stop and trigger jQuery “fluentform_submission_failed” event to the jquery form object with the response
  5. Trigger jQuery event “fluentform_submission_success” in the $form jQuery object with the response
  6. Show a success message and redirect the user if confirmation is set so.
  7. remove submit button loading.
var $inputs = $formSubmission
    .find(':input').filter(function (i, el) {
        return !$(el).closest('.has-conditions').hasClass('ff_excluded');
    });

validate($inputs);

var formData = {
    data: $inputs.serialize(),
    action: 'fluentform_submit',
    form_id: $formSubmission.data('form_id')
};

$(formSelector + '_success').remove();
$(formSelector + '_errors').html('');
$formSubmission.find('.error').html('');

$formSubmission
    .find('.ff-btn-submit')
    .addClass('disabled')
    .attr('disabled', 'disabled')
    .parent()
    .append('<div class="ff-loading"></div>');

$.post(fluentFormVars.ajaxUrl, formData)
    .then(function (res) {
        $theForm.trigger('fluentform_submission_success', {
            form: $theForm,
            response: res
        });

        if ('redirectUrl' in res.data.result) {
            if (res.data.result.message) {
                $('<div/>', {
                    'id': formId + '_success',
                    'class': 'ff-message-success'
                })
                    .html(res.data.result.message)
                    .insertAfter($theForm);
                $theForm.find('.ff-el-is-error').removeClass('ff-el-is-error');
            }

            location.href = res.data.result.redirectUrl;
            return;
        } else {
            $('<div/>', {
                'id': formId + '_success',
                'class': 'ff-message-success'
            })
                .html(res.data.result.message)
                .insertAfter($theForm);

            $theForm.find('.ff-el-is-error').removeClass('ff-el-is-error');

            if (res.data.result.action == 'hide_form') {
                $theForm.hide();
            } else {
                $theForm[0].reset();
            }
        }
    })
    .fail(function (res) {
        $theForm.trigger('fluentform_submission_failed', {
            form: $formSubmission,
            response: res
        });

        showErrorMessages(res.responseJSON.errors);
        scrollToFirstError(350);

        if ($theForm.find('.fluentform-step').length) {
            var step = $theForm
                .find('.error')
                .not(':empty:first')
                .closest('.fluentform-step');

            let goBackToStep = step.index();
            updateSlider(goBackToStep, 350, false);
        }
    })
    .always(function (res) {
        $formSubmission
            .find('.ff-btn-submit')
            .removeClass('disabled')
            .attr('disabled', false)
            .siblings('.ff-loading')
            .remove();
        // reset reCaptcha if available.
        if (window.grecaptcha) {
            grecaptcha.reset(
                getRecaptchaClientId(formData.form_id)
            );
        }
    });

Tutorial
What are your Feelings
Share This Article :
  • Facebook
  • X
  • LinkedIn
  • Pinterest
Still stuck? How can we help?

How can we help?

Updated on May 12, 2025
Database Tables of Fluent FormsIntegration Feed – Fields API

Powered by BetterDocs

Table of Contents
  • Server Side Lifecycle
  • Step 1: Preparing the Data
  • Step 2: Validate the data
  • Step 3: Prepare insert data
  • Step 4: Insert the data
  • Step 5: Send a response
  • Server Side Hooks List for Submission
  • Client Side Submission Lifecycle

Fluent Forms is a lightweight, fastest WordPress contact form plugin empowering 500K+ businesses worldwide.

Email Newsletter

fluentform Newsletter Inline
Free tutorials, exclusive contents & more.
Facebook Facebook Group Twitter Instagram Linkedin YouTube WordPress

Resources

  • Account
  • Contact Us
  • Get Support
  • Brand Guideline
  • Changelog
  • Documentation
  • Developers Docs
  • API Docs
  • Report a Security Issue

Addons

  • Signature
  • PDF Generator (Free)
  • Mautic (Free)
  • Mailpoet (Free)

Calculators

  • GKI Calculator
  • Pay Raise Calculator
  • Fuel Cost Calculator
  • All Calculator Forms

Comparison

  • Free vs. Pro
  • Fluent Forms vs. WPForms
  • Fluent Forms vs. Gravity Forms
  • Fluent Forms vs. Ninja Forms
  • Fluent Forms vs. Forminator

Features

  • Conversational Forms
  • Multi-Step Forms
  • Conditional Logic
  • Numeric Calculation
  • Payment
  • Quiz and Survey
  • Form Security
  • Advanced Form Styler
  • Advanced Post Creation
  • Address Autocomplete
  • Form to PDF

OUR PRODUCTS

  • FluentCommunity
  • FluentCRM
  • FluentBooking
  • FluentBoards
  • Fluent Support
  • FluentSMTP
  • Ninja Tables
  • WP Social Ninja
  • Paymattic
  • AzonPress
  • FluentSnippets

Copyright © 2025 Fluent Forms, a brand of WPManageNinja™.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

  • Affiliate
  • Privacy Policy
  • Terms & Conditions
The Free Version of Fluent Forms is Ready! We’ll send it to your email.
Direct Download – CTA- Homepage

By downloading you agree to our terms of use and privacy policy.

  • Pricing
  • Features
  • Templates
  • Integrations
  • Blog
  • Docs
  • Account