Product Guide 08
Fintech AI

Invoice Discounting: How to Build It

A step-by-step guide to building invoice discounting and TReDS integration in India. Eight stages, the options at each one, exactly how each step connects to the next, real costs, and what breaks. Written for someone who has not built this before.

Verified September 2026Free · No signupOfficial sources only
BeginnerStart here. No prior knowledge assumed.

How to use this page

This page walks you through building one product: turning an unpaid invoice into cash before the buyer pays. An MSME has delivered, raised an invoice, and now waits 45 to 90 days. A financier pays most of it today and collects from the buyer at maturity.

Watch out

The framework was rewritten three months before this page was written. The RBI (Trade Receivables Discounting System) Directions, 2026 (RBI/DPSS/2026-27/406, 23 June 2026) replaced the 2014 TReDS Guidelines and the 2023 scope circular — eight years of scattered instructions consolidated into one Master Direction, effective immediately. Several things that were barriers are now gone, and anything written before June 2026 describes the old regime.

What invoice discounting actually is

TReDS is an RBI-regulated marketplace. An MSME uploads an invoice raised on a large buyer, the buyer accepts it, and banks and NBFCs bid against each other to finance it. The seller takes the best bid and gets cash in about T+2 instead of waiting out the credit period.

Four roles, and you need to know which one you are before anything else:

RoleWhat you doWhat you need
SellerMSME. Uploads the invoice, takes a bid.MSME status. Onboarding due diligence was removed in 2026.
BuyerCorporate, PSU or government department. Accepts the invoice and pays at maturity.Onboarding, and the discipline to accept promptly.
FinancierBank or NBFC. Bids, funds, collects at maturity.A licence, and an appetite for buyer risk.
Platform operatorRuns the exchange.RBI authorisation and ₹25 crore net worth. Three exist today.
Note

The single most important thing to understand about this product: the financier takes exposure on the BUYER, not the seller. A small supplier with no credit history can access finance at a large buyer's risk profile, because the buyer has already accepted the invoice. That inversion is the whole point — and it is why the 2026 Directions removed seller-side due diligence at onboarding as an unnecessary barrier.

What it is not:

  • Not a loan to the MSME. Financing is without recourse — if the buyer defaults, the financier pursues the buyer, not the seller.
  • Not a receivable you can discount twice. Assignment must be registered with CERSAI.
  • Not the only route. Off-platform invoice discounting exists and is a different, lighter regime with different risks. See step 1.

The whole journey, in one table

#StepIn plain words
1On TReDS, or off it?The decision that determines every other one.
2OnboardAnd understand what 2026 removed.
3Get the invoice inStructured, validated, matched to a purchase order.
4Buyer acceptanceEverything hangs on this. It is also the bottleneck.
5The auctionFinanciers bid. The seller picks.
6Register the assignmentCERSAI. Now expressly required.
7Fund and settleT+2 to the seller, at maturity from the buyer.
8Maturity, default, re-discountingIncluding the new ability to sell the receivable on.
Note

Step 4 is where this product lives or dies. An invoice nobody has accepted is not financeable, and buyer acceptance is a human workflow inside somebody else's accounts payable department. Everything else on this page is easier than that.

IntermediateBuild it. Pipelines, tools and working code.

Steps 1 and 2 — the route, and onboarding

Step 1 — On TReDS, or off it?

On TReDSOff-platform
RegulationRBI-authorised platform, TReDS Directions 2026Bilateral factoring or an NBFC product
RecourseWithout recourse to the MSMEUsually with recourse — the seller carries the risk
PricingCompetitive bidding pushes rates downOne financier, one price
BuyerMust be onboarded and must acceptMay not need to be involved at all
Build costIntegrate with an existing platformBuild the whole thing
Watch out

If you are considering becoming the platform: ₹25 crore minimum net worth, certified by a statutory auditor, aligned with other non-bank payment system operators. Existing authorised operators have until 31 March 2028 to comply. Three platforms currently operate in India. This is a licensed marketplace business, not a feature you add.

Step 2 — Onboarding, and what 2026 removed

The single biggest practical change: mandatory due diligence on the MSME seller at onboarding is gone.

The reasoning is sound and worth internalising, because it shapes the whole product: the financier is taking exposure on the buyer's accepted invoice, not on the seller's balance sheet. Asking a small supplier for financials in order to access finance secured on someone else's credit was a barrier with no risk purpose.

What the platform must still do:

  • Validate MSME status — the eligibility itself is still checked.
  • Ensure funds are credited only to the seller's own account. This is the control that replaces the removed due diligence, and it is the one to get right.

Steps 3 and 4 — the invoice and the acceptance

Steps 3 and 4 — The invoice, and the acceptance

Python — steps 3 and 4, the invoice and the acceptance that gates everything
from datetime import date, timedelta
from decimal import Decimal

def validate_invoice(inv, po, seller, buyer):
    """An invoice nobody can match to a delivery is an invoice nobody accepts."""
    fail = []
    if not seller["msme_status_verified"]:
        fail.append("seller_not_verified_msme")      # eligibility, not diligence
    if inv["buyer_id"] != buyer["id"]:
        fail.append("buyer_mismatch")
    if po and inv["amount_paise"] > po["amount_paise"]:
        fail.append("exceeds_po_value")
    if inv["due_date"] <= date.today():
        fail.append("already_due")                    # nothing left to discount
    if inv["due_date"] > date.today() + timedelta(days=365):
        fail.append("tenor_too_long")
    if inv.get("already_assigned"):
        # CERSAI is the authoritative answer. Check it, do not assume.
        fail.append("already_assigned_elsewhere")
    return {"ok": not fail, "reasons": fail}

# STEP 4. THE BOTTLENECK. An accepted factoring unit carries the enforceability
# of a physical instrument -- which is exactly why the buyer's acceptance is
# the thing everything waits on, and why it sits inside somebody else's
# accounts payable process rather than yours.

def acceptance_state(fu, now=None):
    now = now or date.today()
    age = (now - fu["uploaded_on"]).days
    if fu["status"] == "ACCEPTED":
        return {"financeable": True, "days_to_accept": fu["accepted_in_days"]}
    if fu["status"] == "REJECTED":
        return {"financeable": False, "reason": fu["rejection_reason"],
                "action": "resolve_with_buyer_then_reupload"}
    # PENDING. This is where working capital dies quietly.
    return {"financeable": False, "pending_days": age,
            "escalate": age > fu["buyer_sla_days"],
            "action": "chase_named_AP_contact" if age > fu["buyer_sla_days"] else "wait"}

# WHAT TO CHECK
# [ ] measure TIME TO ACCEPTANCE per buyer, as a distribution. It is the single
#     most useful number in this product and almost nobody reports it. A buyer
#     with a 14-day median acceptance is not offering early payment, whatever
#     the credit terms say
# [ ] a rejected invoice needs a REASON the seller can act on. "Rejected" with
#     no reason sends an MSME back to a corporate switchboard
# [ ] check CERSAI before financing, not after. A receivable assigned twice is
#     a fraud you will discover at maturity
# [ ] match to a purchase order where one exists. PO-backed invoices get
#     accepted faster because the buyer's AP team has less to verify
# [ ] escalation goes to a NAMED contact in the buyer's AP team, agreed at
#     buyer onboarding. A generic inbox is where acceptance requests go to die
# [ ] never let a seller upload the same invoice twice under different
#     references. Deduplicate on buyer + invoice number + amount + date

The gotcha nobody documents: time to acceptance is the product metric, and nobody measures it. Platforms report volumes financed and rates achieved. Neither tells an MSME what they need to know, which is how long does this buyer take to accept. A buyer with a 14-day median acceptance on a 45-day invoice has removed two thirds of the benefit before a financier has seen it. Measure it per buyer, publish it to sellers, and use it in buyer onboarding — a buyer who will not commit to an acceptance SLA is telling you something.

Steps 5 to 8 — auction, assignment, settlement, maturity

Steps 5 to 8 — Auction, assignment, settlement, maturity

The auction itself is the simplest part: financiers bid a discount rate, the seller takes one. Competitive bidding is why on-platform pricing beats a bilateral arrangement.

Python — steps 6 to 8, assignment, settlement and what happens at maturity
# STEP 6. CERSAI registration of the assignment is now EXPRESSLY REQUIRED.
# It is the public record that this receivable now belongs to the financier,
# and it is what makes double-discounting detectable rather than discoverable.

def register_assignment(fu, financier, cersai):
    rec = cersai.register(
        receivable_ref=fu["id"], assignor=fu["seller_id"],
        assignee=financier["id"], amount_paise=fu["amount_paise"],
        due_date=fu["due_date"])
    assert rec["status"] == "REGISTERED", "do not fund an unregistered assignment"
    return rec

# STEP 7. Settlement may run over ANY authorised payment system. Two legs,
# opposite directions, months apart.
def settle_legs(fu, bid):
    return {
        "to_seller": {"when": "T+2", "amount": fu["amount_paise"] - bid["discount_paise"],
                      "to": "seller_own_account_only"},   # the 2026 control
        "from_buyer": {"when": fu["due_date"], "amount": fu["amount_paise"],
                       "to": bid["financier_account"]},
    }

# STEP 8. AT MATURITY.
def at_maturity(fu, payment, guarantee=None, insurance=None):
    if payment and payment["received"]:
        return {"outcome": "settled"}
    # WITHOUT RECOURSE. The financier pursues the BUYER. The MSME seller is not
    # liable and must not be chased -- this is the protection that makes the
    # product usable by small suppliers at all.
    remedies = ["pursue_buyer"]
    if guarantee:  remedies.append("invoke_credit_guarantee")   # GoI-notified trust
    if insurance:  remedies.append("claim_insurance")           # premium NOT on the seller
    return {"outcome": "buyer_default", "remedies": remedies,
            "seller_liable": False}

# NEW IN 2026: a financier may RE-DISCOUNT -- sell a financed factoring unit to
# another financier before maturity. That frees the original financier's capital
# and is the mechanism that lets the market scale beyond one balance sheet.
def rediscount(fu, from_fin, to_fin, price_paise, cersai):
    cersai.update_assignee(fu["id"], new_assignee=to_fin["id"])
    return {"fu": fu["id"], "from": from_fin["id"], "to": to_fin["id"],
            "price_paise": price_paise, "recourse_to_seller": False}

# WHAT TO CHECK
# [ ] never fund before the CERSAI registration returns REGISTERED
# [ ] funds credit ONLY to the seller's own verified account. This is the
#     control that replaced seller due diligence -- treat it accordingly
# [ ] "without recourse" is enforced in your collections logic, not just in the
#     contract. A dunning system that contacts the seller on buyer default is
#     the single worst failure available in this product
# [ ] re-discounting updates the CERSAI assignee. A stale record makes the new
#     financier's claim harder to enforce exactly when it matters
# [ ] insurance premium is NEVER charged to the MSME seller. Expressly barred
# [ ] credit guarantee cover may come from ANY GoI-notified Credit Guarantee
#     Fund Trust -- check which your financiers actually hold, per buyer segment

The gotcha nobody documents: “without recourse” has to be enforced in the collections system, not just written in the contract. When a buyer defaults, a generic dunning workflow will happily start contacting the party it has a phone number for — which is the MSME seller. That is the exact harm the structure exists to prevent, it destroys the trust the product depends on, and it is a code path, not a policy question. Assert it: the seller is never a collections target on a TReDS factoring unit.

What the 2026 Directions changed, in one place

ChangeWhy it matters
Seller due diligence removed at onboardingThe barrier that kept small suppliers off the platform. Risk sits on the buyer.
Re-discounting permittedA financier can sell on before maturity. The market is no longer capped by individual balance sheets.
Credit guarantee from any GoI-notified fund trustFinanciers can cover buyer default. Widens who will bid, and on whom.
Insurance companies recognised as participantsAnother risk-transfer route — and the premium may not be passed to the seller.
CERSAI registration expressly requiredDouble-discounting becomes detectable rather than discoverable.
Accepted units carry instrument enforceabilityAn accepted factoring unit has the standing of a physical instrument.
₹25 crore operator net worthAligned with non-bank PSOs. Existing operators have until 31 March 2028.
Settlement via any authorised payment systemRemoves a plumbing constraint.

What it costs

Invoice discounting — what it costs

Verified September 2026
The discount, to the sellerdirect
The financier's margin, set by competitive bidding on TReDS rather than by one lender's price. This is the main reason on-platform beats bilateral for an MSME.
Platform feesdirect
Charged by the operator to participants. Modest per transaction; the three operators price differently and it is worth comparing if you have volume.
Becoming an operatordirect
₹25 crore net worth, statutory-auditor certified, plus RBI authorisation. Existing operators have until 31 March 2028. Reporting: annual net-worth certificates, monthly statistics, non-periodic director declarations.
Credit guaranteedirect
Available to financiers from any GoI-notified Credit Guarantee Fund Trust. Cost sits with the financier and shows up in the bid, not as a separate charge.
Insurancedirect
Permitted, and the premium may NOT be charged to the MSME seller. It is a financier-side cost, reflected in pricing.
CERSAI registrationdirect
Per assignment. Small, mandatory, and cheaper than discovering a double assignment at maturity.
The real cost to the MSMEdirect
Time to acceptance. An invoice sitting unaccepted for three weeks has already consumed most of the benefit, whatever discount rate it eventually attracts. This is not a fee and it is not on any rate card.
Where to buy these: Credit Underwriting Build Sheet names every tool with its unit cost. Getting Access covers which ones you can sign up for today, which need a sales call, and which are licensed.
Note

Compare the discount against the alternative, not against zero. An MSME's alternative to discounting is usually an overdraft, a supplier delay, or a missed order. A discount that looks expensive next to a bank rate can be cheap next to the cost of not taking the next order — and that is the comparison the seller is actually making.

AdvancedShip it. Failure modes, thresholds and evidence.

Three versions you could build

Integrating with a platform

Build: pick one of the three operators → seller onboarding with MSME status validation → invoice upload with PO matching and deduplication → acceptance tracking with a named buyer contact → settlement reconciliation.

You get: working capital access for your sellers without becoming a regulated marketplace.

The financier side

Build: buyer-risk scoring rather than seller-risk scoring → automated bidding with per-buyer limits → CERSAI checks before funding and registration after → collections that structurally cannot target the seller → credit guarantee and insurance cover mapped per buyer segment → a re-discounting path to free capital.

Trade: your credit model is about companies you have no relationship with. That is a different modelling problem from consumer or SME lending, and the data is thinner.

Becoming a platform

Build: RBI authorisation, ₹25 crore net worth, the exchange itself, buyer and financier networks on both sides.

It breaks when: you underestimate that this is a marketplace problem. Three operators exist and the constraint has never been technology — it is getting buyers to onboard and accept promptly.

Note

If you take one thing from this page: measure and publish time-to-acceptance per buyer. It is the number that determines whether the product delivers anything to an MSME, no platform reports it, and it is entirely measurable from data you already have.

What goes wrong

What goes wrongWhyFix
Invoices sit unacceptedNo named AP contact, no SLA, no escalation.Agree an acceptance SLA at buyer onboarding; escalate to a person.
The seller gets chased on buyer defaultGeneric dunning used the contact it had.Without recourse asserted in code, not just contract.
A receivable is financed twiceCERSAI checked after funding, or not at all.Check before, register after, never fund unregistered.
Insurance premium on the seller's statementPassed through as a cost.Expressly barred. It is a financier cost.
Seller onboarding still asks for financialsBuilt against the pre-2026 rules.Removed in 2026. Validate MSME status and the bank account instead.
Funds reach a third-party accountThe account control was not enforced.Seller's own verified account only — this is the control that replaced due diligence.
Re-discounting leaves a stale CERSAI recordAssignee never updated.Update on every transfer.
Duplicate invoice uploadsNo deduplication key.Buyer + invoice number + amount + date.

Where to go next

Watch out

This page is a guide, not a specification. TReDS is an RBI-authorised payment system and financing receivables carries obligations under the Directions, the factoring framework and FEMA where the buyer is overseas. Nothing here is legal advice. Have your structure, your account controls and your collections logic reviewed by qualified counsel before the first invoice is financed.

Sources

Every figure, rule and date on this page, and where to check it. Entries are typed so you can see which are primary-sourced and which are industry reporting.

  1. officialRBI (Trade Receivables Discounting System) Directions, 2026 — circular RBI/DPSS/2026-27/406 dated 23 June 2026, effective immediately, replacing the 2014 TReDS Guidelines and the 2023 scope circular. Removal of seller onboarding due diligence, ₹25 crore operator net worth with a 31 March 2028 transition, credit guarantee from GoI-notified fund trusts, insurance participation with premium not chargeable to sellers, re-discounting, mandatory CERSAI registration, instrument enforceability of accepted factoring units, settlement via any authorised payment system, and the reporting obligations. www.rbi.org.in
  2. officialCERSAI — registration of the assignment of receivables, and the check that makes double-discounting detectable. www.cersai.org.in
  3. officialMSME registration (Udyam) — the MSME status the platform must validate at onboarding. udyamregistration.gov.in
  4. officialFactoring Regulation Act and RBI factoring framework — the without-recourse structure underneath TReDS financing. www.rbi.org.in
  5. industryTReDS operator and practitioner commentary — the T+2 timeline, the 45–90 day credit periods, the three operational platforms, and the Budget 2026-27 measures (CPSE settlement, CGTMSE guarantees, GeM integration, securitisation of TReDS receivables). Verify any specific figure against the Directions.
  6. industryMSME financing analysis — the argument that seller-side due diligence was a barrier without a risk purpose, since exposure sits on the accepted buyer invoice.

Checked September 2026. These Directions are three months old; anything written earlier describes the 2014 regime.

Ask an AI about this page

Opens your assistant with this page as the source, and a question rather than a summary. It will ask what you are building before it answers.

Nothing is sent from here. The link carries only this page’s title and address.