Skip to main content

KYC Implementation Guide

Last Updated: 2025-12-28 Status: Complete

This page covers practical implementation considerations for KYC processes in PayFac platforms.

Where KYC Fits in Onboarding Flow​

Integration Patterns​

Synchronous (Real-time)​

// NestJS example: Synchronous KYC verification
import { Injectable } from '@nestjs/common';
import { JumioClient } from 'jumio-sdk';

@Injectable()
export class KycService {
constructor(private jumioClient: JumioClient) {}

async verifyIndividual(data: IndividualKycDto): Promise<KycResult> {
// Submit verification request
const verificationId = await this.jumioClient.createVerification({
firstName: data.firstName,
lastName: data.lastName,
dob: data.dateOfBirth,
country: data.country,
callbackUrl: `${process.env.BASE_URL}/webhooks/kyc`,
});

// Wait for result (use webhooks in production for better UX)
const result = await this.jumioClient.getVerificationResult(verificationId);

return {
verified: result.decision === 'APPROVED',
verificationId,
confidence: result.confidence,
rejectionReasons: result.rejectionReasons,
};
}
}

Asynchronous (Webhook-based)​

// NestJS example: Webhook handler for KYC results
import { Controller, Post, Body, Headers } from '@nestjs/common';

@Controller('webhooks')
export class WebhookController {
constructor(private onboardingService: OnboardingService) {}

@Post('kyc')
async handleKycWebhook(
@Body() payload: JumioWebhookPayload,
@Headers('x-jumio-signature') signature: string,
): Promise<void> {
// Verify webhook signature
if (!this.verifySignature(payload, signature)) {
throw new UnauthorizedException('Invalid signature');
}

// Process result
if (payload.decision === 'APPROVED') {
await this.onboardingService.approveKyc(payload.merchantId);
} else {
await this.onboardingService.rejectKyc(
payload.merchantId,
payload.rejectionReasons,
);
}
}

private verifySignature(payload: any, signature: string): boolean {
// Implement HMAC verification
// ...
}
}

Data Retention Requirements​

FinCEN CIP Rule: Retain records for 5 years after account closure.

What to Retain​

  • Copy of identification documents (encrypted)
  • Verification results and methods used
  • Date of verification
  • PEP/sanctions screening results
  • Any additional due diligence documentation
  • Declination rationale (if rejected)

Storage Best Practices​

  • Encrypt at rest (AES-256)
  • Encrypt in transit (TLS 1.2+)
  • Access controls (role-based, audit logging)
  • Backup and disaster recovery
  • Geographic compliance (GDPR, data residency)

Declining Merchants: Documentation​

When declining a merchant due to KYC failure:

What to Document​

  1. Reason for declination (specific: failed liveness, sanctions hit, false ID)
  2. Date of decision
  3. Reviewer name (if manual review)
  4. Supporting evidence (verification report, screening results)

SAR Filing Triggers​

  • Sanctions list match (OFAC, UN, EU)
  • Suspected fraud or identity theft
  • Unusual transaction patterns during onboarding
  • Known or suspected terrorist financing

SAR Timeline​

  • File within 30 days of detecting suspicious activity
  • Do NOT notify the customer (illegal to "tip off")
  • Provide generic declination reason: "Unable to verify identity" or "Does not meet underwriting criteria"
Never Tip Off a SAR Subject

18 U.S.C. § 1956(c)(1): It is a federal crime to notify someone that a SAR has been filed about them.

Acceptable Declination Reasons:

  • "We are unable to verify your identity at this time."
  • "Your application does not meet our underwriting criteria."
  • "We cannot onboard your business based on our risk assessment."

NEVER say:

  • "You are on a sanctions list."
  • "We filed a Suspicious Activity Report."
  • "Your activity appears fraudulent."

PayFacs must provide sponsor banks with regular compliance reporting:

Quarterly Reports​

  • KYC verification pass/fail rates
  • High-risk merchant approvals (with EDD documentation)
  • PEP-identified merchants and monitoring results

Annual Reports​

  • Independent audit of KYC/AML program
  • Policy and procedure updates
  • Staff training records

Ad-hoc Reports​

  • SAR filings (copy to sponsor bank compliance)
  • Sanctions screening hits (immediate notification)
  • Material policy changes

Common Mistakes and How to Avoid Them​

MistakeImpactHow to Avoid
Accepting expired IDsRegulatory violation, fraud riskAutomate expiration date checks in verification flow
Not performing liveness detectionDeepfake fraud, synthetic identitiesRequire ISO 30107-3 PAD Level 1+ from provider
Skipping PEP screening for high-volume merchantsMoney laundering risk, regulatory scrutinyImplement risk-based triggers (volume >$100k/month)
Storing SSNs in plaintextPCI DSS violation, data breach liabilityEncrypt at rest (AES-256), tokenize when possible
Not documenting manual review decisionsAudit failure, inconsistent decisionsRequire reviewers to log reason, evidence, decision
Delaying verification >30 daysFinCEN violation ("reasonable period")Set internal SLA: 7 days max, automate reminders
Tipping off SAR subjectsFederal crime (18 U.S.C. § 1956)Use generic declination language, train staff
Not refreshing PEP statusMiss changes in risk profileAnnual refresh for high-risk, event-driven for others
Ignoring middle namesFalse positives in sanctions screeningCollect and verify middle name/initial
Accepting P.O. Box as primary addressFinCEN violation (requires street address)Validate address format, reject P.O. Boxes for primary

Common Rejection Reasons​

Document Quality Issues (40%)​

  • Blurry image, glare, shadows
  • Cropped or incomplete ID
  • Expired document
  • Fix: Provide real-time feedback ("Image too dark, please retake")

Incomplete Data (25%)​

  • Missing middle name
  • Incorrect address format
  • DOB mismatch (MM/DD vs DD/MM)
  • Fix: Validate fields before submission, show format examples

Information Mismatch (20%)​

  • Spelling differences (legal name vs. common name)
  • Address transposition (123 Oak St vs 123 Oak Street)
  • DOB typos
  • Fix: Allow fuzzy matching, manual review for close matches

False Positives (10%)​

  • Common name matches sanctions list
  • Living near sanctioned address
  • Adverse media for different person with same name
  • Fix: Manual review with additional data points (DOB, nationality)

Fraud Detection (5%)​

  • Synthetic identity (real SSN + fake name)
  • Deepfake video
  • Stolen identity
  • Fix: Multi-factor verification, behavioral analytics

Card Network Requirements​

Visa PayFac Certification​

KYC-Related Requirements:

  • Documented KYC/AML policies and procedures
  • Annual independent audit of AML program
  • Evidence of sub-merchant verification process
  • PEP/sanctions screening capability
  • MATCH list screening before onboarding

Registration Fee: $5,000

Mastercard MATCH List​

MATCH (Member Alert to Control High-Risk Merchants): Database of terminated merchants.

Requirement: PayFacs MUST check MATCH before onboarding every sub-merchant.

Reason Codes:

  • Code 01: Account data compromise
  • Code 02: Common point of purchase (fraud)
  • Code 04: Excessive chargebacks
  • Code 05: Excessive fraud
  • Code 06: Money laundering
  • Code 12: PCI DSS non-compliance
  • Code 14: Illegal transactions

Retention: 5 years on list

Impact: Merchant listed on MATCH typically cannot be onboarded by any acquirer/PayFac during retention period.

Share: