diff --git a/includes/abstract-integration.php b/includes/abstract-integration.php
index 11820fda6064e14b93e32b9fc634a059dd704133..9c84d778a30e7ebefdbbf2a37325399ae290c460 100644
--- a/includes/abstract-integration.php
+++ b/includes/abstract-integration.php
@@ -261,7 +261,12 @@ abstract class Integration extends Singleton
             foreach ($pipes as $pipe) {
                 if ($pipe['from'] === $field) {
                     unset($payload[$field]);
-                    $payload[$pipe['to']] = $this->cast($pipe['cast'], $value);
+                    if ($pipe['cast'] !== 'null') {
+                        $payload[$pipe['to']] = $this->cast(
+                            $pipe['cast'],
+                            $value
+                        );
+                    }
                 }
             }
         }
@@ -293,6 +298,10 @@ abstract class Integration extends Singleton
                 } catch (TypeError) {
                     return [];
                 }
+            case 'null':
+                return null;
+            default:
+                return (string) $value;
         }
     }
 
diff --git a/includes/class-settings.php b/includes/class-settings.php
index 4414146f8d2cf78cb5221f34aa3d2f637b3b4025..0be9dc11299eca2263d2094abab4978ed1212ed3 100644
--- a/includes/class-settings.php
+++ b/includes/class-settings.php
@@ -143,6 +143,7 @@ class Settings extends BaseSettings
                                                 'integer',
                                                 'float',
                                                 'json',
+                                                'null',
                                             ],
                                         ],
                                     ],
@@ -197,6 +198,7 @@ class Settings extends BaseSettings
                                                 'integer',
                                                 'float',
                                                 'json',
+                                                'null',
                                             ],
                                         ],
                                     ],
diff --git a/includes/integrations/wpforms/class-integration.php b/includes/integrations/wpforms/class-integration.php
new file mode 100644
index 0000000000000000000000000000000000000000..76c300f3d78d050d735b62ec336a8b860dfa42ac
--- /dev/null
+++ b/includes/integrations/wpforms/class-integration.php
@@ -0,0 +1,251 @@
+<?php
+
+namespace WPCT_ERP_FORMS\WPFORMS;
+
+use WPCT_ERP_FORMS\Integration as BaseIntegration;
+use WP_Post;
+use WPForms_Field_File_Upload;
+
+/**
+ * WPForms integration.
+ *
+ * @since 1.0.0
+ */
+class Integration extends BaseIntegration
+{
+    /**
+     * Inherit parent constructor and hooks submissions to wpcf7_before_send_mail
+     *
+     * @since 0.0.1
+     */
+    protected function __construct()
+    {
+        parent::__construct();
+
+        add_action(
+            'wpforms_process_complete',
+            function ($fields, $entry, $form_data, $entry_id) {
+                // $submission = wpforms()->obj('submission');
+                // $submission->register($fields, $entry, $form_data['id'], $form_data);
+                $entry['fields'] = $fields;
+                $entry['entry_id'] = $entry_id;
+                $this->do_submission($entry, $form_data);
+            },
+            10,
+            4
+        );
+    }
+
+    /**
+     * Integration initializer to be fired on wp init.
+     *
+     * @since 0.0.1
+     */
+    protected function init()
+    {
+    }
+
+    /**
+     * Retrive the current WPForms_Form_Handler data.
+     *
+     * @return array $form_data Form data array representation.
+     */
+    public function get_form()
+    {
+        $form_id = !empty($_POST['wpforms']['id'])
+            ? absint($_POST['wpforms']['id'])
+            : 0;
+        if (!$form_id) {
+            return null;
+        }
+
+        $form = wpforms()->obj('form')->get($form_id);
+        return $this->serialize_form($form);
+    }
+
+    /**
+     * Retrive form data by ID.
+     *
+     * @since 3.0.0
+     *
+     * @param int $form_id Form ID.
+     * @return array $form_data Form data.
+     */
+    public function get_form_by_id($form_id)
+    {
+        $form = wpforms()->obj('form')->get($form_id);
+        if (!$form) {
+            return null;
+        }
+
+        return $this->serialize_form($form);
+    }
+
+    /**
+     * Retrive available forms data.
+     *
+     * @since 3.0.0
+     *
+     * @return array $forms Collection of form data.
+     */
+    public function get_forms()
+    {
+        $forms = wpforms()->obj('form')->get();
+        return array_map(function ($form) {
+            return $this->serialize_form($form);
+        }, $forms);
+    }
+
+    /**
+     * Retrive the current submission data.
+     *
+     * @since 3.0.0
+     *
+     * @return array $submission Submission data.
+     */
+    public function get_submission()
+    {
+        $form = $this->get_form();
+        if (!$form) {
+            return null;
+        }
+
+        $submission = $_POST['wpforms'];
+        $submission['fields'] = $_POST['wpforms']['complete'];
+        return $this->serialize_submission($submission, $form);
+    }
+
+    /**
+     * Retrive the current submission uploaded files.
+     *
+     * @since 3.0.0
+     *
+     * @return array $files Uploaded files data.
+     */
+    public function get_uploads()
+    {
+        $submission = $this->get_submission();
+        if (!$submission) {
+            return null;
+        }
+
+        return $this->submission_uploads($submission, $this->get_form());
+    }
+
+    /**
+     * Serialize form data.
+     *
+     * @since 1.0.0
+     *
+     * @param object $form WPCF7_ContactForm instance.
+     * @return array $form_data Form data.
+     */
+    public function serialize_form($form)
+    {
+        $data =
+            $form instanceof WP_Post
+                ? wpforms_decode($form->post_content)
+                : $form;
+
+        $form_id = (int) $data['id'];
+        return [
+            'id' => $form_id,
+            'title' => $data['settings']['form_title'],
+            'hooks' => apply_filters(
+                'wpct_erp_forms_form_hooks',
+                null,
+                $form_id
+            ),
+            'fields' => array_values(
+                array_map(function ($field) {
+                    return $this->serialize_field($field);
+                }, $data['fields'])
+            ),
+        ];
+    }
+
+    /**
+     * Serialize form field data.
+     *
+     * @since 1.0.0
+     *
+     * @param object $field WPCF7_FormTag instance.
+     * @param array $form_data Form data.
+     * @return array $field_data Field data.
+     */
+    private function serialize_field($field)
+    {
+        return [
+            'id' => (int) $field['id'],
+            'type' => $field['type'],
+            'name' => $field['label'],
+            'label' => $field['label'],
+            'required' => $field['required'] == '1',
+            'options' => isset($field['choices']) ? $field['choices'] : [],
+            'conditional' => false,
+        ];
+    }
+
+    /**
+     * Serialize form submission data.
+     *
+     * @since 1.0.0
+     *
+     * @param object $submission Submission instance.
+     * @param array $form Form data.
+     * @return array $submission_data Submission data.
+     */
+    public function serialize_submission($submission, $form_data)
+    {
+        $data = [
+            'submission_id' => $submission['entry_id'],
+        ];
+
+        foreach ($submission['fields'] as $field) {
+            $data[$field['name']] = $field['value'];
+        }
+
+        return $data;
+    }
+
+    /**
+     * Get form submission uploaded files.
+     *
+     * @since 1.0.0
+     *
+     * @param object $submission WPCF7_Submission instance.
+     * @param array $form_data Form data.
+     * @return array $uploads Uploaded files data.
+     */
+    protected function submission_uploads($submission, $form_data)
+    {
+        $fields = wpforms_get_form_fields($form_data['id'], ['file-upload']);
+        if (empty($fields) || empty($_FILES)) {
+            return [];
+        }
+
+        $files_keys = preg_filter(
+            '/^/',
+            'wpforms_' . $form_data['id'] . '_',
+            array_keys($fields)
+        );
+        $files = wp_list_filter(wp_array_slice_assoc($_FILES, $files_keys), [
+            'error' => 0,
+        ]);
+
+        $uploads = [];
+        foreach ($fields as $field) {
+            if (empty($files_paths)) {
+                continue;
+            }
+
+            $is_multi = sizeof($paths) > 1;
+            $uploads[$field['name']] = [
+                'path' => $is_multi ? $paths : $paths[0],
+                'is_multi' => $is_multi,
+            ];
+        }
+
+        return $uploads;
+    }
+}
diff --git a/src/FormPipes/Table.jsx b/src/FormPipes/Table.jsx
index 7ac57d8d0b980cc357765431887c579c77c8ddef..863c6645285aaa8c25e9d6511aff14cad62cbcb3 100644
--- a/src/FormPipes/Table.jsx
+++ b/src/FormPipes/Table.jsx
@@ -33,14 +33,22 @@ const castOptions = [
     value: "json",
     label: __("JSON", "wpct-erp-forms"),
   },
+  {
+    value: "null",
+    label: __("Ignore", "wpct-erp-forms"),
+  },
 ];
 
 export default function PipesTable({ formId, pipes, setPipes }) {
   const fields = useFormFields({ formId });
-  const fromOptions = fields.map((field) => ({
-    label: field.label,
-    value: field.name,
-  }));
+  const fromOptions = [
+    { label: __("Submission ID", "wpct-erp-forms"), value: "submission_id" },
+  ].concat(
+    fields.map((field) => ({
+      label: field.label,
+      value: field.name,
+    }))
+  );
 
   const setPipe = (attr, index, value) => {
     const newPipes = pipes.map((pipe, i) => {
diff --git a/wpct-erp-forms.php b/wpct-erp-forms.php
index d76038b29dbf0023a108af6c58c13d7ee05421e1..45aea3c6dd1c0c687eda2731ec1177d2044c072f 100755
--- a/wpct-erp-forms.php
+++ b/wpct-erp-forms.php
@@ -15,6 +15,7 @@ namespace WPCT_ERP_FORMS;
 
 use WPCT_ERP_FORMS\WPCF7\Integration as Wpcf7Integration;
 use WPCT_ERP_FORMS\GF\Integration as GFIntegration;
+use WPCT_ERP_FORMS\WPFORMS\Integration as WPFormsIntegration;
 use WPCT_ABSTRACT\Plugin as BasePlugin;
 
 if (!defined('ABSPATH')) {
@@ -131,6 +132,17 @@ class Wpct_Erp_Forms extends BasePlugin
         ) {
             require_once 'includes/integrations/gf/class-integration.php';
             $this->_integrations['gf'] = GFIntegration::get_instance();
+        } elseif (
+            apply_filters(
+                'wpct_is_plugin_active',
+                false,
+                'wpforms-lite/wpforms.php'
+            )
+        ) {
+            require_once 'includes/integrations/wpforms/class-integration.php';
+            $this->_integrations[
+                'wpforms'
+            ] = WPFormsIntegration::get_instance();
         }
     }