Credit Card Underwriting Features
This skill complements the broader banking/card feature playbook in customer-creditcard-features/SKILL.md. It narrows that catalog to the underwriting use case: deciding whether a customer should be approved, how much credit they can bear, and how risky they are using their broader banking relationship, especially checking and deposit behavior.
The canonical row remains (customer_id, cutoff_date). Every feature must be derivable from data available at or before cutoff_date.
This use case is focused on underwriting and affordability. The signal set should emphasize:
- checking and deposit account balances
- direct deposit and recurring inflows
- cash-flow stability and volatility
- overdraft / NSF behavior
- tenure and relationship depth with the bank
- cross-product holdings and usage signals
- repayment capacity proxies and affordability
- bureau and risk profile for the customer
This is not a generic product-usage skill. It is specifically for card approval, limit assignment, and risk segmentation decisions using the customer’s relationship with the institution and broader financial health.
Use-case fit
Use this skill when the model goal is one of the following:
- credit card approval / decline
- limit assignment or limit increase recommendation
- line management / prudent credit exposure
- risk segmentation before offer issuance
- affordability and debt-service coverage assessment
- identifying customers whose external behavior suggests stronger or weaker repayment capacity
It is most relevant when the bank has access to information beyond the credit card itself, especially:
- deposit products
- checking accounts
- recurring payroll and direct deposit history
- cash-flow patterns across accounts
- account tenure and relationship depth
- overdraft and fee behavior
- existing product breadth and loyalty
Relationship to the broader card feature catalog
The broader card feature skill covers many banking and card-aligned variables. This underwriting skill should use that catalog as a starting framework, but it narrows the final feature set to the decision-relevant facets for affordability and risk.
In practice, combine the two ideas as follows:
- use the broad card feature skill for the universe of candidate variables
- retain only the subset relevant to underwriting risk and repayment ability
- validate the subset using a decision-oriented lens: can this feature explain approval risk or repayment capacity?
This keeps the underwriting skill aligned with the rest of the repo while still being opinionated about what matters in a credit decision.
Step 0 — Define the underwriting problem
Before writing code, agree on the exact underwriting target and as-of logic.
- Decision type. Is the model for approval, limit assignment, risk segmentation, or fraud/abuse screening?
- Label definition. Examples:
- approved within 30 days
- charge-off within 12 months
- severe delinquency within 180 days
- limit increase approval within 60 days
- Observation date.
cutoff_date is the last date on which all features can be computed.
- Allowed source tables. Clarify whether bureau data, transaction data, deposit data, and account activity are allowed.
- Out-of-time evaluation. Use a recent holdout period to test calibration and performance over time.
If any of these are ambiguous, stop and clarify before engineering features.
Step 1 — Canonical schema
Build a mapping from source warehouse tables to these canonical tables.
| Table |
Grain |
Key columns |
customers |
one row per customer |
customer_id, dob, signup_ts, tenure_months, kyc_level, residency, income_band |
deposit_accounts |
one row per deposit product |
customer_id, account_id, product_type, opened_ts, closed_ts, status |
checking_accounts |
one row per checking account |
customer_id, account_id, opened_ts, status, account_type, daily_balance_ts |
account_balances |
daily/monthly snapshot |
customer_id, account_id, snapshot_date, available_balance, ledger_balance, avg_daily_balance, minimum_balance |
transactions |
one row per banking transaction |
customer_id, account_id, txn_ts, amount, direction, merchant_category, channel, merchant_id, txn_type, is_debit, is_credit |
direct_deposits |
one row per payroll or recurring inflow |
customer_id, account_id, deposit_ts, amount, payer_type, source_name |
overdraft_events |
one row per NSF / overdraft event |
customer_id, account_id, event_ts, amount, fee_amount, result |
cards |
one row per card account |
customer_id, card_id, opened_ts, status, credit_limit, utilization, product_type |
loan_accounts |
one row per loan product |
customer_id, loan_id, product_type, opened_ts, status, current_balance, monthly_payment |
applications |
one row per application |
customer_id, application_id, submitted_ts, decision_ts, status, requested_limit |
bureau |
one row per bureau pull |
customer_id, pull_ts, score, utilization, delinquency_count, open_trades, recent_inquiries |
digi |
app / online banking activity |
customer_id, session_ts, channel, event_type, session_duration |
Map the actual warehouse names carefully. Do not silently assume identical fields across systems.
Step 2 — Leakage hygiene (non-negotiable)
All underwriting features must be answerable at cutoff_date without future information.
Rules:
- Filter every event table by
timestamp <= cutoff_date before aggregation.
- Reconstruct account snapshots as-of
cutoff_date instead of reading the current table.
- Use
settlement_ts or close_ts for negative events such as chargebacks, reversals, or collections status.
- Exclude bureau pulls after the cutoff.
- Exclude applications or account changes happening after the decision date.
- If variable updates are later-resolved, use the value known at the cutoff, not the eventual corrected value.
Leakage traps in underwriting:
- using post-approval product openings as features for a decision
- reading an updated bureau record that was pulled after the application date
- using future cash-flow events beyond the cutoff
- using a current balance snapshot when the account history should be reconstructed as-of date
Step 3 — Feature groups for underwriting
Build features in families, validate each family before moving to the next. This set should complement the broader card feature catalog, but with underwriting emphasis.
3.1 Customer and relationship context
customer_age_years
bank_tenure_days = cutoff_date - customer_signup_ts
relationship_tenure_days from first deposit/checking account
n_active_bank_products
has_checking_account, has_savings_account, has_cd, has_loan, has_credit_card
primary_product_type (checking heavy / savings heavy / loan heavy)
days_since_first_bank_product
days_since_last_product_added
3.2 Checking and deposit balance features
These are often the strongest underwriting signals and are the key distinction from generic card engagement features.
avg_checking_balance_30d, _90d, _180d
median_checking_balance_90d
min_checking_balance_90d
max_checking_balance_180d
balance_volatility_90d
days_with_positive_balance_30d
days_with_positive_balance_90d
deposit_balance_to_income_proxy
liquidity_ratio = avg_monthly_balance / monthly_expense_proxy
cash_buffer_days = avg_balance / avg_monthly_outflow
checking_balance_trend_30d_vs_90d
available_funds_ratio_30d
3.3 Cash-flow and income stability features
This is the most underwriting-critical family. It captures repayment capacity and stability far better than simple card spend history alone.
monthly_inflow_total_30d, _90d, _180d
monthly_outflow_total_30d, _90d
net_cash_flow_30d, _90d
inflow_outflow_ratio_30d
paycheck_frequency_90d (count of payroll or direct deposit events)
payroll_share_of_inflows_90d
direct_deposit_ratio_90d
income_stability_score_90d based on monthly inflow variance
cash_flow_slope_90d
monthly_inflow_cv_90d
days_since_last_payroll_deposit
salary_coverage_ratio = monthly_inflow / monthly_obligations_proxy
income_reliability_flag if recurring payroll dominates inflows
3.4 Direct deposit, payroll, and recurring inflow features
avg_direct_deposit_amount_30d, _90d
n_direct_deposit_events_30d, _90d
recurring_inflow_share_90d
payroll_to_total_inflow_ratio_90d
n_unique_payers_90d
largest_payroll_amount_90d
income_consistency_score_90d
days_since_last_recurring_income
3.5 Overdraft, NSFs, and transaction friction
nsf_count_30d, _90d, _180d
nsf_rate_90d = NSF_count / transaction_count
overdraft_fee_total_90d
days_since_last_nsf
average_overdraft_amount_90d
returned_item_count_90d
in_sufficient_funds_ratio_90d
negative_balance_days_30d
low_cash_buffer_flag
3.6 Transaction pattern and affordability features
transaction_count_30d, _90d
avg_daily_debit_amount_30d
avg_daily_credit_amount_30d
debit_to_credit_ratio_90d
essential_spend_share_90d (groceries, utilities, housing, childcare)
discretionary_spend_share_90d
merchant_category_entropy_90d
monthly_fixed_expense_proxy_90d
debt_service_coverage_proxy = inflow / fixed obligations proxy
spend_stability_score_90d
non_recurring_spend_share_90d
3.7 Product depth and breadth features
This is where the customer’s broader banking relationship becomes especially valuable. For underwriting, a customer with multiple active and healthy bank products usually has stronger relationship continuity and lower volatility.
n_open_accounts_total
n_active_deposit_accounts
n_open_credit_lines
credit_to_deposit_ratio
loan_payment_to_income_proxy
wealth_depth_score (number of savings and investment-linked products)
cross_product_holdings_score
days_since_last_new_product
3.8 Credit behavior and relationship with the bank
loan_payment_on_time_rate_90d
existing_card_utilization_asof
credit_limit_utilization_all_cards
paydown_trend_90d
loan_delinquency_flag_90d
prior_bank_repayment_history_score
bank_transaction_reliability_score
3.9 Bureau and risk features
bureau_score_asof
delinquency_count_12m
recent_inquiries_6m
credit_utilization_total
open_trade_count
max_delinquency_age_days
utilization_trend_90d
new_credit_inquiry_count_90d
3.10 Digital banking and engagement features
login_count_30d, _90d
avg_login_duration_30d
digital_banking_activity_score_90d
mobile_vs_web_usage_share
bill_pay_usage_rate_90d
transfer_count_90d
account_alert_engagement_flag
3.11 Trend and comparison features
These are critical for underwriting because they capture deterioration or strengthening financial health. This follows the same principle as the broader card feature skill’s “first vs last period” comparison logic, but the emphasis here is repayment capacity, liquidity, and affordability.
avg_balance_first_6m, avg_balance_last_6m
balance_last6m_vs_first6m_ratio
net_cash_flow_last_30d_vs_prev_30d
inflow_last_30d_vs_prev_30d
checking_balance_slope_90d
cash_flow_decline_pct_30d
overdraft_event_trend_90d
income_volatility_change_90d
product_depth_change_180d
3.12 Interaction features
These should only be used after reviewing the base feature set.
balance_volatility × bureau_score
monthly_inflow × overdraft_count
cash_buffer_days × existing_card_utilization
salary_coverage_ratio × loan_payment_to_income_proxy
account_tenure × direct_deposit_ratio
net_cash_flow × n_active_products
checking_balance_trend × delinquency_flag
Step 4 — Cash-flow-specific underwriting logic
For card underwriting, the most powerful signal is not just total balance but the customer’s ability to maintain cash flow after recurring obligations.
Use these definitions:
monthly_inflow_proxy: direct deposits + payroll + recurring credits
monthly_outflow_proxy: debits + recurring bills + transfers + card payments
cash_buffer_days = avg_balance / avg_outflow_per_day
debt_service_coverage_proxy = inflow / obligations_proxy
income_stability_score = 1 / (1 + CV(inflow)) with smoothing
A customer with high account tenure, stable payroll inflows, healthy balances, and low overdraft behavior is generally stronger than a customer with high current balance but volatile inflows and repeated NSF events.
Step 5 — Feature quality and missingness
- For missing balance history, create a missingness flag and a fallback indicator
- For customers with no checking history, separate them into a new “thin-file bank relationship” bucket
- Record denominator explicitly for all ratios (
total_inflow, total_outflow, transaction_count)
- Use
days_since_last_* features with a sentinel and companion boolean flags
- Handle low-historical customers carefully; an absence of signals is different from poor financial health
Step 6 — Leakage checklist
- No post-cutoff balance, inflow, or transaction data
- No future bureau pull or updated score beyond the cutoff
- No service outcomes resolved after the underwriting decision
- No future account openings, product changes, or new loan products after the cutoff
- No use of approval/reject outcomes as features in the model sample
Step 7 — Validation and selection
- Check time stability across monthly snapshots
- Compare feature distributions for approved vs declined populations
- Measure feature importance with SHAP or permutation importance
- Remove highly collinear features after checking business interpretability
- Prefer features with clear underwriting meaning over purely statistical “score” features
Step 8 — Testing and reproducibility
- Unit test each feature function for zero denominators, edge cases, and off-by-one errors
- Produce a feature registry with columns:
feature_name
description
source_table
window_days
type
business_use
owner
- Save a
feature_spec.yaml documenting derivations and assumptions
Step 9 — Monitoring and production use
- Track PSI / drift for top underwriting features
- Monitor null-rate spikes from checking or deposit feeds
- Watch for sudden account-balance shifts caused by seasonality or product migration
- Validate model calibration on recent approval cohorts before redeployment
Example deliverables
SKILL.md for underwriting design
feature_spec.yaml for feature contract
- synthetic validation tests for cash-flow and account-balance logic
- a standardized feature registry for approval / limit-assignment use cases
Summary
This underwriting skill is explicitly different from general customer response or inactivity modeling. It focuses on a customer’s ability to support and repay card obligations using:
- deposit and checking balances
- inflow stability and direct deposit quality
- cash-flow resilience
- overdraft and NSFs
- account tenure and relationship depth
- cross-product banking behavior
- affordability proxies and repayment capacity
These are the features that matter most when deciding whether a customer can responsibly carry a credit card and how much they can support.
1---2name: customer-creditcard-underwriting3description: Build leakage-safe underwriting features for credit card approval, credit-limit assignment, and risk segmentation using customer banking relationships, checking/deposit activity, cash-flow performance, and other-product behavior. Covers balance, liquidity, cash-flow stability, overdraft, tenure, and cross-product signals while enforcing as-of-date rules for production modeling.4---56# Credit Card Underwriting Features78This skill complements the broader banking/card feature playbook in [customer-creditcard-features/SKILL.md](../customer-creditcard-features/SKILL.md). It narrows that catalog to the underwriting use case: deciding whether a customer should be approved, how much credit they can bear, and how risky they are using their broader banking relationship, especially checking and deposit behavior.910The canonical row remains `(customer_id, cutoff_date)`. Every feature must be derivable from data available at or before `cutoff_date`.1112This use case is focused on underwriting and affordability. The signal set should emphasize:1314- checking and deposit account balances15- direct deposit and recurring inflows16- cash-flow stability and volatility17- overdraft / NSF behavior18- tenure and relationship depth with the bank19- cross-product holdings and usage signals20- repayment capacity proxies and affordability21- bureau and risk profile for the customer2223This is not a generic product-usage skill. It is specifically for card approval, limit assignment, and risk segmentation decisions using the customer’s relationship with the institution and broader financial health.2425## Use-case fit2627Use this skill when the model goal is one of the following:2829- credit card approval / decline30- limit assignment or limit increase recommendation31- line management / prudent credit exposure32- risk segmentation before offer issuance33- affordability and debt-service coverage assessment34- identifying customers whose external behavior suggests stronger or weaker repayment capacity3536It is most relevant when the bank has access to information beyond the credit card itself, especially:3738- deposit products39- checking accounts40- recurring payroll and direct deposit history41- cash-flow patterns across accounts42- account tenure and relationship depth43- overdraft and fee behavior44- existing product breadth and loyalty4546## Relationship to the broader card feature catalog4748The broader card feature skill covers many banking and card-aligned variables. This underwriting skill should use that catalog as a starting framework, but it narrows the final feature set to the decision-relevant facets for affordability and risk.4950In practice, combine the two ideas as follows:5152- use the broad card feature skill for the universe of candidate variables53- retain only the subset relevant to underwriting risk and repayment ability54- validate the subset using a decision-oriented lens: can this feature explain approval risk or repayment capacity?5556This keeps the underwriting skill aligned with the rest of the repo while still being opinionated about what matters in a credit decision.5758## Step 0 — Define the underwriting problem5960Before writing code, agree on the exact underwriting target and as-of logic.61621. **Decision type.** Is the model for approval, limit assignment, risk segmentation, or fraud/abuse screening?632. **Label definition.** Examples:64 - approved within 30 days65 - charge-off within 12 months66 - severe delinquency within 180 days67 - limit increase approval within 60 days683. **Observation date.** `cutoff_date` is the last date on which all features can be computed.694. **Allowed source tables.** Clarify whether bureau data, transaction data, deposit data, and account activity are allowed.705. **Out-of-time evaluation.** Use a recent holdout period to test calibration and performance over time.7172If any of these are ambiguous, stop and clarify before engineering features.7374## Step 1 — Canonical schema7576Build a mapping from source warehouse tables to these canonical tables.7778| Table | Grain | Key columns |79|---|---|---|80| `customers` | one row per customer | `customer_id`, `dob`, `signup_ts`, `tenure_months`, `kyc_level`, `residency`, `income_band` |81| `deposit_accounts` | one row per deposit product | `customer_id`, `account_id`, `product_type`, `opened_ts`, `closed_ts`, `status` |82| `checking_accounts` | one row per checking account | `customer_id`, `account_id`, `opened_ts`, `status`, `account_type`, `daily_balance_ts` |83| `account_balances` | daily/monthly snapshot | `customer_id`, `account_id`, `snapshot_date`, `available_balance`, `ledger_balance`, `avg_daily_balance`, `minimum_balance` |84| `transactions` | one row per banking transaction | `customer_id`, `account_id`, `txn_ts`, `amount`, `direction`, `merchant_category`, `channel`, `merchant_id`, `txn_type`, `is_debit`, `is_credit` |85| `direct_deposits` | one row per payroll or recurring inflow | `customer_id`, `account_id`, `deposit_ts`, `amount`, `payer_type`, `source_name` |86| `overdraft_events` | one row per NSF / overdraft event | `customer_id`, `account_id`, `event_ts`, `amount`, `fee_amount`, `result` |87| `cards` | one row per card account | `customer_id`, `card_id`, `opened_ts`, `status`, `credit_limit`, `utilization`, `product_type` |88| `loan_accounts` | one row per loan product | `customer_id`, `loan_id`, `product_type`, `opened_ts`, `status`, `current_balance`, `monthly_payment` |89| `applications` | one row per application | `customer_id`, `application_id`, `submitted_ts`, `decision_ts`, `status`, `requested_limit` |90| `bureau` | one row per bureau pull | `customer_id`, `pull_ts`, `score`, `utilization`, `delinquency_count`, `open_trades`, `recent_inquiries` |91| `digi` | app / online banking activity | `customer_id`, `session_ts`, `channel`, `event_type`, `session_duration` |9293Map the actual warehouse names carefully. Do not silently assume identical fields across systems.9495## Step 2 — Leakage hygiene (non-negotiable)9697All underwriting features must be answerable at `cutoff_date` without future information.9899Rules:1001011. Filter every event table by `timestamp <= cutoff_date` before aggregation.1022. Reconstruct account snapshots as-of `cutoff_date` instead of reading the current table.1033. Use `settlement_ts` or `close_ts` for negative events such as chargebacks, reversals, or collections status.1044. Exclude bureau pulls after the cutoff.1055. Exclude applications or account changes happening after the decision date.1066. If variable updates are later-resolved, use the value known at the cutoff, not the eventual corrected value.107108Leakage traps in underwriting:109- using post-approval product openings as features for a decision110- reading an updated bureau record that was pulled after the application date111- using future cash-flow events beyond the cutoff112- using a current balance snapshot when the account history should be reconstructed as-of date113114## Step 3 — Feature groups for underwriting115116Build features in families, validate each family before moving to the next. This set should complement the broader card feature catalog, but with underwriting emphasis.117118### 3.1 Customer and relationship context119- `customer_age_years`120- `bank_tenure_days = cutoff_date - customer_signup_ts`121- `relationship_tenure_days` from first deposit/checking account122- `n_active_bank_products`123- `has_checking_account`, `has_savings_account`, `has_cd`, `has_loan`, `has_credit_card`124- `primary_product_type` (checking heavy / savings heavy / loan heavy)125- `days_since_first_bank_product`126- `days_since_last_product_added`127128### 3.2 Checking and deposit balance features129These are often the strongest underwriting signals and are the key distinction from generic card engagement features.130131- `avg_checking_balance_30d`, `_90d`, `_180d`132- `median_checking_balance_90d`133- `min_checking_balance_90d`134- `max_checking_balance_180d`135- `balance_volatility_90d`136- `days_with_positive_balance_30d`137- `days_with_positive_balance_90d`138- `deposit_balance_to_income_proxy`139- `liquidity_ratio = avg_monthly_balance / monthly_expense_proxy`140- `cash_buffer_days = avg_balance / avg_monthly_outflow`141- `checking_balance_trend_30d_vs_90d`142- `available_funds_ratio_30d`143144### 3.3 Cash-flow and income stability features145This is the most underwriting-critical family. It captures repayment capacity and stability far better than simple card spend history alone.146147- `monthly_inflow_total_30d`, `_90d`, `_180d`148- `monthly_outflow_total_30d`, `_90d`149- `net_cash_flow_30d`, `_90d`150- `inflow_outflow_ratio_30d`151- `paycheck_frequency_90d` (count of payroll or direct deposit events)152- `payroll_share_of_inflows_90d`153- `direct_deposit_ratio_90d`154- `income_stability_score_90d` based on monthly inflow variance155- `cash_flow_slope_90d`156- `monthly_inflow_cv_90d`157- `days_since_last_payroll_deposit`158- `salary_coverage_ratio = monthly_inflow / monthly_obligations_proxy`159- `income_reliability_flag` if recurring payroll dominates inflows160161### 3.4 Direct deposit, payroll, and recurring inflow features162- `avg_direct_deposit_amount_30d`, `_90d`163- `n_direct_deposit_events_30d`, `_90d`164- `recurring_inflow_share_90d`165- `payroll_to_total_inflow_ratio_90d`166- `n_unique_payers_90d`167- `largest_payroll_amount_90d`168- `income_consistency_score_90d`169- `days_since_last_recurring_income`170171### 3.5 Overdraft, NSFs, and transaction friction172- `nsf_count_30d`, `_90d`, `_180d`173- `nsf_rate_90d = NSF_count / transaction_count`174- `overdraft_fee_total_90d`175- `days_since_last_nsf`176- `average_overdraft_amount_90d`177- `returned_item_count_90d`178- `in_sufficient_funds_ratio_90d`179- `negative_balance_days_30d`180- `low_cash_buffer_flag`181182### 3.6 Transaction pattern and affordability features183- `transaction_count_30d`, `_90d`184- `avg_daily_debit_amount_30d`185- `avg_daily_credit_amount_30d`186- `debit_to_credit_ratio_90d`187- `essential_spend_share_90d` (groceries, utilities, housing, childcare)188- `discretionary_spend_share_90d`189- `merchant_category_entropy_90d`190- `monthly_fixed_expense_proxy_90d`191- `debt_service_coverage_proxy` = inflow / fixed obligations proxy192- `spend_stability_score_90d`193- `non_recurring_spend_share_90d`194195### 3.7 Product depth and breadth features196This is where the customer’s broader banking relationship becomes especially valuable. For underwriting, a customer with multiple active and healthy bank products usually has stronger relationship continuity and lower volatility.197198- `n_open_accounts_total`199- `n_active_deposit_accounts`200- `n_open_credit_lines`201- `credit_to_deposit_ratio`202- `loan_payment_to_income_proxy`203- `wealth_depth_score` (number of savings and investment-linked products)204- `cross_product_holdings_score`205- `days_since_last_new_product`206207### 3.8 Credit behavior and relationship with the bank208- `loan_payment_on_time_rate_90d`209- `existing_card_utilization_asof`210- `credit_limit_utilization_all_cards`211- `paydown_trend_90d`212- `loan_delinquency_flag_90d`213- `prior_bank_repayment_history_score`214- `bank_transaction_reliability_score`215216### 3.9 Bureau and risk features217- `bureau_score_asof`218- `delinquency_count_12m`219- `recent_inquiries_6m`220- `credit_utilization_total`221- `open_trade_count`222- `max_delinquency_age_days`223- `utilization_trend_90d`224- `new_credit_inquiry_count_90d`225226### 3.10 Digital banking and engagement features227- `login_count_30d`, `_90d`228- `avg_login_duration_30d`229- `digital_banking_activity_score_90d`230- `mobile_vs_web_usage_share`231- `bill_pay_usage_rate_90d`232- `transfer_count_90d`233- `account_alert_engagement_flag`234235### 3.11 Trend and comparison features236These are critical for underwriting because they capture deterioration or strengthening financial health. This follows the same principle as the broader card feature skill’s “first vs last period” comparison logic, but the emphasis here is repayment capacity, liquidity, and affordability.237238- `avg_balance_first_6m`, `avg_balance_last_6m`239- `balance_last6m_vs_first6m_ratio`240- `net_cash_flow_last_30d_vs_prev_30d`241- `inflow_last_30d_vs_prev_30d`242- `checking_balance_slope_90d`243- `cash_flow_decline_pct_30d`244- `overdraft_event_trend_90d`245- `income_volatility_change_90d`246- `product_depth_change_180d`247248### 3.12 Interaction features249These should only be used after reviewing the base feature set.250251- `balance_volatility × bureau_score`252- `monthly_inflow × overdraft_count`253- `cash_buffer_days × existing_card_utilization`254- `salary_coverage_ratio × loan_payment_to_income_proxy`255- `account_tenure × direct_deposit_ratio`256- `net_cash_flow × n_active_products`257- `checking_balance_trend × delinquency_flag`258259## Step 4 — Cash-flow-specific underwriting logic260261For card underwriting, the most powerful signal is not just total balance but the customer’s ability to maintain cash flow after recurring obligations.262263Use these definitions:264265- `monthly_inflow_proxy`: direct deposits + payroll + recurring credits266- `monthly_outflow_proxy`: debits + recurring bills + transfers + card payments267- `cash_buffer_days = avg_balance / avg_outflow_per_day`268- `debt_service_coverage_proxy = inflow / obligations_proxy`269- `income_stability_score = 1 / (1 + CV(inflow))` with smoothing270271A customer with high account tenure, stable payroll inflows, healthy balances, and low overdraft behavior is generally stronger than a customer with high current balance but volatile inflows and repeated NSF events.272273## Step 5 — Feature quality and missingness274275- For missing balance history, create a missingness flag and a fallback indicator276- For customers with no checking history, separate them into a new “thin-file bank relationship” bucket277- Record denominator explicitly for all ratios (`total_inflow`, `total_outflow`, `transaction_count`)278- Use `days_since_last_*` features with a sentinel and companion boolean flags279- Handle low-historical customers carefully; an absence of signals is different from poor financial health280281## Step 6 — Leakage checklist282283- No post-cutoff balance, inflow, or transaction data284- No future bureau pull or updated score beyond the cutoff285- No service outcomes resolved after the underwriting decision286- No future account openings, product changes, or new loan products after the cutoff287- No use of approval/reject outcomes as features in the model sample288289## Step 7 — Validation and selection290291- Check time stability across monthly snapshots292- Compare feature distributions for approved vs declined populations293- Measure feature importance with SHAP or permutation importance294- Remove highly collinear features after checking business interpretability295- Prefer features with clear underwriting meaning over purely statistical “score” features296297## Step 8 — Testing and reproducibility298299- Unit test each feature function for zero denominators, edge cases, and off-by-one errors300- Produce a feature registry with columns:301 - `feature_name`302 - `description`303 - `source_table`304 - `window_days`305 - `type`306 - `business_use`307 - `owner`308- Save a `feature_spec.yaml` documenting derivations and assumptions309310## Step 9 — Monitoring and production use311312- Track PSI / drift for top underwriting features313- Monitor null-rate spikes from checking or deposit feeds314- Watch for sudden account-balance shifts caused by seasonality or product migration315- Validate model calibration on recent approval cohorts before redeployment316317## Example deliverables318319- `SKILL.md` for underwriting design320- `feature_spec.yaml` for feature contract321- synthetic validation tests for cash-flow and account-balance logic322- a standardized feature registry for approval / limit-assignment use cases323324## Summary325326This underwriting skill is explicitly different from general customer response or inactivity modeling. It focuses on a customer’s ability to support and repay card obligations using:327328- deposit and checking balances329- inflow stability and direct deposit quality330- cash-flow resilience331- overdraft and NSFs332- account tenure and relationship depth333- cross-product banking behavior334- affordability proxies and repayment capacity335336These are the features that matter most when deciding whether a customer can responsibly carry a credit card and how much they can support.