Capability

Forms that decide

Approve, reject, or escalate based on business rules defined in plain language. No backend code. Not far from a business rules engine.

Get Started

Free to start

Approve/Reject Logic

Boolean business rules that evaluate submissions against thresholds and conditions. The form itself determines the outcome, not a human reviewer or external system.

Multi-factor Eligibility

Combine multiple criteria into a single pass/fail outcome. Age, risk factors, coverage type, and history all feed into one eligibility result.

Computed Risk Scoring

Calculate risk scores, weighted totals, or tiered ratings that feed into approval decisions. Low, medium, and high risk tiers computed from form inputs.

How it works

Describe your approval criteria in plain language. Get a form that evaluates eligibility in real time.

You describe it

Formidable

Describe the form you want to build, including any calculations or scoring logic.

Create an insurance eligibility form. Ask for name, age, coverage type (Auto, Home, Health), and pre-existing conditions. Show driving record and vehicle age for Auto. Show property age and flood zone for Home. Show smoking status and chronic conditions for Health. Calculate a risk score and determine eligibility. Reject if risk is too high or specific disqualifying factors are present.

Press Enter to send

You get this

Generated flowchart showing the eligibility decision tree with risk scoring and approval paths

Same form, different verdicts

The eligibility result, risk score, and reason update automatically based on the applicant's inputs. No server round-trip required.

Lisa — Eligible

Form result showing an eligible applicant with risk score 2 and Low Risk tier
Result: EligibleRisk Tier: Low RiskScore: 2

Sarah — Ineligible

Form result showing an ineligible applicant with risk score 9 and High Risk tier
Result: IneligibleRisk Tier: High RiskScore: 9

The approval logic

forma.json
{
  "computed": {
    "riskScore": {
      "label": "Risk Score",
      "display": true,
      "expression": "computed.riskPointsAge + computed.riskPointsPreExisting + computed.riskPointsAuto + computed.riskPointsHome + computed.riskPointsHealth"
    },
    "riskTier": {
      "label": "Risk Tier",
      "display": true,
      "expression": "if computed.riskScore >= 5 then \"High Risk\" else if computed.riskScore >= 3 then \"Medium Risk\" else \"Low Risk\""
    },
    "eligibilityResult": {
      "label": "Eligibility Result",
      "display": true,
      "expression": "if computed.eligible = true then \"Eligible\" else if computed.ineligible = true then \"Ineligible\" else null"
    },
    "ineligible": {
      "display": false,
      "expression": "computed.ageIneligible = true or computed.preExistingIneligible = true or computed.autoIneligible = true or computed.homeIneligible = true or computed.healthIneligible = true or computed.highRiskIneligible = true"
    }
  }
}

Headless by design

Fetch the spec, render your own UI, evaluate approval rules server-side. Almost like a business rules engine, with a form attached.

Request
curl -X POST https://api.formidable.software/f/insurance-eligibility/evaluate \
  -H "Authorization: Bearer sk_live_..." \
  -d '{ "age": 35, "coverageType": "Auto", "drivingRecord": "Clean", "vehicleAge": 3, "preExistingConditions": false }'

Response

{
  "valid": true,
  "computed": {
    "riskScore": 0,
    "riskTier": "Low Risk",
    "eligibilityResult": "Eligible",
    "eligibilityReason": "This applicant meets all eligibility criteria for Auto coverage."
  }
}
Render with ReactYour UI
EligibilityForm.tsx
import { FormRenderer } from "@fogpipe/forma-react";
import type { ComponentMap } from "@fogpipe/forma-react";

const components: ComponentMap = {
  text: TextInput,
  integer: NumberInput,
  select: SelectField,
  boolean: Checkbox,
};

function EligibilityForm({ spec }) {
  return (
    <FormRenderer
      spec={spec}
      components={components}
      onChange={(data, computed) => {
        // Real-time eligibility feedback
        if (computed.eligibilityResult) {
          showBanner(computed.eligibilityResult);
        }
      }}
      onSubmit={(data) => {
        // Computed values included automatically
        console.log(data);
      }}
    />
  );
}
Preview

Insurance Eligibility

Lisa Tanaka
35years
Auto
Clean

Approval Result

Risk Score

0

Risk Tier

Low Risk

Eligibility Result

Eligible
Submit

Built-in, not bolted on

Most approval forms collect data in one tool and evaluate it in another. Formidable does both in the same step.

Step
Traditional
Formidable
Define approval criteria
Write validation logic in backend code
Describe rules in plain language
Calculate a risk score
Custom scoring function + unit tests
One expression in the computed block
Show the decision to the user
API call, wait for response, render result
Computed values display in real time
Add a new disqualifying rule
Code change + PR + deploy
Edit in Formidable, publish instantly
Explain why someone was rejected
Build reason-mapping logic per rule
Conditional reason expression in the spec
Validate approval server-side
Duplicate all rules in API layer
Single POST to /evaluate
Send results to external systems
Build webhook infrastructure
Connect a webhook in the workflow editor

Frequently asked questions

Can I have multiple approval tiers?

Yes. Computed fields support conditional expressions that map scores to tiers. For example, a risk score below 3 maps to Low Risk, 3-4 to Medium Risk, and 5+ to High Risk. Each tier can trigger different outcomes in the eligibility result.

Are business rules evaluated client-side or server-side?

Both. The forma-react renderer evaluates all computed fields and eligibility logic in real time on the client. The same expressions run server-side when you POST to the /evaluate endpoint, so results are consistent regardless of where you check them.

Can approval logic reference computed fields?

Yes. Computed fields can reference other computed fields. A common pattern is to compute a risk score from individual risk factors, then reference that score in a tier classification, then reference the tier in the final eligibility result. The engine resolves dependencies automatically.

How do I integrate approval results with external systems?

Two options. Use the /evaluate API endpoint to check eligibility from your backend before processing. Or set up a webhook in the workflow editor to push submission data and computed results to Slack, a CRM, or any URL when a form is submitted.

What happens to approval logic when fields are hidden?

Hidden fields are excluded from validation and their values are not included in the submission. Approval expressions that reference hidden fields evaluate them as null. Design your eligibility rules to handle null values for coverage-specific fields.

Build a form that decides

Create an insurance eligibility form. Ask for name, age, and coverage type (Auto, Home, Health). Add coverage-specific fields that appear conditionally. Calculate a risk score based on the applicant's profile and determine eligibility automatically.

Get Started

Free to start · No credit card required