The problem
Every wholesale business in India runs on credit. The shop sells to clients on a credit period — "pay me in 30 days." It buys from vendors on a credit period — "I'll pay you in 45 days." Multiply that across hundreds of clients and dozens of vendors, and you have a constant balance to manage: who owes me, who do I owe, what's overdue, who do I need to chase, who do I need to pay this week.
For most Tamil Nadu wholesale shops, this whole problem lives in two Excel files and the owner's head.
The wholesale business was no exception. They had two Excel files we found in the project folder when we started:
SUNDRY CR LIST.xlsx— the list of clients who owed the shop moneyLATE PAYMENTS.xlsx— the list of overdue amounts
Both were maintained by hand. Both got out of date the moment a payment came in. Both required somebody to manually re-type ledger entries from the daybook every morning. And neither one solved the actual problem the owner was trying to solve: getting clients to pay faster.
When a client was overdue, the only way to chase them was a phone call. Phone calls are awkward, slow, and easy to ignore. They put strain on the business relationship. They take time the owner doesn't have. And when the client claimed "I didn't know about that invoice" — there was no audit trail to prove otherwise.
The other side of the problem was paying vendors. Every month the shop had to make 20+ bank transfers to suppliers. Each one meant logging into the bank portal, typing the IFSC code, the account number, the amount, the beneficiary name. 20+ vendors × 5 minutes each = nearly 2 hours. Every. Single. Month.
The owner's brief was three things:
- A real receivables and payables system so he could see who owes the shop and who the shop owes, in real time, with proper transaction history
- WhatsApp reminders that go out from the shop's own business number — not from a random app, not from a third-party service. From the actual business WhatsApp number that the client already has saved in their contacts.
- NEFT file generation so the monthly vendor payments could happen as a single bulk upload to the bank instead of 20+ individual transfers
The approach
This project had a much higher trust threshold than most. We were going to be holding the financial state of a real wholesale business — every invoice, every overdue amount, every vendor bank account. If we got it wrong, the owner couldn't pay his suppliers and his clients wouldn't pay him. There was no margin for software bugs.
So we made three guiding decisions up front:
1. Treat receivables and payables as two halves of the same model. Most accounting tools split debtors and creditors into two completely different worlds. We treated them as the same kind of object: a transaction with a date, a due date, a counterparty, an amount, and a status. That meant the same code could track both — the same ledger logic, the same status transitions, the same overdue calculation. It also meant the dashboard could show both sides at once: "this is what's coming in, this is what's going out, this is your net cash position over the next 10 days."
2. The WhatsApp reminder has to come from the shop's own number. This is the part that distinguishes a real solution from a toy. There are dozens of "send WhatsApp reminders" tools — but they all send from a third-party number (or worse, a personal number). When a client gets a reminder from +91 88888 88888 (some app), they delete it. When they get a reminder from +91 XXXXX XXXXX (the wholesale business) — the same number they already have saved in their contacts as the wholesale business — they read it.
We did the work to set up Meta's WhatsApp Business API with the shop's own phone number — Meta Business account, app creation, phone verification, message templates, the whole flow — and then wired it into the system. Every reminder now goes out from the shop's verified business WhatsApp number. The setup is documented step-by-step so the owner has full ownership.
3. NEFT file generation has to be exactly right or the bank rejects it. Indian banks are very particular about the format of NEFT bulk-upload files. One wrong character, one wrong field separator, one wrong order — and the bank rejects the whole file. We built the generator to follow the exact format the owner's bank expects, validated every field (IFSC code format, account number length, name characters), and tested it against real bank uploads before going live.
What we built
Two-sided ledger system
- Clients (debtors) — every client with name, GSTIN, PAN, phone, address, credit period
- Vendors (creditors) — same fields plus full bank details (account name, account number, IFSC code, branch)
- Both stored cleanly with full edit history
Transactions on both sides
- Incoming transactions — invoices the shop has raised against clients
- Outgoing transactions — bills vendors have raised against the shop
- Each transaction has: transaction date, due date, voucher type, voucher number, debit, credit, current balance, status (unpaid / partially exported / paid)
- Ledger entries for each transaction — multiple line items per transaction so partial payments can be tracked properly
- Status updates automatically as payments are recorded
The dashboard the owner actually opens every morning
- Total receivables — what the shop is owed right now
- Total payables — what the shop owes right now
- Overdue amounts — broken out separately for both sides
- Next 10 days — what's coming due on both sides in the next 10 days
- Top debtors by amount, with overdue flags
- Top creditors by amount
- Cash flow projection — positive or negative net for the next 10 days
The owner used to have to open two Excel files and add things up in his head. Now it's one screen.
Debtors and creditors tables
- Filter by overdue, due-soon, fully paid, partially paid
- Sort by amount, due date, client name
- Bulk select for sending reminders or generating NEFT files
- Click into any client/vendor to see their full transaction history
WhatsApp reminders — from the shop's own number
This is the part that changes how the business operates. The flow:
- The owner picks a client (or filters a list of overdue clients)
- Clicks "send reminder"
- The system generates a clean PDF statement for that client — every unpaid invoice, dates, voucher numbers, amounts, total due
- The PDF gets uploaded to a public-but-unguessable URL
- A WhatsApp message is composed with a polite, professional reminder text
- The PDF is attached
- The message is sent via Meta's WhatsApp Business API, from the shop's verified business number
- The client receives a WhatsApp from
the wholesale business— the same business contact they already have saved - The reminder gets logged in the system: who got it, when, with which PDF, what the WhatsApp message ID was, success or failure
The behavioral result: clients pay faster. They got a reminder from a number they trust, with a professional PDF attached, with no awkward phone call required from the owner.
Reminder history (the audit trail)
Every reminder ever sent is logged. For every reminder you can see:
- Client name and phone
- Date and time sent
- Number of transactions included
- Total amount being reminded about
- The PDF URL that was sent
- The WhatsApp message ID (proves delivery)
- Status — sent or failed
- Who sent it (which user)
When a client says "I never got that bill", the owner has the proof: "WhatsApp delivered, here's the message ID, here's the PDF you got." End of conversation.
NEFT bank file generation
The other side of the same coin: paying vendors.
The owner picks the vendors he wants to pay this month, picks the amount for each, and clicks "Generate NEFT file." The system produces a single text file in the exact format the bank expects, with every vendor's IFSC code, account number, name, and amount on its own line. The owner downloads the file, logs into the bank portal, uploads it. The bank processes all 20+ payments in one go.
What used to take nearly 2 hours every month now takes 30 seconds.
The system also marks each transaction as "exported" once the NEFT file has been generated, so nobody accidentally pays the same vendor twice.
Automatic reminder cron job
A scheduled background job runs every day to identify overdue clients and queue up reminder candidates. The owner reviews the queue and approves which reminders go out. (Auto-sending was deliberately not enabled — the owner wanted to keep humans in the loop on customer communications.)
PDF generation
Every reminder generates a clean, branded PDF statement with:
- Client name and contact details
- The full list of unpaid invoices with dates, voucher numbers, amounts
- Subtotals
- Total due
- The shop's business details
- A polite reminder note
The PDF is professional enough that an accountant on the client's side can take it directly to their finance team without questions.
Activity log + audit trail
Every action — transaction created, updated, deleted, payment marked, reminder sent, NEFT file generated — is logged with the user, timestamp, and what changed. The owner can answer "who did this?" for any change in the financial data, going back as far as he wants.
Custom authentication
- Email + 4-digit PIN login (the owner specifically asked for a PIN, not a long password — faster to type, easier to remember for a small accounting team)
- Per-user activity logged
- Designed for a 1–3 person team (owner + maybe a bookkeeper)
The hard part — and how we solved it
There were two genuinely hard parts on this project, and both came from the same source: money is involved, so the system has to be exactly right.
Hard part #1 — WhatsApp Business API setup with the client's own number
Most "WhatsApp reminder" tools are wrappers around a generic shared number. They work, but they look spammy and clients tune them out. We wanted the reminder to come from the client's actual business number — the one their customers already trust.
That meant going through Meta's full WhatsApp Business API onboarding:
- Creating a Meta Business account in the client's name
- Verifying the business
- Creating a Meta Developer app
- Adding the WhatsApp product to the app
- Registering the client's existing phone number (not a new one — their actual business number)
- Verifying it via OTP
- Submitting message templates for approval
- Configuring webhook callbacks for delivery confirmations
- Wiring the API tokens into our backend
- Sending test messages, watching delivery, fixing issues
- Documenting the entire process so the owner has complete ownership of the integration
This is days of work that most agencies skip — they just plug in a 3rd-party WhatsApp wrapper and call it done. We did it the slow way because the whole point of the feature is that the message comes from a number the client trusts.
The setup guide we wrote for this is in the project files as WhatsApp_Setup_Guide.md — step by step, screenshots included, in language a non-technical business owner can follow.
Hard part #2 — Getting NEFT file format exactly right
NEFT bulk-upload files are unforgiving. Indian banks each have their own format quirks. Field separators, field lengths, name character restrictions, decimal handling, total checksums — get any of it wrong and the whole file is rejected.
We built the generator carefully:
- Strict validation of IFSC codes (must be exactly 11 characters, specific format
XXXX0YYYYYY) - Validation of account number length and content
- Beneficiary name handling that strips disallowed characters without losing meaning
- Decimal formatting to exactly 2 places
- Proper field separators in the exact order the bank expects
- A test mode that lets the owner generate a sample file before committing to the real one
We tested it against real bank uploads multiple times before going live. The owner now generates and uploads NEFT files monthly with 100% bank acceptance.
The outcome
- Live in production, running the wholesale business's real receivables and payables
- Replaced two Excel files (SUNDRY CR LIST and LATE PAYMENTS) with one live system
- WhatsApp reminders going out from the shop's own verified business number — clients receive them as messages from "the wholesale business" the same way they receive any other communication from the shop
- Full reminder audit trail — every message logged with delivery confirmation, so disputes about "I didn't know" are settled in 5 seconds
- NEFT bulk file generation — monthly vendor payment runs went from ~2 hours of manual bank-portal entry to 30 seconds of clicking generate
- Real-time dashboard showing total receivables, total payables, overdue on both sides, next 10 days, top debtors, top creditors
- Two-sided ledger — both halves of the cash flow tracked in one system, with the same logic and the same status model
- Daily background reminder queue with the owner-in-the-loop for approving outgoing messages
- Activity log for every change to the financial data
- PDF statements generated and sent with every reminder — professional enough to take to a finance team
The bigger outcome: a wholesale shop went from "the owner remembers who owes us money" to "the system tells us who owes us money, sends them a reminder from our own WhatsApp, and tracks whether they read it."
That's the difference between running a business on memory and running it on a system.
Finish reading — and take the PDF.
Drop your details to unlock the rest of Wholesale Receivables & Payables System (Tamil Nadu) on this page and download the full write-up as a PDF.