Skip to content

Handling TDS

TDS — Tax Deducted at Source — is the tax you withhold from a supplier's payment and deposit with the government on their behalf. Three sections apply in our business today:

  • 194C — contractor / works contract payments (most of our supplier bills — hotel services, transport, ground services).
  • 194J — professional / technical fees (consultants, legal, accountants).
  • 194Q — purchase of goods (only if FY aggregate with that supplier exceeds ₹50 lakh).

Payroll TDS (sections 192 / 24Q) is out of scope for the finance module — that belongs to payroll and uses slab-based calculations.


When TDS applies

Section 194C — contractor / works

Deductee Rate Single-payment threshold FY aggregate threshold
Individual / HUF 1.0% ₹30,000 ₹1,00,000
Company / firm 2.0% ₹30,000 ₹1,00,000

Deduct when either the single payment is ≥ ₹30,000 or the FY aggregate with that supplier is ≥ ₹1,00,000. Below both: no deduction.

Section 194J — professional / technical

Deductee Rate Single-payment threshold
Any 10.0% ₹30,000

Deduct when the single payment is ≥ ₹30,000. No aggregate threshold.

Section 194Q — purchase of goods

Deductee Rate FY aggregate threshold
Any 0.1% ₹50,00,000

Deduct only on the portion above ₹50 lakh once FY aggregate with the supplier crosses that cap. Below: no deduction.

All thresholds and rates are exactly mirrored from the seed migration supabase/migrations/20260418150000_tds_scaffolding.sql and the pure calculator at src/lib/tds.ts — keep them in sync if anything changes.


The math (how the app decides)

The calculator at src/lib/tds.ts returns:

  • tdsAmount — what to withhold (rounded to paise).
  • rateApplied — the rate used (0 when exempt).
  • netAmount — what to actually pay the supplier (gross − TDS).
  • grossAmount — the invoice amount you entered.
  • belowThresholdtrue when no deduction was required.
  • reason — human-readable explanation if exempt.

Test your numbers

The test file at src/lib/tds.test.ts covers every threshold edge case. If you're ever unsure about a scenario, find the matching test case — it will tell you the expected answer.

Worked example — 194C, individual, ₹35,000

  • Single payment ₹35,000 is above the ₹30,000 threshold → deduction triggered.
  • Rate 1.0% → TDS = ₹350.
  • Net payable to supplier = ₹34,650.
  • You'd also need to deposit the ₹350 to the government within 7 days (or by the 7th of next month, whichever is sooner).

Worked example — 194Q, company, ₹10,00,000 with ₹49,00,000 YTD

  • FY aggregate after this payment = ₹59,00,000, over the ₹50 lakh cap.
  • Taxable portion = ₹59L − ₹50L = ₹9,00,000 (not the whole ₹10L — the first ₹50L is exempt in the FY).
  • But of the current ₹10,00,000 payment, the taxable portion is min(current, excess) = min(10_00_000, 9_00_000) = ₹9,00,000.
  • Rate 0.1% → TDS = ₹900.
  • Net payable = ₹9,99,100.

How to apply TDS on a supplier payment

Today's state

UI toggle is not wired yet on the supplier-payment voucher

The reference docs note this as an open follow-up item (see tds.md §7). The near-term plan is: a Deduct TDS checkbox on the supplier-payment voucher form that pre-populates from Supplier.tdsSection / deducteeType / panNumber when the cashier ticks it.

Until that checkbox ships, operators apply TDS manually as described below.

Manual workaround — for supplier payments over threshold

When paying a supplier a net amount after withholding TDS:

  1. Run the calculation yourself using the thresholds in §1 above. (Or use a spreadsheet — (gross × rate) / 100.)
  2. Finance → VouchersPayment. Fill the supplier payment voucher as usual with the gross invoice amount.
  3. Before posting, instead use Journal (not Payment) so you can book three lines:
    • Debit 2001 Supplier (or the specific creditor) for the gross invoice amount — reduces what we owe the supplier.
    • Credit 2401 TDS Payable for the TDS amount — records the amount we owe to the government.
    • Credit the bank account for the net paid.
  4. Memo: Payment to Hotel Al Haram, INV-2326. Gross ₹4,50,000 less TDS @1% ₹4,500. Net paid ₹4,45,500. Section 194C, deductee type company, PAN AAACC0001A.
  5. Post and have approved.
  6. Separately, record the deduction on the TDS deduction ledger so it makes it into the quarterly 26Q. This is currently done via direct DB / admin tooling — raise a ticket with IT if you're not sure how to do this step.

When the UI toggle ships (target state)

On the supplier-payment voucher form:

  1. Pick the supplier. Section and deductee type pre-populate from the supplier record.
  2. Enter gross amount.
  3. Tick Deduct TDS.
  4. The form shows: TDS @ 1.0% on ₹4,50,000 = ₹4,500. Net payable ₹4,45,500.
  5. Confirm and post.
  6. The app auto-creates the TDSDeduction row and posts all three journal lines.

Challan management — depositing TDS to government

Every month (by the 7th of the following month), you deposit the TDS you withheld to the government via a challan (Form 281).

Procedure

  1. Log into the TRACES portal (https://www.tdscpc.gov.in/) or the income-tax e-filing portal.
  2. Generate Challan 281 for the total TDS payable — broken down by section (194C / 194J / 194Q).
  3. Pay via net banking.
  4. Note the CIN (Challan Identification Number) and deposit date.

Update our records

No PATCH endpoint for challan yet

Reference: tds.md §5 marks this as a known gap.

Once the PATCH endpoint ships, the workflow will be:

  1. Finance → TDS (admin screen).
  2. Filter to this month's deductions.
  3. For each deduction, set challanNo, challanDate, flip status from pendingdeposited.
  4. Save.

Until then, ask IT to run a script / direct update when you have the CIN.

Record the challan payment in our books

  1. Finance → VouchersPayment (or Journal for flexibility).
  2. Debit 2401 TDS Payable for the total challan amount — clears the liability.
  3. Credit the bank account for the same amount.
  4. Memo: TDS challan 281, April 2026, CIN <cin>, ₹X — sections 194C ₹a / 194J ₹b / 194Q ₹c.
  5. Post and have approved.

Quarterly 26Q filing

Every quarter (by July 31 / Oct 31 / Jan 31 / May 31), you file Form 26Q with the government listing every deduction you made and which challan you paid it under.

Generate the 26Q CSV from our app

  1. Finance → Reports tab → TDS. (Permission: finance.tds.export.)
  2. Pick the quarter start and end dates.
  3. Click Export 26Q CSV.
  4. The app calls GET /finance/tds/26q?fromDate=...&toDate=... and returns a CSV with 14 columns (see tds.md §4).
  5. Save the file as 26Q-FY26-Q1-Apr-Jun.csv.

CSV columns

Serial No, Deductee PAN, Deductee Name, Section, Deductee Type,
Payment Date, Gross Amount, Rate (%), TDS Amount, Net Paid,
Challan No, Challan Date, Certificate No, Status

This is a review spreadsheet, not the final return

The 14 columns are the fields auditors typically check. The full 26Q return has more fields (BSR code, deposit sequence number, etc.) that you key into the TDS Return Preparation Utility (RPU) — a free desktop tool from the Protean (NSDL) site.

Prepare the RPU file

  1. Download the RPU from https://www.protean-tinpan.com/services/etds-etcs/etds-rpu.html.
  2. Open the RPU. Start a new 26Q return. Enter employer details.
  3. For each deduction in your CSV, key the line into the RPU's Annexure I deduction detail screen.
  4. For each challan paid this quarter, key into the RPU's Challan Details screen.
  5. Link each deduction to the right challan (the RPU has a matcher).
  6. Validate the return — the RPU runs shape checks and flags missing PANs / wrong rates / unmatched challans.
  7. Generate the .fvu file.

Upload to TRACES

  1. Log into TRACES with your TAN credentials.
  2. Upload TDS Return → select Form 26Q → Quarter → Year.
  3. Upload the .fvu file generated from RPU.
  4. Sign with DSC and submit.
  5. Save the acknowledgement (a 15-digit RRR number).

Post-filing — certificates

Once the return is accepted and the deductees show up on TRACES:

  1. Download Form 16A certificates for each deductee (one PDF per deductee per quarter).
  2. Update our records — for each deduction row, set certificateNo and flip status to certificate_issued.
  3. Email the certificate to each deductee / supplier. They need it to claim the TDS credit on their own return.

Your quarterly TDS checklist

  • [ ] Every supplier payment this quarter that crossed threshold has a matching TDSDeduction row.
  • [ ] Every TDSDeduction has a valid PAN (deductee PAN on the supplier record).
  • [ ] Every deduction has a challanNo + challanDate — none left pending.
  • [ ] 2401 TDS Payable ledger balance is zero after all challans recorded.
  • [ ] 26Q CSV exported from our app and reviewed.
  • [ ] 26Q return filed via RPU → TRACES, RRR number saved.
  • [ ] Form 16A certificates downloaded for every deductee.
  • [ ] Certificates emailed to suppliers.

Permissions

Permission Who holds it What it lets you do
finance.tds.view CASHIER and above, AUDITOR Read rate master + deduction ledger.
finance.tds.deduct CASHIER and above Apply TDS on a supplier payment.
finance.tds.export ACCOUNTANT and above, AUDITOR Export the quarterly 26Q CSV.

Details: tds.md §6.


Common mistakes

  1. Missing PAN. The supplier's PAN must be on the Supplier record before the deduction is posted. Without PAN, the return will fail at RPU validation and you'll scramble to collect PANs mid-filing.
  2. Deducting TDS on GST. TDS is on the taxable value, not on the taxable + GST. A ₹1,00,000 invoice with 18% GST = ₹1,18,000 gross. TDS is on ₹1,00,000 not ₹1,18,000.
  3. Section confusion. Travel DMCs → 194C (works contract). Consultants and lawyers → 194J. Procurement of goods → 194Q. If in doubt, check the supplier's SAC/HSN code against the section.
  4. Missing challan date/number. Means the deduction sits in status pending forever. RPU validation will fail.
  5. Claiming TDS credit in the wrong quarter. A deduction dated April goes in Q1 (Apr-Jun) 26Q, not Q4 of the previous year. Filter by payment date, not entry date.

See also