All work

11 · fintech · document ai

AI paystub screening before Plaid verification

Suspicious or unusable paystubs are flagged before they reach a human underwriter, and clean ones go to Plaid automatically.

  • OpenAI API
  • Azure OpenAI
  • Vision models
  • Laravel
  • Node.js
  • Playwright
  • Plaid
Client
US consumer lender
Role
AI Engineer
Period
Devinware LLC · ongoing

Problem

Borrowers upload paystubs that are stale, incomplete or not payroll documents at all, and each upload needed manual checking before Plaid verification.

How it works

diagram · What happens to an uploaded paystub
  1. 01UploadThe borrower uploads a paystub.
  2. 02ExtractA vision model fills a strict schema: employer, pay period, gross and net pay, deductions, garnishments.
  3. 03CheckDeterministic checks catch stale, incomplete or non-payroll documents.
  4. 04Cross-checkNet pay is compared with bank deposits.
  5. 05Send to PlaidClean documents are uploaded automatically.
  6. 06One fraud flagAll risk signals roll into one flag for underwriting.

What I built

  • Vision-model extraction of employer, pay period, gross and net pay, deductions and garnishments into a strict schema.
  • An automatic provider fallback on the Laravel side: when the primary Azure OpenAI call fails, the extraction is retried on OpenAI.
  • Deterministic document checks that tell the borrower exactly what to re-upload instead of silently rejecting the file.
  • A Node.js service that uploads clean documents to Plaid automatically by driving a headless browser with Playwright.
  • A pluggable signal aggregator, so new fraud checks plug in without touching the core.

Guardrails

  • Extraction is forced into a strict schema before any check runs.
  • Borrowers get a specific re-upload request, not a silent rejection.

Result

Removed manual document checks from the operations team.

Suspicious documents are flagged before they reach a human underwriter.

media note

Client systems are under NDA, so this case study uses words and a diagram instead of screenshots.