TDS Invoice Total

Works out what an Indian freelancer's invoice actually lands as after GST and TDS, and flags TDS taken on GST or at the wrong rate.

StopsFreelancer short-paid after TDS on GST

Installation

pnpm dlx shadcn@latest add https://bollard-ui.vercel.app/r/tds-invoice-total.json

The files land in your project. They're yours to edit.

Usage

tds-invoice-total-usage.tsx
import { TdsInvoiceTotal } from "@/components/ui/tds-invoice-total"

<TdsInvoiceTotal
  invoiceDate="2026-10-14"
  defaultValue={{
    fee: 50000,
    kind: "professional",
    payer: "business",
    gstRegistered: true,
    gstRate: 18,
    panShared: true,
    paidThisYear: 40000,
    clientTds: 5900,
  }}
/>

What it catches

  • TDS deducted on the GST portion
  • Wrong rate for the kind of work (professional 10%, technical 2%, contract 1%/2%)
  • Thresholds (₹50,000 a year for professional/technical; ₹30,000 a sum or ₹1 lakh a year for contracts) and catch-up on crossing
  • Payers who don't deduct (person paying for personal use, client abroad)
  • Higher rate when no PAN is shared
  • Ready-to-send note for the client

Props

TdsInvoiceTotal props
PropTypeDefault
value

Controlled invoice.

TdsInvoice—
defaultValue

Initial invoice when uncontrolled.

TdsInvoice{ fee: 0 }
onValueChange

Called with the invoice after any edit or fix.

(invoice: TdsInvoice) => void—
invoiceDate

Invoice date: picks the 1961 or 2025 Act section. Defaults to today after mount.

Date | string | number—
locale

Locale for money.

string"en-IN"
delay

Pause in ms before the new "You receive" is announced while typing.

number700
messages

Any visible string.

Partial<TdsInvoiceMessages>—

* required. Also accepts the native props of <div> (className, aria-*, data-*…), passed through to it.

Accessibility

  • Every field has a <label>; aria-invalid and descriptions via aria-describedby
  • Result status is role=status
  • After a fix, focus moves to the next fix or the fee field
  • Copy-note button shows a copied state

Only what the source does. Test with your own screen reader and content before shipping.

Limitations

  • Informational; not tax advice
  • Invoice date is used as a proxy; the Act that applies depends on the earlier of credit or payment
  • Does not handle lower-deduction certificates, non-resident payees or GST reverse charge

Rules

Rules last verified:

Confirmed in s.393(1) Table Sl. 6: contracts 1% (individual/HUF) or 2%, thresholds ₹30,000 per sum / ₹1,00,000 aggregate; professional fees 10%, technical services 2%, threshold ₹50,000; s.393(4) Sl. 8–9 personal-purpose exemption. Not re-checked: the 20% no-PAN rate (s.397) and the GST exclusion (CBDT Circular 23/2017). Informational; verify with the official source or a professional. Copied components don't update themselves, so re-check after rule changes (see updating a component).

What it stops

Freelancer short-paid after TDS on GST

Also known as

tds · gst · invoice · freelancer · 194j · 194c · pan · income tax

Field type

Dependencies

Pairs well with