Skip to content

Integration DAG: Onboarding

Why this page is structured this way: Onboarding is the most parallel-rich phase a broker has — Screen 2 fires four async calls simultaneously, the post-checker batch zone fires eight pipelines in parallel. Two big DAGs explain the structure; one combined per-node detail table sits underneath.

  • 3 ASCII DAGs covering Screens 1–9, post-eSign maker-checker, and the 8-pipeline batch zone.
  • ~28 unique integration nodes across the full onboarding arc.
  • Async-convergence on Screen 8 is the most consequential gate — it consumes results of every Screen-2 + Screen-5 + Screen-6 async call.
  • Final ACTIVE gate is the AND of three independent conditions: KRA Registered + BO Active + UCC Approved.

Onboarding’s job is to take a stranger and turn them into a trade-eligible client across half a dozen regulators and registries — all without the customer staring at a spinner for more than a second. The orchestration accomplishes this by fanning out async at every opportunity. Screen 2’s PAN+DOB submission fires four parallel calls that all need to be done by Screen 8; the customer’s 60-second DigiLocker journey on Screen 3 provides cover. Post-eSign, eight unrelated batch pipelines run independently because none of them depend on each other’s output — the slowest one (NSDL at ~15 days) determines wall-clock to ACTIVE.

DAG 1 — Screens 1 to 4 (async convergence on identity)

Section titled “DAG 1 — Screens 1 to 4 (async convergence on identity)”
ONB-S1-MOBILE_OTP
ONB-S2-PAN_DOB_SUBMIT (entry)
├──────────────► ONB-S2-PAN_VERIFY (Protean)
├──────────────► ONB-S2-KRA_LOOKUP (CVL/NDML/DOTEX/CAMS/KFintech)
├──────────────► ONB-S2-CKYC_SEARCH (CERSAI; masked KIN post Jan 2025)
└──────────────► ONB-S2-AML_SCREEN (sanctions + PEP)
│ (results land async; user travels to S3 meanwhile)
ONB-S3-DIGILOCKER_CONSENT ──► ONB-S3-DIGILOCKER_FETCH (Aadhaar XML harvest)
ONB-S4-CONFIRM_IDENTITY (prefill assembled from DigiLocker > CKYC > KRA)
▼ (S5-S6-S7 below)
ONB-S5-BANK_SUBMIT ──► ONB-S5-PENNY_DROP (Re.1 IMPS + name match)
└──► async result lands by S8
ONB-S6-TRADING_PREFS ──► ONB-S6-INCOME_VERIFY (AA / ITR / manual — if F&O/COM)
└──► async result lands by S8
ONB-S7-NOMINATIONS
ONB-S8-BLOCKING_GATE (AND of: PAN status E, PAN-Aadhaar linked, AML clean,
penny drop name-match pass, KRA/CKYC search complete,
income verify complete-if-applicable)
(any FAIL) ◄┴──► (ALL PASS)
│ │
▼ ▼
ONB-S8-REMEDIATE ONB-S9-FACE_MATCH (selfie vs Aadhaar photo)
(user fix path) │
ONB-S9-AADHAAR_OTP_ESIGN (final eSign with DSC)
(handed off to maker-checker — DAG 3)

DAG 3 — Maker-checker and the 8 batch pipelines

Section titled “DAG 3 — Maker-checker and the 8 batch pipelines”
ONB-S9-ESIGN_DONE
ONB-MAKER_REVIEW (auto-approve if all checks green; manual queue otherwise)
ONB-CHECKER_APPROVE (independent supervisor sign-off — SEBI dual-control)
├────────────► ONB-BATCH-KRA (CVL/NDML/DOTEX/CAMS/KFintech upload; 2-3d)
├────────────► ONB-BATCH-CKYC (CERSAI JSON upload; KIN issuance 4-5d)
├────────────► ONB-BATCH-NSE_UCC (REST or batch file; same day)
├────────────► ONB-BATCH-BSE_UCC (BEFS; same day)
├────────────► ONB-BATCH-MCX_UCC (pipe-delimited; income proof required; next WD)
├────────────► ONB-BATCH-CDSL_BO (CDAS fixed-length; 1-2h)
├────────────► ONB-BATCH-NSDL_BO (UDiFF ISO-tagged; ~15d incl. PAN flag)
└────────────► ONB-BATCH-INCOME (1-2h; only if F&O/COM elected)
│ (8 pipelines run independently; fan-in below)
ONB-FINAL_GATE (KRA Registered AND BO Active AND UCC Approved)
ONB-ACTIVE (account status flips; welcome cascade fires)
node_idoperationdepends_onblocksparallel_eligibleidempotentretry_policyrollbackslafailure_surfacespec_source
ONB-S1-MOBILE_OTPSMS OTP send + verify[entry]ONB-S2-PAN_DOB_SUBMIT[none]conditional (dedupe by mobile+timestamp)3× then email fallback[none]< 30sclient UI[industry typical]
ONB-S2-PAN_DOB_SUBMITCapture PAN + DOB; trigger fan-outONB-S1-MOBILE_OTPONB-S2-PAN_VERIFY, ONB-S2-KRA_LOOKUP, ONB-S2-CKYC_SEARCH, ONB-S2-AML_SCREEN[none]yesnone (user-initiated)[none]< 1sclient UISEBI/HO/MIRSD/MIRSD-SEC-2/P/CIR/2023/168
ONB-S2-PAN_VERIFYNSDL/Protean PAN status checkONB-S2-PAN_DOB_SUBMITONB-S8-BLOCKING_GATEONB-S2-KRA_LOOKUP, ONB-S2-CKYC_SEARCH, ONB-S2-AML_SCREENyes (PAN-keyed)3× exp backoff; manual queue on persistent 5xx[none]< 3s P95client UI / ops queueNSDL Protean specs
ONB-S2-KRA_LOOKUPKRA presence + status check (5-agency parallel)ONB-S2-PAN_DOB_SUBMITONB-S2-PREFILL_RESOLVEparallel-with PAN/CKYC/AMLyes3× then proceed without prefill[none]< 5s P95client UI silentlySEBI/HO/MIRSD/SECFATF/P/CIR/2024/79
ONB-S2-CKYC_SEARCHCERSAI CKYC presence + masked KINONB-S2-PAN_DOB_SUBMITONB-S2-PREFILL_RESOLVEparallel-with PAN/KRA/AMLyes3× then proceed[none]< 5s P95client UI silentlyCKYC/2024/04
ONB-S2-AML_SCREENSanctions + PEP screenONB-S2-PAN_DOB_SUBMITONB-S8-BLOCKING_GATEparallel-with PAN/KRA/CKYCyes3× then ops alert[none]< 10s P95ops queue / client S8SEBI/HO/MIRSD/SECFATF/P/CIR/2024/78
ONB-S3-DIGILOCKER_CONSENTOAuth redirect + Aadhaar OTP on DLONB-S2-PAN_DOB_SUBMITONB-S3-DIGILOCKER_FETCH[none]yes (consent-keyed)manual retry only[none]< 60s user wall-clockclient UISEBI/HO/MIRSD/DOP/CIR/P/2020/73
ONB-S3-DIGILOCKER_FETCHPull Aadhaar XML + linked docsONB-S3-DIGILOCKER_CONSENTONB-S2-PREFILL_RESOLVE[none]yes3× then OCR-fallback prompt[none]< 5s P95client UIDigiLocker partner SOP
ONB-S2-PREFILL_RESOLVEMerge KRA + CKYC + DigiLocker (priority: DigiLocker > CKYC > KRA)ONB-S2-KRA_LOOKUP, ONB-S2-CKYC_SEARCH, ONB-S3-DIGILOCKER_FETCHONB-S4-CONFIRM_IDENTITY[none]yesno retry needed (local compute)[none]< 100msclient UI[industry typical]
ONB-S4-CONFIRM_IDENTITYDisplay prefill + collect emailONB-S2-PREFILL_RESOLVEONB-S5-BANK_SUBMIT[none]no (user action)none[none]user-drivenclient UI[industry typical]
ONB-S5-BANK_SUBMITCapture bank A/C + IFSCONB-S4-CONFIRM_IDENTITYONB-S5-PENNY_DROP[none]no (user action)none[none]< 1sclient UI[industry typical]
ONB-S5-PENNY_DROPRe.1 IMPS + name-match fuzzy scoreONB-S5-BANK_SUBMITONB-S8-BLOCKING_GATEparallel-with S6 pathconditional (dedupe by txn ref)1× retry on bank timeout; manual queue on persistentreversal entry T+1 if duplicated< 60s P95ops queue / client S8[industry typical]
ONB-S6-TRADING_PREFSSegment toggles + risk acknowledgementONB-S4-CONFIRM_IDENTITYONB-S6-INCOME_VERIFY[none]nonone[none]user-drivenclient UI[industry typical]
ONB-S6-INCOME_VERIFYAA / ITR / bank-stmt income checkONB-S6-TRADING_PREFSONB-S8-BLOCKING_GATEparallel-with penny-dropyes (consent-keyed)3× then manual upload prompt[none]< 30s AA / minutes for uploadclient UI / ops queueSEBI/HO/MIRSD/MIRSD-SEC-2/P/CIR/2023/168
ONB-S7-NOMINATIONSCapture nominees (up to 10) or opt-outONB-S6-TRADING_PREFSONB-S8-BLOCKING_GATEparallel-with S5/S6nonone[none]user-drivenclient UISEBI Jan-2025 nomination revamp
ONB-S8-BLOCKING_GATEAND-gate on all async resultsONB-S2-PAN_VERIFY, ONB-S2-AML_SCREEN, ONB-S5-PENNY_DROP, ONB-S6-INCOME_VERIFY, ONB-S7-NOMINATIONSONB-S9-FACE_MATCH or ONB-S8-REMEDIATE[none]yes (local check)none[none]< 100msclient UI[industry typical]
ONB-S8-REMEDIATEShow fix-path UI + re-trigger failed asyncONB-S8-BLOCKING_GATE (fail)ONB-S8-BLOCKING_GATE (retry)[none]yesuser-driven[none]user-drivenclient UI[industry typical]
ONB-S9-FACE_MATCHSelfie + liveness vs Aadhaar photoONB-S8-BLOCKING_GATE (pass)ONB-S9-AADHAAR_OTP_ESIGN[none]yes (session-keyed)3× attempts client-side; VIPV fallback[none]< 30s P95client UISEBI/HO/MIRSD/DOP/CIR/P/2020/73
ONB-S9-AADHAAR_OTP_ESIGNAadhaar-OTP eSign of applicationONB-S9-FACE_MATCHONB-MAKER_REVIEW[none]no (signed artefact)1× retry on OTP timeout; VIPV fallback[none]< 60s P95client UIIT Act 2000 §3A; CCA eSign guidelines
ONB-MAKER_REVIEWAuto-approve if green; manual queue otherwiseONB-S9-AADHAAR_OTP_ESIGNONB-CHECKER_APPROVE[none]yesnone (human-in-loop)[none]hours (manual) or < 1s (auto)ops queueSEBI/HO/MIRSD/MIRSD-SEC-2/P/CIR/2023/168
ONB-CHECKER_APPROVEIndependent supervisor sign-offONB-MAKER_REVIEWONB-BATCH-* (fan-out)[none]yesnone (human-in-loop)[none]hoursops queueSEBI dual-control rule
ONB-BATCH-KRAKRA upload (XML batch)ONB-CHECKER_APPROVEONB-FINAL_GATEparallel-with all other ONB-BATCH-*yes (PAN+ref-id keyed)24h retry then ops alert[none]2–3 daysKRA reject fileSEBI/HO/MIRSD/SECFATF/P/CIR/2024/79
ONB-BATCH-CKYCCKYC upload (CERSAI JSON)ONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes (PAN-keyed)24h retry then ops alert[none]4–5 days for KINCERSAI ack fileCKYC/2024/04
ONB-BATCH-NSE_UCCNSE UCC submit (REST or batch)ONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes (ref-id keyed)3× then manual queue[none]same dayNSE UCC reject codesNSE UCC circular
ONB-BATCH-BSE_UCCBSE BEFS submitONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes3× then manual queue[none]1–2 daysBSE BEFS rejectBSE BEFS circular
ONB-BATCH-MCX_UCCMCX UCC submit (pipe-delimited)ONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes3× then manual queue[none]next WDMCX file rejectMCX UCC circular
ONB-BATCH-CDSL_BOCDSL BO opening (CDAS lines 01–07)ONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes (ref-id keyed)3× then manual queue[none]1–2 hoursCDSL reject fileCDSL CDAS specs
ONB-BATCH-NSDL_BONSDL BO opening (UDiFF)ONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes3× then manual queue; PAN flag wait 5–7d[none]~15 daysNSDL DPM reject + PAN flagNSDL UDiFF Mar 2024
ONB-BATCH-INCOMEIncome verification (if F&O/COM)ONB-CHECKER_APPROVEONB-FINAL_GATEparallelyes (consent-keyed)1× retry; ops alert[none]1–2 hoursops queue[industry typical]
ONB-FINAL_GATEAND of KRA Registered + BO Active + UCC ApprovedONB-BATCH-KRA, ONB-BATCH-CDSL_BO, ONB-BATCH-NSDL_BO, ONB-BATCH-NSE_UCC, ONB-BATCH-BSE_UCC, ONB-BATCH-MCX_UCCONB-ACTIVE[none]yes (local check)none[none]< 100ms once inputs readynone (system)[industry typical]
ONB-ACTIVEStatus flip; welcome cascade firesONB-FINAL_GATE[exit][none]yes (status-keyed)nonereverse-flip if rollback needed (rare)< 1sclient UI / DLT comms[industry typical]
  • [industry practice] The 60-second DigiLocker redirect is treated by orchestrators as a budgeted slot for the Screen 2 fan-out to complete. If KRA / CKYC / PAN-verify don’t return within ~60 seconds, the client lands on Screen 4 with a “still verifying” indicator and a queued retry — the eSign step ultimately enforces the gate, not Screen 4.
  • [gotcha] ONB-BATCH-NSDL_BO is the slowest pipeline. The PAN flag finalization (5–7 days post-opening) is the silent killer — a client may show BO Active in the depository portal but not be trade-eligible until PAN flag clears. Most brokers gate trading on PAN flag, not BO opening.
  • [risk trade-off] Allowing trading before all 8 pipelines reach terminal state lets clients trade sooner (when KRA-Registered + CDSL-BO-Active + NSE-UCC-Approved are done, often ~24h) but exposes the broker to settlement-side rejections if a downstream pipeline (BSE/MCX/income) fails after first trade. Most brokers tolerate this risk for CM-only clients; F&O / COM clients are gated stricter.
  • [cost optimization] Manual queue items from KRA / CKYC / UCC / BO rejects cluster around the same root causes (name mismatches, address format, PAN-Aadhaar link failures). Auto-categorizing manual-queue items by root cause and routing them to specialized ops sub-teams roughly halves median resolution time.

2026-05-14


AI-generated and not legal, financial, or compliance advice. See the project README for full disclaimer.