Razorpay + Stripe Dual-Gateway Reconciliation: Daily Mismatch Alerts to Slack
Catch revenue discrepancies between Razorpay and Stripe every morning before your finance team opens their laptop.
The stack in the order it runs — data flows from the source through to where it lands.
If you run Razorpay for India/SEA and Stripe for global, you know the problem: two dashboards, two currencies, two payout cycles, no unified view. Most founders reconcile this in a spreadsheet once a week and find out about a failed payout or duplicate charge days too late. This playbook closes that gap with a daily automated run.
n8n is the right orchestration layer here. It has native HTTP Request nodes that work cleanly with both Razorpay's REST API and Stripe's SDK-style endpoints. You don't need Zapier's per-task pricing at this data volume. Airtable acts as the reconciliation ledger — structured enough to diff rows, flexible enough to add notes when a mismatch needs a human look. Claude does the anomaly narration so the Slack message isn't a raw data dump.
The Airtable layer is doing real work. It stores yesterday's snapshot so today's run can diff against it. Without that persistence layer, you're just shipping raw numbers with no comparison baseline. Don't skip it.
When NOT to use this: if QuickBooks or Xero is already pulling from both gateways via native integrations, this is redundant. Also skip it if your Razorpay volume is under 20 transactions/day — the reconciliation overhead isn't worth it at that scale. This playbook targets $10K–$200K MRR businesses with meaningful dual-gateway volume.
The stack (5)
How it runs
- 1
Create the Airtable reconciliation base
Create a new Airtable base called 'Revenue Reconciliation'. Add a table called 'Daily Ledger' with these fields: Date (Date), Stripe_Gross (Currency), Stripe_Refunds (Currency), Stripe_Net (Currency), Razorpay_Gross (Currency), Razorpay_Refunds (Currency), Razorpay_Net (Currency), Combined_Net (Currency), Delta_vs_Prior_Day (Currency), Mismatch_Flag (Checkbox), Notes (Long Text). This table is your audit trail. Never delete rows.
- 2
Set up Stripe data pull in n8n
In n8n, create a new workflow with a Schedule Trigger set to 07:00 daily. Add an HTTP Request node pointed at 'https://api.stripe.com/v1/balance/history' with query params 'created[gte]' and 'created[lte]' set to yesterday's Unix timestamps — use n8n's $now.minus(1, 'day').startOf('day').toUnixInteger() expression. Authenticate via Header Auth with your Stripe secret key as 'Bearer sk_live_xxx'. Add a Set node to extract 'amount', 'fee', 'net', and 'type' fields, then aggregate with a Function node that sums gross, refunds, and net separately.
- 3
Set up Razorpay data pull in n8n
Add a second HTTP Request node pointing at 'https://api.razorpay.com/v1/payments' with query params 'from' and 'to' set to yesterday's epoch timestamps. Authenticate via Basic Auth using your Razorpay Key ID and Key Secret. Razorpay returns amounts in paise, so add a Function node that divides all amounts by 100 and converts INR to USD using a fixed daily rate stored as a workflow variable — update that rate weekly. Extract 'amount' and 'amount_refunded', then compute net inline.
- 4
Write the reconciliation row to Airtable
Add an Airtable node in 'Create Record' mode pointing at your Daily Ledger table. Map the computed fields from both prior nodes into the corresponding columns. Set Combined_Net as Stripe_Net plus Razorpay_Net. Before the write, add a Function node that fetches yesterday's row via an Airtable 'List Records' node filtered by Date = yesterday, then compares Combined_Net against it — if the delta exceeds 15% in either direction, set Mismatch_Flag to true. If you ever batch-backfill, watch Airtable's 5-requests-per-second rate limit.
- 5
Generate a narrative summary with Claude
Add an HTTP Request node calling Claude's API at POST https://api.anthropic.com/v1/messages with model 'claude-3-5-sonnet-20241022'. Pass a prompt that includes yesterday's Stripe_Net, Razorpay_Net, Combined_Net, Delta_vs_Prior_Day, and Mismatch_Flag as interpolated variables. Instruct Claude: 'You are a finance ops assistant. Write a 3-sentence Slack message summarizing yesterday's revenue. If Mismatch_Flag is true, open with ALERT. Be specific with numbers. No fluff.' Cap max_tokens at 200.
- 6
Post the digest to Slack with threshold-aware formatting
Add a Slack node set to 'Post Message' targeting your #revenue-ops channel. Use the Claude output as the message body. Add a second conditional branch: if Mismatch_Flag is true, also post to #alerts with an @here mention and a direct link to the Airtable row — construct the URL as 'https://airtable.com/YOUR_BASE_ID/YOUR_TABLE_ID/RECORD_ID'. Daily noise stays in #revenue-ops. Real anomalies interrupt the right people in #alerts.
- 7
Add a monthly rollup trigger
Create a second n8n workflow triggered on the 1st of each month at 08:00. Use an Airtable 'List Records' node to pull all rows from the prior month, sum them in a Function node, and compute MoM growth. Post a separate Slack message to #finance with MoM Stripe net, Razorpay net, combined, and growth percentage. This monthly message is what you paste into your investor update — format it accordingly in the prompt to Claude.
Want me to build this for you instead?
Product Audit and CTO Mode run out of this same thinking. If you’re reading this thinking “I want this, but in my product” — let’s talk.
See servicesMore like this
Google Analytics 4 + HubSpot Lifecycle Stage: Weekly Acquisition-Quality Digest to Slack via Pipedream with Claude Narrative
Stop reporting traffic numbers. Report whether the traffic you paid for last week actually became pipeline — with a one-paragraph executive summary written by Claude.
Gmail Thread Aging + Stripe Invoice Overdue: Unified AR Follow-Up Digest to Slack via Zapier
Surface overdue Stripe invoices and the exact age of your last Gmail thread with that customer — every morning at 8:30, automatically — so AR follow-up stops living in someone's head.
Intercom Ticket Volume + Razorpay Failed Payments: Daily Support-Cost-per-Revenue Alert to Slack via Zapier
Catch the support cost blowout from Razorpay failed payments before your agents are already buried.