Health Scoring
Understand the 12-factor health scoring system, MCA detection, underwriting decisions, and how composite scores map to letter grades.
Composite Score
Every analyzed deal receives a composite health score from 0 to 100 and a letter grade. The score is computed from 12 weighted sub-factors extracted from the uploaded financial documents.
| Grade | Score Range | Interpretation |
|---|---|---|
| A | 80-100 | Strong financial health — low risk, favorable terms |
| B | 60-79 | Moderate health — acceptable risk, standard terms |
| C | 40-59 | Weak health — elevated risk, conservative terms |
| D | 0-39 | Poor health — high risk, likely decline or heavy conditions |
Accessing Scores
const deal = await client.deals.get(12345);
console.log(deal.health.health_score); // 78.5
console.log(deal.health.health_grade); // "B"
// Iterate sub-factors
for (const [name, factor] of Object.entries(deal.health.factors || {})) {
console.log(`${name}: ${factor.score}/${factor.max} (weight: ${factor.weight})`);
}deal = client.deals.get(12345)
print(deal.health.health_score) # 78.5
print(deal.health.health_grade) # "B"
# Iterate sub-factors
for name, factor in deal.health.factors.items():
print(f"{name}: {factor.score}/{factor.max} (weight: {factor.weight})")Factor Breakdown
Each sub-factor contributes to the composite score based on its weight. Factors are scored independently and then combined.
| Factor | Weight | What It Measures |
|---|---|---|
| Revenue Quality | 24% | Consistency and growth of monthly deposits |
| NSF Cleanliness | 12% | Frequency and severity of NSF/overdraft events |
| ADB Stability | 8% | Average daily balance consistency across months |
| Negative Days | 8% | Number of days with negative balance |
| Deposit Consistency | 8% | Regularity of deposit patterns |
| Screening Flags | 5% | Presence of suspicious or flagged transactions |
| Deposit Quality | 4% | Proportion of organic revenue vs. transfers/loans |
Tip: Factor weights can be customized per ruleset. When evaluating a deal against a custom ruleset, the composite score is recalculated using the ruleset's weight configuration.
MCA Detection
LendIQ scans transaction data against a database of 200+ known MCA lender patterns. It identifies existing positions, calculates total daily obligations, and produces a fundability grade that factors into the underwriting decision.
Accessing MCA Data
const deal = await client.deals.get(12345);
console.log(deal.mca?.positions_detected); // 2
console.log(deal.mca?.total_daily_obligation); // 450.00
console.log(deal.mca?.mca_credit_score); // 72
console.log(deal.mca?.fundability_grade); // "B"deal = client.deals.get(12345)
print(deal.mca.positions_detected) # 2
print(deal.mca.total_daily_obligation) # 450.00
print(deal.mca.mca_credit_score) # 72
print(deal.mca.fundability_grade) # "B"MCA Fields
| Name | Type | Required | Description |
|---|---|---|---|
positions_detected | number | Yes | Number of active MCA positions identified in transactions |
total_daily_obligation | number | Yes | Sum of all detected daily MCA payments ($) |
mca_credit_score | number | Yes | MCA-specific credit score (0-100) factoring position count and obligation ratio |
fundability_grade | string | Yes | Letter grade (A-D) indicating fundability given existing positions |
Info: MCA detection runs automatically as part of the 12-stage pipeline. No additional configuration is needed. The lender pattern database is updated continuously.
Underwriting Decisions
Decision Types
| Decision | Description |
|---|---|
approved | Deal meets all criteria — recommended terms are provided |
conditional | Deal meets most criteria but has flags — terms provided with conditions |
declined | Deal fails one or more hard decline rules |
pending | Analysis is still in progress |
Recommendation Object
| Name | Type | Required | Description |
|---|---|---|---|
decision | string | Yes | "approved" | "conditional" | "declined" | "pending" |
confidence | number | Yes | Confidence level (0-1) in the decision |
risk_tier | string | Yes | Risk classification: "tier_1" (lowest) through "tier_4" (highest) |
advance_amount | number | No | Recommended maximum advance ($) |
factor_rate | number | No | Recommended factor rate (e.g., 1.35) |
est_daily_payment | number | No | Estimated daily payment based on advance and factor rate ($) |
risk_factors | string[] | Yes | List of identified risk factors (e.g., "high_mca_exposure") |
strengths | string[] | Yes | List of identified strengths (e.g., "consistent_deposits") |
Accessing Recommendations
const deal = await client.deals.get(12345);
if (deal.recommendation) {
console.log(deal.recommendation.decision); // "approved"
console.log(deal.recommendation.confidence); // 0.87
console.log(deal.recommendation.risk_tier); // "tier_2"
console.log(deal.recommendation.advance_amount); // 50000
console.log(deal.recommendation.factor_rate); // 1.35
console.log(deal.recommendation.est_daily_payment); // 375.00
console.log(deal.recommendation.risk_factors); // ["high_mca_exposure"]
console.log(deal.recommendation.strengths); // ["consistent_deposits"]
}deal = client.deals.get(12345)
if deal.recommendation:
print(deal.recommendation.decision) # "approved"
print(deal.recommendation.confidence) # 0.87
print(deal.recommendation.risk_tier) # "tier_2"
print(deal.recommendation.advance_amount) # 50000
print(deal.recommendation.factor_rate) # 1.35
print(deal.recommendation.est_daily_payment) # 375.00
print(deal.recommendation.risk_factors) # ["high_mca_exposure"]
print(deal.recommendation.strengths) # ["consistent_deposits"]Info: The recommendation object is only populated after the pipeline completes. Check for
deal.recommendationbefore accessing its fields.