ForexComply — FFMC Concurrent Audit Management Platform
Author : CA. Himanshu Majithiya
Author : CA. Himanshu Majithiya
ForexComply is a cloud-based application built for Chartered Accountant firms that perform concurrent audits of Full-Fledged Money Changers (FFMCs) licensed by the Reserve Bank of India under FEMA 1999. The platform manages the entire concurrent audit lifecycle within a single system — from engagement creation and document collection to automated transaction validation, dynamic checklist execution, structured observation management, and final report generation.
FFMCs are authorised dealers permitted to buy and sell foreign currency notes, coins, and travellers' cheques with members of the public. The RBI mandates that FFMCs above a specified annual turnover threshold undergo monthly concurrent audits, and smaller FFMCs undergo quarterly concurrent audits. These audits require 100% transaction verification — not sampling — against a complex framework of FEMA provisions, LRS limits, AML/CFT norms, TCS thresholds, KYC requirements, and purpose code rules.
The platform is built on Django 5.2 + Django REST Framework (backend), React 18 + TypeScript + Ant Design 5 (frontend), PostgreSQL (database), and Celery + Redis for asynchronous task processing. It supports six distinct user roles across two stakeholder types — CA firm personnel and FFMC client users — each with separate, role-controlled workspaces within the same application.
Before ForexComply, CA firms conducting FFMC concurrent audits relied on:
These approaches are error-prone, time-intensive, and create compliance gaps — particularly given the RBI mandate for 100% transaction coverage and the volume of transactions in an active FFMC branch.
Five role levels with distinct access controls:
Each audit engagement moves through the following tracked stages:
On FLM document upload, a Celery asynchronous task chain executes these steps in sequence:
Configurable validation rules are executed automatically on each uploaded document. Rules are organised in eight categories:
Each failed rule produces a validation result record with the specific affected transaction or document reference. Failed validations can auto-create observation drafts pre-populated with the affected record details.
The checklist is not a static template — it is generated fresh for each audit from the actual data of that engagement. Items come from four sources:
Each item tracks: auditor compliance status (Pending / Complied / Partially Complied / Not Complied / N/A), reviewer approval, remarks, and attached evidence documents.
Structured audit findings with full lifecycle tracking:
FFMC client users access a separate, role-controlled workspace within the same platform. Available actions for client users:
A scheduled Celery Beat task runs daily at 09:00 IST and:
A Retrieval-Augmented Generation (RAG) AI assistant is built into the platform for both auditors and FFMC client users.The assistant answers compliance questions in plain English, grounded in the platform's own knowledge base.
Knowledge base contents:
How it works:
The platform assembles a structured concurrent audit report from the audit database. The following sections are auto-populated and locked (cannot be edited):
Editable sections (Scope and Methodology, Management Comments, Conclusion, Additional Remarks) accept partner-level narrative input.Report is versioned, exportable as PDF or DOCX, and can be locked to prevent further edits once finalised.
The following scheduled tasks run automatically via Celery Beat:
Platform administrators configure regulatory limits without code changes. The Forex Limits master holds named limit records with value, currency, effective date, and RBI circular reference. All validation rules reference these limits dynamically. Limits currently configured include:
The following table describes, for each stage of an FFMC concurrent audit, what a CA previously had to do manually and what ForexComply now provides:
| Audit Stage / Task | Without ForexComply | With ForexComply |
| Client onboarding | Collect FFMC licence, FIU number, branch details on paper or email; store in a folder; no structured cross-reference | Structured client master captures all FFMC-specific fields; RBI licence and FIU registration stored and monitored for expiry; branch flags drive conditional document requirements |
| Requesting documents | Email or call the FFMC for a list of required registers; track receipt in a spreadsheet | Platform generates the required document list based on audit period and branch flags; client uploads directly to the audit; all receipts tracked with version history |
| FLM transaction extraction | Manually open FLM Excel file, review each row, re-enter data into an audit worksheet | Celery task auto-extracts all FLM rows on upload; structures data into the Transaction table with customer details, amounts, currency, purpose code, and rate |
| Risk identification | Auditor manually scans rows for high-value transactions, missing PAN, LRS near-breach, same-customer-same-day patterns | Seven risk flags applied automatically during extraction: high-value (> USD 3,000), LRS cumulative breach, LRS near-limit, PAN absent, TCS threshold reached, CTR threshold, split transaction suspected |
| Regulatory limit checking | Look up current RBI limits in circular PDFs before each audit; apply manually to flagged transactions | Validation engine checks all transactions against the Forex Limits master automatically; when RBI revises a limit, admin updates one record and all future validations reflect it |
| Audit plan preparation | Write scope, methodology, team, and period into a Word document for each engagement | Draft plan auto-generated on FLM upload with period, team, scope, and 100%-verification mandate; manager reviews and approves; never overwrites an approved plan |
| Checklist preparation | Copy a checklist template and manually add transaction-level items for flagged transactions; no link between checklist items and actual data records | Dynamic checklist auto-built from actual audit data; every transaction has a checklist item; risk-flagged transactions in a highlighted section; validation failures add dedicated items |
| Balance reconciliation | Manually total FLM columns per currency, compare to opening and closing balances, cross-reference stock statement and subsidiary ledger | Balance continuity and cross-reconciliation validation rules run automatically; discrepancies surfaced as failed validation results with specific affected amounts |
| Observation writing | Auditor types each finding from scratch, referencing validation notes written separately | Failed validation results can auto-create observation drafts pre-filled with the affected transaction or document reference; auditor reviews and finalises the text |
| Client response management | Email observations to client; track replies in a thread; attach responses to working papers | Structured observation response workflow in the client portal; every response timestamped, attributed, and available as part of the permanent audit record |
| Report writing | Copy all transaction counts, amounts, validation results, and observation summaries into a Word template; manually reformat tables; verify figures | Report auto-assembled from the audit database; data-driven sections are locked; partner adds narrative in editable sections only; export as PDF or DOCX |
| Regulatory update monitoring | Monitor RBI website manually or subscribe to email lists; distribute PDFs to audit team; update internal reference notes | Daily automated scraping of rbi.org.in; new FFMC-relevant circulars stored and surfaced to the team; weekly email digest sent automatically; AI assistant updated within minutes of publication |
| Compliance queries during audit | Search through circular PDFs or consult a senior partner for specific rule interpretation | RAG AI assistant answers in plain English with exact source citations and similarity scores; knowledge base reflects the platform's own circular and rules database |
| Licence and KYC monitoring | Maintain a spreadsheet of client RBI licence expiry dates and customer KYC dates; check manually before each audit or at month end | Automated daily scans alert the firm when any client licence approaches expiry or when customer KYC records are overdue for refresh |
| Exchange rate reference | Visit RBI website or call bank treasury for daily INR rates | Daily automated fetch of RBI exchange rates from data.gov.in at 18:30 IST; stored in the platform for use in rate-comparison validations |
| Audit team knowledge continuity | Compliance knowledge concentrated with senior partners; junior staff uncertain about specific RBI provisions | AI assistant provides cited answers from the live knowledge base; checklist items carry RBI/FEMA section references; observation categories are standardised |
Every item below was previously a manual step performed by the auditor, firm staff, or client. ForexComply automates it by the mechanism described.
| Task Previously Done Manually | Trigger in ForexComply | Mechanism |
| Extract transaction rows from FLM Excel | FLM document uploaded | Celery task — ExcelExtractor parses FLM rows regardless of header variation |
| Populate transaction verification grid | FLM document uploaded | Celery task — each extracted row written to Transaction table with full metadata |
| Flag high-value transactions (> USD 3,000) | FLM document uploaded | Risk flag applied during extraction when amount exceeds BTQ_NOTES_USD limit |
| Track cumulative LRS usage per customer | Each transaction processed | Cumulative year-to-date LRS total computed per customer; breach and near-limit flags applied |
| Detect missing PAN on eligible transactions | FLM document uploaded | Validation rule checks PAN field against PAN-mandatory threshold |
| Detect split transactions (structured) | Validation run | Validation rule scans for same customer, same day, multiple entries below reporting threshold |
| Reconcile FLM opening/closing balances | Validation run | Balance continuity validation rule computes and compares per currency per branch |
| Cross-reference FLM vs subsidiary ledger | Validation run | Cross-reconciliation validation rule compares FLM totals to uploaded subsidiary documents |
| Check for duplicate transaction entries | Validation run | Duplicate detection validation rule compares transaction fingerprints across uploads |
| Check KYC currency for each customer | Validation run | KYC/AML validation rule checks last-KYC date against regulatory refresh period |
| Draft audit plan | FLM document uploaded | Celery task calls _auto_generate_plan(); sets scope, period, team; never overwrites approved plan |
| Build audit checklist | FLM document uploaded | Celery task calls initialize_audit_checklist(); generates items from master, documents, transactions, validations |
| Create observation draft from failed rule | Validation rule fails | Configurable per rule: auto_create_observation flag triggers ObservationService |
| Monitor RBI website for new circulars | Daily at 09:00 IST | Celery Beat task ingest_rbi_circulars() scrapes rbi.org.in with keyword filtering |
| Download and store circular PDFs | New circular detected | Celery task downloads PDF with realistic headers; stores with metadata |
| Re-embed knowledge base on content change | Circular / limit / rule saved by admin | Django post_save signal → embed_source_async Celery task → upserts vector chunks |
| Email weekly circular digest | Weekly scheduled | Celery Beat task send_weekly_circular_digest(); emails all firm users |
| Fetch daily RBI exchange rates | Daily at 18:30 IST | Celery Beat task fetch_rbi_rates() fetches from data.gov.in |
| Alert on client RBI licence expiry | Daily at 08:00 IST | Celery Beat task scan_license_expiry(); generates in-app and email alerts at 90-day mark |
| Alert on customer KYC overdue | Daily at 08:15 IST | Celery Beat task scan_kyc_overdue(); flags all overdue customers |
| Alert on audit deadline breach | Daily at 09:00 IST | Celery Beat task scan_audit_overdue(); notifies audit manager |
| Refresh audit analytics dashboards | Nightly at 02:00 IST | Celery Beat task refresh_all_active_analytics(); rebuilds metrics for all active audits |
| Encrypt uploaded documents at rest | Document saved to disk | encrypt_document_file() called after serializer.save(); AES-256-GCM applied in place |
| Log file download with hash and user | Download request received | AuditLog.log() called in download view before FileResponse returned |
| Overwrite file data on deletion | Document record deleted | Django post_delete signal → _delete_file() overwrites file bytes before os.remove() |
| Auto-title new AI conversations | First message in a conversation | ChatView sets conversation.title to first 60 characters of the user's question |
The following specific regulatory obligations are directly addressed by features in the platform:
| Regulation | Specific Obligation | Platform Feature |
| RBI Concurrent Audit guidelines | 100% transaction verification — no sampling | One checklist item auto-generated per transaction; verification status tracked individually per item |
| FEMA 1999 / RBI Master Direction on LRS | Annual LRS cap USD 2,50,000 per individual; purpose-wise sub-limits | Cumulative LRS tracker per customer per financial year; breach and near-limit flags in risk grid; purpose code sub-limits in master data |
| RBI Master Direction on KYC (2016) | Periodic KYC refresh; enhanced DD for high-risk customers | Daily KYC overdue scan; high-risk customer flag stored in customer master; KYC validation rule |
| PMLA 2002 / AML-CFT guidelines | CTR for cash > ₹10 lakh; STR for suspicious transactions; FIU registration | CTR threshold validation rule; split transaction detection rule; FIU registration field in client master |
| Income Tax Act Section 206C | TCS at 20% on LRS remittances above ₹7 lakh per year | TCS_THRESHOLD_INR forex limit; auto-flagged in validation results with affected transaction reference |
| Income Tax Act Section 269ST | Cash receipts above ₹2 lakh prohibited | CASH_RECEIPT_INR forex limit; breach escalated as failed validation result |
| PAN requirement (RBI circular) | PAN mandatory for forex transactions above USD 500 equivalent | PAN presence validation rule; missing PAN flagged in transaction risk grid |
| FLM-8 monthly submission to APConnect | Monthly statement by 10th of following month | FLM-8 submission date field per client; overdue alerts generated automatically |
| BTQ travel limit | USD 3,000 in notes/coins for overseas travel | BTQ_NOTES_USD forex limit; exceeded amounts flagged in validation |
| RBI exchange rate usage | Authorised daily card rates for INR conversion | Daily automated fetch and storage of RBI exchange rates for rate-comparison validation |