ConfiForms allows you to inject your code into the form submit routine

Here are the events that ConfiForms triggers durinng the submit

function onCFSubmitStarted(formObject) {
  AJS.$(formObject).trigger('cfSubmitStarted', formObject);
}

function onCFSubmitFinished(formObject) {
  AJS.$(formObject).trigger('cfSubmitFinished', formObject);
}

function onCFSubmitError(formObject) {
  AJS.$(formObject).trigger('cfSubmitError', formObject);
}

function onCFBeforePrint(formObject, content) {
  AJS.$(formObject).trigger('cfBeforePrint', {"form": formObject, "content": content});
}

You can have a form that doe something like this to consume those events

<ac:structured-macro ac:macro-id="bdfbddee-ee93-4439-827d-ebdbe6199f75" ac:name="confiform-entry-register" ac:schema-version="1">
  <ac:parameter ac:name="formName">f</ac:parameter>
  <ac:parameter ac:name="afterLoadInit">handleEvents(formId)</ac:parameter>
  <ac:parameter ac:name="embedded">true</ac:parameter>
  <ac:parameter ac:name="atlassian-macro-output-type">INLINE</ac:parameter>
  <ac:rich-text-body>
    <p>
      <br/>
    </p>
  </ac:rich-text-body>
</ac:structured-macro>
<ac:structured-macro ac:macro-id="8ae6842c-ff64-49bc-ac98-445d2aded4ae" ac:name="confiform" ac:schema-version="1">
  <ac:parameter ac:name="formName">f</ac:parameter>
  <ac:rich-text-body>
    <p>
      <ac:structured-macro ac:macro-id="8e05fb13-d6f5-4bdf-8c24-c8917e358096" ac:name="confiform-field-definition" ac:schema-version="1">
        <ac:parameter ac:name="fieldName">t</ac:parameter>
        <ac:parameter ac:name="fieldLabel">t</ac:parameter>
        <ac:parameter ac:name="type">text</ac:parameter>
      </ac:structured-macro>
    </p>
  </ac:rich-text-body>
</ac:structured-macro>
<ac:structured-macro ac:macro-id="5f71ad7a-dd8a-4d78-8f21-5a1459672799" ac:name="html" ac:schema-version="1">
  <ac:plain-text-body><![CDATA[<script>

function handleEvents(formId) {
 AJS.$('#' + formId).on('cfSubmitStarted', function(formObject) {
   console.log(formObject);
 });

 AJS.$('#' + formId).on('cfSubmitFinished', function(formObject) {
   console.log(formObject);
 }); 

 AJS.$('#' + formId).on('cfSubmitError', function(formObject) {
   console.log(formObject);
 }); 

}

</script>]]></ac:plain-text-body>
</ac:structured-macro>

ConfiForms Registration Control macro has an after initialization method call to some custom function:

handleEvents(formId)

This function adds listeners to form object