Bulk upload, and nothing else
KredX is a TReDS platform: buyers — typically execs at Central Public Sector Enterprises — upload invoices so their MSME suppliers can be financed. The only manual path was a spreadsheet round trip. Download a template, fill it offline, re-upload with a zip of PDFs, submit, then track it in a “past processes” table.
The process was asynchronous by design, built to move high invoice values safely, which meant errors only surfaced after submission — returned as the same Excel file with an “errors” column bolted on. Download, decode, fix, re-upload. Repeat as needed.
That was tolerable because it was a fallback. Most invoices arrived through ERP integrations, so manual upload only mattered when integration failed. It served a small group of power users who had learned to live with it.
A fallback becomes the front door
On 30th June, RBI made it mandatory for CPSEs to route all MSME payments through TReDS. Overnight, uploads rose roughly 14x, and support and PM teams started fielding a steady stream of stuck users.
The problem reached me by ear, not by ticket — overhearing repeated troubleshooting from support and PMs was the actual signal that something needed attention.
Three questions before touching design
Is the failure rate actually bad? Total vs. failed records over 15 days in Metabase: a ~83% failure rate. Confirmed.
Learning curve, or broken process? I split the same data by user history. Repeat, “learned” users failed just as often as first-timers, which ruled out education and reframed the problem as the process itself.
What are people stuck on? I pulled the error distribution, then asked engineering and support what each error actually meant.
| Error | Share | Real cause |
|---|---|---|
| Wrong GSTIN | 44% | Mislabeled — any failure to verify or create the seller was reported as a GSTIN error, whatever the cause |
| “Payment Account Number” | 18% | Naming ambiguity — read as “which account should I pay to,” not the buyer’s own account |
| Date format mismatch | 15% | Free-text date entry, no format enforcement |
| Leading-zero truncation | silent | Excel strips leading zeros from account numbers, corrupting data before validation sees it |
Nearly half of all “failures” weren’t about GSTIN at all. The error message was telling users the wrong thing.
One session broke an internal assumption
I got on a call with a client actively using the flow and shadowed him building his upload sheet, live. He was copying from a pre-approved payment voucher his own team had issued — not looking anything up, not querying a system. Typing, line by line, from a piece of paper.
That contradicted a long-standing internal assumption that buyers used VLOOKUP-style techniques against their own systems, which was the justification for keeping the whole thing an offline spreadsheet exercise. If the user is transcribing static values, the platform can simply ask for them.
I asked him what would make this easier. He didn’t ask for a better spreadsheet.
The brief, in three words: move validation from post-submission and asynchronous to real-time and inline.
Two paths, stress-tested
I stress-tested A by asking what would make it fail: would buyers share quality invoice images, and would those invoices contain everything we need? The sense in the room was that buyers are cautious about sharing invoices at all, since it exposes a slice of their supply chain. The data agreed — the share of uploads submitted without the optional supporting document was already high, even when including it cost nothing — and the business team confirmed the same was coming back from customers.
Manual field entry won, not because it was the more interesting design, but because it was the one users would actually complete.
An option, not a replacement
Power users had built their week around bulk upload, so the constraint I set was that bulk stays exactly as it is and Express arrives alongside it. Bulk launched from the “past processes” table; Express doesn’t need a progress table, being synchronous, so I anchored it on My Invoices where the data already lives — both paths behind one Add Invoice button opening a drawer. A drawer rather than a modal, to stay with the AntD language already in use; not a full page, because that would work against the quick feeling the flow depends on.
Seller first, by name
GSTIN stays the identifier — it’s the system’s unique key — with name-based search on top, because name is what a human filling this out repeatedly remembers. A known GSTIN prefetches everything else; a new one asks for a name.
Errors while you type
Validation runs inline instead of after submission, and the form renders only the fields the current state needs — for sellers already on file, bank account fields disappear.
Fields grouped the way finance reads them
Primary details, six optional deduction types, and supporting PO/GRN documents with an “apply to all invoices in this batch” checkbox. Wireframes moved from three columns to two: every amount field stacked vertically like a general ledger, primary info and supporting documents in the second column.
Several invoices, one sitting
An Add Invoice action keeps the session going without leaving the drawer.
What I cut. Multiple sellers as tabs, so a user could batch across sellers in one sitting. I tested it in a guided UAT with 5 users on a working prototype: they submitted at a seller level anyway, and couldn’t tell whether “submit” applied to the active tab or all of them. Between that confusion, scoping pressure and unresolved error handling for multi-seller batches, the tabs came out.
The parallel fix. Bulk still had to survive the spike, so I hardened the template alongside: the barely-used guide folded into its first sheet, all 28 columns regrouped, cell formatting locked with column-level validation, dropdowns wherever possible (Project ID had been free text), field names rewritten from what the error research revealed, GSTIN and PAN merged into the single field the backend needed, and guidance to prefix account numbers with # — closing the silent leading-zero loop.
Where it landed
Express now carries 29% of invoice volume and 74% of user volume — most individual users moved across, while the largest bulk uploaders still push their batches through the template, which is exactly why keeping it alive and fixing it mattered.
Bulk upload’s error rate is down to a five-day average of 34%, from the ~83% that started this project, driven by the parallel template hardening.
Figures from the platform’s Metabase dashboards, measured on the same queries used in the original research.