DEV Community

zikarelhub
zikarelhub

Posted on

Nigerian Fintech Compliance Architecture — KYC, AML, Audit Trails and Reconciliation

The CBN 2026 Fintech Report identifies one of the most expensive mistakes in Nigerian fintech: founders launching before compliance architecture is ready, then discovering licensing requires rebuilding rather than extending. Here is the complete technical implementation.

Source: CBN Fintech Report 2026

1. KYC — Tiered Implementation

// CBN KYC tiers with transaction limits
const KYC_TIERS = {
  TIER_1: {
    requirements: ['phone_otp', 'bvn_nibss'],
    singleLimit: 50_000,    // ₦50,000
    dailyLimit: 300_000     // ₦300,000
  },
  TIER_2: {
    requirements: ['phone_otp', 'bvn_nibss', 'govt_id', 'liveness_check'],
    singleLimit: 500_000,
    dailyLimit: 1_000_000
  },
  TIER_3: {
    requirements: ['all_tier2', 'address_verification', 'source_of_funds'],
    singleLimit: null, // Case by case
    dailyLimit: null
  }
};

// Liveness detection — must defeat static photo attacks
// Confidence threshold: 95%+ for CBN compliance
const livenessResult = await verifyLiveness(faceData);
if (livenessResult.confidence < 0.95) throw new Error('Liveness failed');

// Sanctions screening — at onboarding AND nightly ongoing
const screening = await screenAgainstLists({
  lists: ['UN_SANCTIONS', 'OFAC', 'NFIU_WATCHLIST', 'PEP_NIGERIA'],
  name: user.fullName,
  bvn: user.bvnHash
});
Enter fullscreen mode Exit fullscreen mode

2. AML — Transaction Monitoring

// CBN reporting thresholds
const CTR_THRESHOLD = 5_000_000; // Auto-report to NFIU above ₦5M

async function analyzeTransaction(tx) {
  const riskScore = await calculateRiskScore(tx);

  // Automatic Currency Transaction Report
  if (tx.amount >= CTR_THRESHOLD) {
    await fileCTRWithNFIU(tx);
  }

  // Structuring detection — transactions just below threshold
  const nearThreshold = await countNearThresholdTransactions(tx.userId, 24);
  if (nearThreshold >= 3) riskScore += 40; // Structuring signal

  // SAR review if high risk
  if (riskScore >= 70) {
    await createSARCase(tx, riskScore);
    await notifyComplianceOfficer({ urgency: riskScore >= 85 ? 'HIGH' : 'MEDIUM' });
  }
}
Enter fullscreen mode Exit fullscreen mode

3. Immutable Audit Trail — Hash-Chained

// Write-only — application can never update or delete audit logs
// Separate database from main application

async function writeAuditLog(entry) {
  const fullEntry = {
    ...entry,
    timestamp: new Date().toISOString(),
    previousHash: lastHash // Chain to previous entry
  };

  // Hash this entry — tamper-evident
  fullEntry.entryHash = crypto
    .createHash('sha256')
    .update(JSON.stringify({ ...fullEntry, entryHash: undefined }))
    .digest('hex');

  await auditDb.collection('logs').insertOne(fullEntry);
  lastHash = fullEntry.entryHash;
}

// Every KYC decision, transaction, admin action must be logged
// 7-year retention minimum for CBN compliance
Enter fullscreen mode Exit fullscreen mode

4. Daily Automated Reconciliation

// Run every night — match internal ledger against provider settlements
async function dailyReconciliation(date) {
  const [paystackReport, internalRecords] = await Promise.all([
    fetchPaystackSettlementReport(date),
    Transaction.findAll({ where: { settlementDate: date } })
  ]);

  const exceptions = [];

  for (const settlement of paystackReport.transactions) {
    const internal = internalRecords.find(
      r => r.paystackReference === settlement.reference
    );

    if (!internal) exceptions.push({ type: 'UNMATCHED', ...settlement });
    else if (internal.amount !== settlement.amount)
      exceptions.push({ type: 'AMOUNT_MISMATCH', ...settlement });
  }

  // Store report — available for CBN examination
  await ReconciliationReport.create({ date, exceptions, status: exceptions.length ? 'EXCEPTIONS' : 'CLEAN' });

  if (exceptions.length) await alertComplianceTeam({ exceptions });
}
Enter fullscreen mode Exit fullscreen mode

The Compliance Architecture Checklist

KYC:          NIBSS BVN validation, 95%+ liveness, sanctions + PEP screening, immutable logs
AML:          Real-time monitoring, CTR >= ₦5M auto-report, SAR workflow, annual audit
Audit Trail:  Write-only, hash-chained, 7-year retention, regulator-exportable
Reconciliation: Daily automated, exception routing, reports stored
Incident:     Response plan, CBN templates, escalation chain documented
Enter fullscreen mode Exit fullscreen mode

The fintechs that get licensed are the ones that built compliance first.


ZikarelHub LTD is Nigeria's #1 software and digital agency — CBN-compliant fintech platforms built from the architecture phase.

Source: CBN Fintech Report 2026

What compliance challenge are you facing in your Nigerian fintech build? 👇

Top comments (0)