GSTR-1 is mostly a list of your invoices. Table 12 is the odd one out: a summary of everything you sold in the period, grouped by HSN code. Since mid 2025 it is also the sheet most likely to bounce an upload, because the portal now checks it instead of merely accepting it. If your file just came back with an HSN error near the due date, this post covers what the table wants, why the error appeared, and how to make next month's summary build itself.
What Table 12 is: your month grouped by HSN and rate
Every item you sell has an HSN code (Harmonised System of Nomenclature), the international numbering that puts medicines under one heading and soap under another. Table 12 asks you to take the whole period's sales and compress them into one row per HSN code and GST rate: the code, its description, the unit (UQC), total quantity, taxable value, and the tax amounts.
A shop that printed 900 bills across 400 products in a month might compress into fifteen or twenty rows. Three brands of paracetamol are all HSN 3004 at 12 percent, so they land in one row together. That is the whole idea. The government does not want your bills repeated here; it wants the shape of your trade.
Four digits or six: the turnover rule
How many digits you must report depends on turnover, and the rule has a name you can check: Notification No. 78/2020-Central Tax, dated 15 October 2020, effective from 1 April 2021. If your aggregate turnover in the previous financial year was up to ₹5 crore, you report 4-digit HSN codes. Above ₹5 crore, 6 digits. Aggregate turnover is measured across your PAN, every GSTIN you hold added together.
The same notification carries a relaxation worth knowing: up to ₹5 crore, HSN on the invoice itself is mandatory only for B2B invoices, and optional on B2C ones. Table 12 still expects the summary either way. So the practical answer for a small shop is to keep 4-digit codes on every product regardless, and let the relaxation apply to the printed bill, not to your records.
You will notice ₹5 crore doing a lot of work in GST. It is also the line above which e-invoicing applies to B2B invoices, but that is a separate obligation with its own rules. Being under the line for one does not settle the other.
Where shops get HSN wrong: same product, three spellings, two codes
The classic failure does not start in the return. It starts in the records. A shop billing from Excel or from memory ends up with "Dettol 250ml", "dettol soap" and "Dettol bath soap" as three separate lines: one carrying HSN 3401, one carrying a code copied from a different product, one carrying nothing. At filing time somebody has to reconcile the three into one truthful row, by hand, under deadline.
The rate side has the same problem. If one spelling of the product was billed at 18 percent and another at 12, the summary either shows two rows for one product or shows totals that do not match the invoice tables. Table 12 is unforgiving in a useful way: it exposes exactly the mess that scattered records hide during the month.
B2B and B2C are summarised separately now
Since the May 2025 return period, the Phase-III changes GSTN announced in its January 2025 advisory apply to Table 12. The table is split into two tabs, one for B2B supplies and one for B2C. On the portal, HSN codes are picked from a dropdown rather than typed, with the description filled in from the code. And the portal cross-checks the summary against the values in the rest of the return; some of those checks warn today rather than block, and the direction of travel is clearly towards blocking.
For a counter shop this mostly means one thing: if you ever bill a registered buyer, even occasionally, those sales need their own rows on the B2B tab. A summary that lumps everything under B2C no longer matches what the portal computes from your invoice tables.
Put the HSN on the product once, not on every bill
Everything above has one fix, and it is not a filing-day fix. Store the HSN code and the GST rate on the product record, once, when the product is created. Every bill then inherits the code automatically, every spelling of the product is the same record, and Table 12 stops being a reconciliation job: it is just your sales grouped by a field that was correct all month.
This is the main reason to move billing out of a spreadsheet, and we have written separately about what changes when you move from Excel to billing software. In Layerdots ERP the code lives on the product card, bulk import can carry codes in from your existing sheet, and the GSTR-1 export builds Table 12 for you, in both the portal JSON and the Offline-Tool Excel, split into the B2B and B2C sheets the portal expects.
Why the portal rejects an HSN sheet and what the error really means
The rejections we actually see fall into a few families:
- Wrong digit count for your band. Four digits where six are due, or a code padded or truncated to the wrong length.
- A code that is not in the portal's master list. The dropdown prevents this online, but files prepared outside the portal are still validated against the same list, so an invented or mistyped code bounces.
- A unit the portal does not recognise. Quantity must be in a UQC from the portal's own list (NOS, PCS, KGS, BOX and so on). A home-made unit like "strip" or "pkt" fails the check.
- The summary in the wrong place in the file. The upload formats are strict about structure. We have watched the portal reject a file whose every row was correct because the HSN block sat at the wrong level of the JSON. If your software produced the file, this one is its bug to fix, not yours.
Whatever the message says, read it as a timestamp problem. The error surfaces at filing time, but the mistake was made weeks earlier, when a product was created with a missing or wrong code. Fix the product record, not just this month's sheet. A sheet patched by hand and never traced back to its source is also how GSTR-1 and GSTR-3B start disagreeing with each other, which is a harder conversation than a bounced upload.
Common questions
My turnover is under ₹5 crore and I only sell to walk-in customers. Do I still need
HSN codes?
On the printed B2C bill, Notification 78/2020 makes the code optional for you. In GSTR-1,
Table 12 still asks for the HSN summary of those sales. Keeping 4-digit codes on your products
costs nothing during the month and makes the summary automatic, so treat the invoice relaxation
as a printing choice, not a record-keeping one.
My supplier's invoice shows an 8-digit code. Which digits do I report?
The 8-digit code is the full customs tariff classification, and the GST codes are cut from the
same cloth: the first 4 or 6 digits of it. Report the first 4 digits if your turnover band is up
to ₹5 crore, the first 6 above that. Storing the 6-digit code on the product is the safe middle:
it satisfies both bands and survives a turnover change.
The upload failed only on the HSN sheet. Is the rest of my return lost?
No. A rejection is a fix-and-resend, not a penalty, provided you still file by the due date. The
error report normally names the sheet and row, so correct that entry, regenerate the file, and
upload again. Then put the same correction on the product record, so the row is right by itself
next month.