← StafFixHR home

Salary disbursement (bank-agnostic)

Generate bulk-payment files for any Indian bank, or push payouts via Razorpay X — straight from a finalized payroll period.

Workflow at a glance

Finalize payroll for month
        ↓
Disbursements → Batches → Generate
        ↓
   DRAFT  ← review lines, fix bank gaps
        ↓ approve
   READY
        ↓ download
EXPORTED  → upload file to bank portal
        ↓ paste UTRs back into StafFixHR.com
  SETTLED → employees notified ("Salary credited")

Supported banks (out of the box)

  • ICICI — Connected Banking (CIB) CSV
  • HDFC — ENet bulk-payment text
  • SBI — Cash Management Portal (CMP) fixed-width
  • Axis — Corporate Internet Banking CSV
  • Kotak — Biz CSV
  • Yes Bank — Corporate Banking CSV
  • Razorpay X — API payouts (mock until 2 env keys land)
  • Generic NEFT — RBI-style CSV accepted by most PSU / co-op banks

Need a bank we don't support? Drop one file under apps/api/src/disbursements/adapters/ implementing the BankAdapter interface, register it in registry.ts, no other code changes.

Setup checklist (HR)

  1. Open /admin/disbursementsBank profiles tab.
  2. Add a profile per bank account you pay from (label it "ICICI Primary" etc.).
  3. Pick the bank format → fill any required client codes shown.
  4. Switch to the Employee bank accounts tab and enter (or verify) each employee's account + IFSC.
  5. Run payroll for the month → it must reach FINALIZED status.
  6. Back on BatchesGenerate from payroll → pick period, value date, bank profile.
  7. Review the draft → fix skipped employees (no account / zero net pay) → approve.
  8. Download the file → upload to your bank portal → paste UTRs back to settle.

Razorpay X (auto-payouts)

Set RAZORPAY_X_KEY_ID and RAZORPAY_X_KEY_SECRET on Railway to enable live API mode. Until then the adapter generates a JSON payload you can paste into Razorpay X Bulk Payouts.

Audit & safety

  • Bank details are snapshotted onto every line when the batch is generated — editing the employee's account later does not change a settled batch.
  • Two-person rule: creator and approver are recorded separately (config TBD; both can be the same HR_ADMIN today).
  • Batches are immutable once EXPORTED. Mistakes are corrected by a new batch + reconciliation note, never edits to history.
  • Storage: bank file copy lives at disbursements/<companyId>/<batchId>/ in R2.