Building a Scalable Payment Reconciliation System
Building a Scalable Payment Reconciliation System
When you're processing payments for 400,000+ customers, ensuring every rupee is accounted for becomes critical. In this post, I'll walk through how I designed and built an automated payment reconciliation system at GoldenPi Tech.
The Problem
Our fintech platform handles thousands of bond trading transactions daily through multiple payment gateways — Razorpay and Cashfree. Before automation, our finance team spent hours manually matching gateway transactions with internal order records. This was:
- Error-prone: Manual matching led to ~2% discrepancy rates
- Time-consuming: 4-5 hours daily of manual work
- Not scalable: Growing transaction volumes made manual reconciliation unsustainable
The Solution Architecture
I built a Python-based reconciliation pipeline using Pandas for data processing:
# Core reconciliation logic
def reconcile_transactions(gateway_df, orders_df):
merged = gateway_df.merge(
orders_df,
left_on='transaction_id',
right_on='payment_ref',
how='outer',
indicator=True
)
matched = merged[merged['_merge'] == 'both']
unmatched_gateway = merged[merged['_merge'] == 'left_only']
unmatched_orders = merged[merged['_merge'] == 'right_only']
return matched, unmatched_gateway, unmatched_orders
Key Design Decisions
- Pandas over raw SQL — For complex matching logic with fuzzy matching and amount tolerance checks
- Idempotent processing — Each run produces the same results, making it safe to re-run
- Detailed mismatch reports — Auto-generated reports for the finance team with actionable insights
Results
- 99.9% financial accuracy achieved consistently
- 80% reduction in manual effort
- Finance team can now focus on exception handling rather than routine matching
Lessons Learned
The biggest lesson was that reconciliation is not just about matching records — it's about building trust in the system. Every edge case matters when real money is involved.