~/openarch/work/ledgerline-// case study

An SME loan underwriting and lifecycle platform. Automated credit scoring, a single underwriter queue, and end-to-end loan tracking - replacing spreadsheet-based decisioning with an auditable runtime.

Northbridge Capital·SME lending · NBFC·2026·in production
openarch.in/work/ledgerline
Ledgerline interface
//the brief

What we built.

Northbridge underwrote on spreadsheets and email threads. We built one system that pulls bureau and bank-statement signals, scores every application into a risk band, and carries the loan from intake through disbursal to closure - with every status change written to an audit log.

// Underwrite with confidence.

domaincredit underwriting
shapeinternal platform
statusin production
surface7 core screens
stack
next.jsnode · expresspostgrespython · scoringredis
//what we shipped
01

Portfolio dashboard

Applications in queue, disbursed this month, at-risk repayments - with aging buckets for anything pending past its window.

02

Application intake

Applicant details, requested amount and purpose, plus document capture for PAN, GSTIN, bank statements and ITR.

03

Underwriting queue

Every application sorted by score band - Low Risk, Review, High Risk - with bulk assignment and document requests.

04

Credit score detail

Score broken down by factor: repayment history, balance stability, sector risk, bureau score. Bureau and statement viewers inline.

05

Loan lifecycle

A timeline from applied to closed, with the EMI schedule and paid / due / overdue states rendered per instalment.

06

Compliance & audit

Every status change and document access logged against an actor and a timestamp. Accountable by construction.

//data model
schema.sql5 tables
table applications
applicant_id, requested_amount, purpose, status, submitted_at
table bureau_reports
application_id, bureau_name, score, report_json, pulled_at
table credit_scores
application_id, model_version, score, band, factors_json
table loans
application_id, principal, tenor_months, rate, status
table repayments
loan_id, due_date, amount_due, amount_paid, status
// loan status machine
  1. 01applied
  2. 02underwriting
  3. 03approved
  4. 04disbursed
  5. 05active
  6. 06closed
//business logic
score-band.tsRisk banding
function scoreBand(score) {
if (score >= 720) return 'LOW_RISK' // auto-approve eligible
if (score >= 600) return 'REVIEW' // manual underwriter review
return 'HIGH_RISK' // decline unless override
}
factors.tsScoring factors
const weights = {
bureauScore: 0.35, // external credit history
statementStability: 0.30, // avg balance + bounce count
yearsInBusiness: 0.15,
sectorRisk: 0.10,
repeatBorrower: 0.10,
}
//on the roadmap

Honest edges.

  • →OCR fallback for scanned (non-native) bureau report PDFs
  • →Partial-payment handling in bulk EMI reconciliation
  • →Quarterly refresh of sector risk ratings from an external feed
//result
4d → 6h
underwriting turnaround, Low Risk
1
shared review queue, not email
100%
status changes audited

Northbridge cut average underwriting time from four days to under six hours for Low Risk applications, with every Review-band case routed to a single underwriter queue instead of scattered email threads.