Skip to main content
This guide explains how to implement conditional routing in your onboarding workflow. Instead of a linear verification journey, this approach dynamically adjusts friction based on real-time risk signals—routing low-risk users through faster verification while applying additional checks for high-risk applicants.

Overview

Risk-Based Onboarding uses a three-step process:
  1. Passive Signal Collection – Assess email, phone, and device risk invisibly
  2. Decision Gate – Route to standard or step-up flow based on risk score
  3. Verification – Execute the appropriate verification path

Configuration Options

Risk-based routing can be configured at different levels depending on your needs:
OptionSignals UsedBest For
Full Fraud SignalsEmail, phone, device, IPMaximum fraud protection
Email + Phone OnlyEmail reputation, phone intelligenceLighter integration, good coverage
Business Logic OnlyEntity age, product type, transaction valueSimple routing without fraud checks

Option 1: Full Fraud Signals

Uses all available fraud steps: device intelligence, IP risk, email risk, and phone risk. Provides the strongest fraud detection but requires OneSDK integration for device and IP capture. Fraud steps included:
  • email_risk – Email domain, age, and reputation
  • phone_risk – Phone type, carrier, and validity
  • device_intelligence – Device fingerprint, velocity, and blocklist
  • ip_risk – Geolocation, VPN/proxy detection

Option 2: Email + Phone Only

A lighter approach that assesses risk using email and phone fraud steps. No device fingerprinting or OneSDK integration required. Fraud steps included:
  • email_risk – Evaluates email domain, age, and reputation
  • phone_risk – Evaluates phone type, carrier, and validity
Signals evaluated:
  • Email domain (disposable, free, corporate)
  • Email age and deliverability
  • Phone type (mobile, VoIP, landline)
  • Phone carrier risk and number validity

Option 3: Business Logic Only

Route based on entity attributes or transaction context without fraud signal checks. Useful when risk is determined by business factors rather than fraud indicators.
{
  "stage": "DECISION_GATE",
  "logic": "IF entity_age < 30_days OR product_type == 'HIGH_VALUE' OR transaction_value > 10000",
  "then": "ENHANCED_VERIFICATION",
  "else": "STANDARD_VERIFICATION"
}
Example routing rules:
  • New customers (entity age < 30 days) → Enhanced verification
  • High-value products → Document + biometric
  • Transaction value > threshold → Step-up required
  • Returning verified customers → Streamlined flow

Prerequisites

Before implementing risk-based routing, ensure you have:
  • A workflow configured with conditional logic
  • For fraud signals: Completed the Fraud Checks Guide setup
  • For device intelligence: OneSDK integration with session tracking

Step 1: Create Entity

Create an entity profile with the data required for your chosen configuration.
curl -X POST https://api.frankieone.com/v2/individuals \
  -H "api_key: YOUR_API_KEY" \
  -H "X-Frankie-CustomerID: YOUR_CUSTOMER_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "individual": {
      "entityType": "INDIVIDUAL",
      "name": {
        "givenName": "JAMES",
        "middleName": "A",
        "familyName": "TESTONE",
        "displayName": "JAMES A TESTONE"
      },
      "dateOfBirth": {
        "year": "1990",
        "month": "05",
        "day": "15"
      },
      "nationality": "AUS",
      "addresses": [
        {
          "type": "RESIDENTIAL",
          "streetNumber": "35",
          "streetName": "CONN",
          "streetType": "STREET",
          "unitNumber": "1",
          "locality": "FERNTREE GULLY",
          "subdivision": "VIC",
          "postalCode": "3156",
          "country": "AUS",
          "unstructuredLongForm": "U 1/35 CONN STREET, FERNTREE GULLY, VIC 3156"
        }
      ],
      "emailAddresses": [
        {
          "type": "WORK",
          "email": "[email protected]",
          "isPreferred": true
        }
      ],
      "phoneNumbers": [
        {
          "country": "AUS",
          "number": "0412345678",
          "isPreferred": true
        }
      ],
      "documents": {
        "IDENTITY": [
          {
            "type": "DRIVERS_LICENSE",
            "country": "AUS",
            "subdivision": "VIC",
            "primaryIdentifier": "123456789",
            "secondaryIdentifier": "P1234567",
            "class": "IDENTITY"
          }
        ]
      },
      "consents": [
        { "type": "GENERAL" },
        { "type": "DOCS" },
        { "type": "CREDITHEADER" }
      ]
    }
  }'
The response includes the entityId required for workflow execution.
Note: For device and IP signals, you must implement OneSDK on the client side. Email and phone checks work independently without it.

Step 2: Execute Risk-Based Workflow

Execute your workflow with risk-based routing enabled. The workflow configuration determines how signals are evaluated and which path is triggered.
curl -X POST https://api.frankieone.com/v2/individuals/{entityId}/serviceprofiles/KYC/workflows/AUS-Risk-CDD-Email-Phone-Device/execute \
  -H "api_key: YOUR_API_KEY" \
  -H "X-Frankie-CustomerID: YOUR_CUSTOMER_ID"

Workflow Configuration

Risk-based workflows include fraud steps (email risk, phone risk, device intelligence) that evaluate signals before routing to the appropriate verification path. Below is a conceptual example of the branching structure:
{
  "workflow_name": "Dynamic_Risk_Based_Onboarding",
  "stages": [
    {
      "stage": "PRE_SCREEN",
      "steps": ["email_risk", "phone_risk", "device_intelligence"]
    },
    {
      "stage": "DECISION_GATE",
      "logic": "IF fraud_score > 30 OR device_risk == 'HIGH'",
      "then": "TRIGGER_STEP_UP",
      "else": "STANDARD_FLOW"
    },
    {
      "stage": "VERIFICATION",
      "branches": {
        "STANDARD_FLOW": ["document_ocr", "database_match"],
        "TRIGGER_STEP_UP": ["document_ocr", "biometric_liveness", "database_match"]
      }
    }
  ]
}
Note: This is a conceptual representation. Workflows are configured by your FrankieOne representative. Contact your representative to set up risk-based routing with the appropriate fraud steps for your use case.

Risk Factors Evaluated

The workflow evaluates multiple risk factors, each contributing to the overall risk score:
Risk FactorDescriptionExample Values
fraud_emailEmail Address RiskLOW, MEDIUM, HIGH
fraud_phone_numberPhone Number RiskLOW, MEDIUM, HIGH
fraud_ip_addressIP Address RiskLOW, MEDIUM, HIGH
fraud_count_sessionSession Count RiskNumeric
entity_typeEntity TypeINDIVIDUAL
entity_ageAge of Entity (years)Numeric
workflow_attemptsNumber of Workflow AttemptsNumeric
document_typeID Document TypeDRIVERS_LICENSE, PASSPORT
address_country_riskResidential Address CountryCountry code
document_country_riskDocument Issuing CountryCountry code

Fraud Indicators

The FRAUD step evaluates specific indicators that can trigger issues:
IndicatorRisk LevelExample Triggers
Risky Email DomainHIGHDisposable domains, known fraud domains
Email AgeMEDIUM-HIGHRecently created email addresses
VoIP PhoneMEDIUM-HIGHNon-mobile phone numbers
Phone Carrier RiskMEDIUMHigh-risk carriers
IP Location MismatchMEDIUMIP doesn’t match stated address
VPN/Proxy DetectedMEDIUMConnection anonymisation

Step 3: Interpret Results

The workflow execution response contains the full verification outcome in the workflowResult object.

Key Response Fields

FieldDescription
workflowResult.resultOverall outcome: PASS, REVIEW, or FAIL
workflowResult.workflowExecutionStateExecution state: COMPLETED
workflowResult.riskAssessment.riskLevelRisk level: LOW, MEDIUM, or HIGH
workflowResult.riskAssessment.riskScoreNumeric risk score
workflowResult.issuesArray of flagged issues
workflowResult.stepsWhich steps passed, failed, or are incomplete

Example Response: High-Risk (Needs Review)

This example shows a high-risk result triggered by a risky email domain:
{
  "workflowResult": {
    "entityId": "155da7b9-cb8a-461a-8e58-787d65276630",
    "result": "REVIEW",
    "status": "REVIEW",
    "workflowExecutionState": "COMPLETED",
    "workflowName": "AUS-Risk-CDD-Email-Phone",
    "workflowExecutionId": "01KGJW7WXA0X5QHFC9M31AEE9Q",
    "issues": [
      {
        "category": "FRAUD",
        "issue": "FRAUD_EMAIL_ADDRESS",
        "severity": "REVIEW"
      },
      {
        "category": "RISK",
        "issue": "RISK_THRESHOLD_HIGH",
        "severity": "REVIEW"
      }
    ],
    "riskAssessment": {
      "riskLevel": "HIGH",
      "riskScore": 61,
      "riskFactors": [
        {
          "factor": "fraud_email",
          "description": "Email Address Risk",
          "value": "HIGH",
          "score": 51
        },
        {
          "factor": "fraud_phone_number",
          "description": "Phone Number Risk",
          "value": "LOW",
          "score": 1
        },
        {
          "factor": "fraud_ip_address",
          "description": "IP Address Risk",
          "value": "LOW",
          "score": 1
        },
        {
          "factor": "entity_age",
          "description": "Age of Entity",
          "value": "76",
          "score": 1
        }
      ]
    },
    "steps": {
      "passed": ["START", "MATCHLIST", "DECISION", "FINISH"],
      "failed": ["KYC", "FRAUD"],
      "incomplete": ["TOGGLE_MONITORING"],
      "order": ["START", "MATCHLIST", "KYC", "FRAUD", "TOGGLE_MONITORING", "DECISION", "FINISH"]
    }
  }
}

Understanding the FRAUD Step Results

The workflowStepResults array contains detailed results for each step. For the FRAUD step:
{
  "stepName": "FRAUD",
  "result": "HIT",
  "summary": {
    "maximumEmailAddressRisk": "HIGH",
    "maximumPhoneNumberRisk": "LOW",
    "maximumIpAddressRisk": "LOW",
    "numberEmailAddressEvaluations": 1,
    "numberPhoneNumberEvaluations": 1
  },
  "processResults": [
    {
      "objectType": "EMAIL_ADDRESS",
      "result": "HIT",
      "supplementaryData": {
        "riskLevel": "HIGH",
        "indicators": [
          {
            "name": "emailLevel",
            "value": "high",
            "rules": [{ "name": "Risky Email Domain", "isActive": true }]
          }
        ]
      }
    },
    {
      "objectType": "PHONE_NUMBER",
      "result": "CLEAR",
      "supplementaryData": {
        "riskLevel": "LOW"
      }
    }
  ]
}

Result Values

ResultMeaningRecommended Action
PASSAll checks passed, risk within thresholdAuto-approve account
REVIEWFlags present or risk threshold exceededManual review required
FAILCritical failure or verification failedDecline registration

Issue Categories

CategoryExample Issues
FRAUDFRAUD_EMAIL_ADDRESS, FRAUD_PHONE_NUMBER, FRAUD_DEVICE
RISKRISK_THRESHOLD_HIGH, RISK_THRESHOLD_MEDIUM
KYCNOT_FOUND, PARTIAL_MATCH
Note: Even when individual fraud checks pass, the overall result may be REVIEW if the combined risk score exceeds your configured threshold. This ensures your compliance team can make the final decision with full context.
For detailed field definitions, see Interpreting Workflow Results.

Configuring Thresholds

Work with your FrankieOne representative to tune risk scoring based on your risk appetite.

Risk Score Thresholds

The overall risk score determines the workflow result:
Risk LevelScore RangeTypical Outcome
LOW0-20PASS
MEDIUM21-50PASS or REVIEW (configurable)
HIGH51+REVIEW

Risk Factor Weights

Each risk factor contributes a weighted score. Example weights:
Risk FactorLOW ScoreHIGH Score
fraud_email151
fraud_phone_number151
fraud_ip_address151
entity_type22
entity_age15
document_type13
address_country_risk110
Note: Weights are configurable. Contact your FrankieOne representative to adjust scoring for your use case.

Best Practices

Always log the workflowExecutionId for audit trails and troubleshooting. Handle REVIEW outcomes by routing to your compliance team with the full flag context rather than auto-declining. Monitor conversion rates by workflow path. If step-up abandonment is high, review your biometric capture UX or threshold settings. Tune thresholds gradually based on observed fraud rates and false positive feedback.

Troubleshooting

IssueLikely CauseResolution
All users getting REVIEW resultRisk score threshold too lowIncrease threshold or adjust factor weights
FRAUD_EMAIL_ADDRESS false positivesLegitimate domains flaggedReview email risk rules with FrankieOne
KYC step showing NOT_FOUNDNo data source matchesEnsure correct document details provided
High fraud_email scoresRisky domain patternsCheck if corporate domains need whitelisting
RISK_THRESHOLD_HIGH on valid usersCumulative scores too highReview individual factor weights
Missing fraud_phone_number resultPhone format issueEnsure phone includes country code

Next Steps