Vendor master check sheet: catch wrong GSTINs, PANs and IFSC codes before the payment run and GSTR-2B
What you get: a vendor master check sheet in one Google Sheet, with one row per supplier: the GSTIN, PAN and IFSC you hold for them, whether the GSTIN check character is right, whether the PAN inside the GSTIN matches the PAN you hold, whether the GSTIN's state matches the supplier's state, the bank name the IFSC belongs to next to the bank on their cancelled cheque, an Issues column and a Pay / Hold status. A hold tab lists only the suppliers to fix before the payment run and before their invoices are expected in GSTR-2B. Formulas are below. The example rows and numbers are made up.
The finished sheet
vendors tab (example rows are made up)
| Supplier | GSTIN | GSTIN check | PAN match | State | IFSC bank | Issues | Status |
|---|---|---|---|---|---|---|---|
| Example Packaging | 36AAACZ0001A1Z9 | OK | TRUE | Telangana | ICICI Bank | Pay | |
| Example Traders | 29AAAFZ0002B1Z0 | check character should be V | TRUE | Karnataka | HDFC Bank | GSTIN: check character should be V | Hold |
| Example Electricals | 27AAAPZ0003C1ZB | OK | FALSE | Maharashtra | State Bank of India | PAN in GSTIN differs from PAN held | Hold |
| Example Steel | 33AAACZ0004D1Z6 | OK | TRUE | Tamil Nadu | format must be 4 letters, the digit 0, then 6 letters/digits | GSTIN state is Tamil Nadu, supplier state is Karnataka; IFSC: format must be 4 letters, the digit 0, then 6 letters/digits | Hold |
Row 2 is the usual one-character typo: the last character of a GSTIN is a check character worked out from the other 14, so a single wrong character almost always shows up. Row 4 has the letter O typed where the IFSC needs the digit 0, and a GSTIN from a different state than the supplier's address, which matters for whether the invoice should carry IGST or CGST plus SGST.
Who this is for
Accounts teams in small businesses, and CA firms and bookkeepers who keep vendor masters for clients. A wrong GSTIN in your books means the supplier's invoice may not match what appears in your GSTR-2B, and a wrong IFSC or a changed bank account is how payments go to the wrong place. The sheet catches the typing mistakes in one pass, so the manual checks (GST portal, call-back to the supplier) are spent only on the rows that need them.
Step 1: the vendors tab
Add a tab named vendors with these headers in row 1 and one supplier per row from your accounting software's supplier export:
A Supplier, B Supplier state (as on their address, spelled like "Tamil Nadu"), C GSTIN, D PAN, E IFSC, F Bank on cancelled cheque.
Step 2: check all three numbers at once
Open the Email Verifier + GSTIN/PAN/IFSC Validator (Half Price) on the Apify Store. To build its input from your sheet, put this in any empty cell of a tab named settings, then copy the result into the input's JSON view:
="{""gstins"": [" & TEXTJOIN(",", TRUE, ARRAYFORMULA(IF(vendors!C2:C="", "", """" & UPPER(TRIM(vendors!C2:C)) & """"))) & "], ""pans"": [" & TEXTJOIN(",", TRUE, ARRAYFORMULA(IF(vendors!D2:D="", "", """" & UPPER(TRIM(vendors!D2:D)) & """"))) & "], ""ifscs"": [" & TEXTJOIN(",", TRUE, ARRAYFORMULA(IF(vendors!E2:E="", "", """" & UPPER(TRIM(vendors!E2:E)) & """"))) & "], ""checkDns"": false}"
checkDns: falsemeans the run makes no network lookups at all. GSTIN, PAN and IFSC checks are done offline.- Duplicates are removed before the run is charged.
When the run finishes, export the dataset as CSV with all fields and import it into the same Google Sheet (File → Import → Upload, "Insert new sheet"). Name the tab checks and keep the headers. If you do not see a reason or normalised column, you exported only the short results view; export again with all fields.
What the checks tab contains
- Every row has
type(gstin,panorifsc),inputandnormalised(upper case, spaces removed). - GSTIN:
valid,state,stateCode,pan(characters 3 to 12),panHolderType,checksumOkandreason, which names the expected check character when it is wrong. - PAN:
valid,holderType(from the 4th character: company, individual, firm and so on) andreason. PAN has no public check digit, so this is a format check only. - IFSC:
validFormat,bankCode,bank,bankKnownandreason. IFSC has no check digit, and the branch itself is not looked up.
Step 3: the result columns
In vendors, add these headers and put the formulas in row 2, then copy them down.
| Col | Header | Formula (row 2) |
|---|---|---|
| G | GSTIN check | =IF(C2="", "", LET(h, checks!$A$1:$ZZ$1, d, checks!$A$2:$ZZ, f, FILTER(d, INDEX(d, 0, MATCH("type", h, 0))="gstin", INDEX(d, 0, MATCH("normalised", h, 0))=UPPER(TRIM(C2))), IFERROR(IF(UPPER(TO_TEXT(INDEX(f, 1, MATCH("valid", h, 0))))="TRUE", "OK", INDEX(f, 1, MATCH("reason", h, 0))), "not checked"))) |
| H | PAN check | same formula with D2 in place of C2 and "pan" in place of "gstin" |
| I | PAN match | =IF(OR(C2="", D2=""), "", MID(UPPER(TRIM(C2)), 3, 10)=UPPER(TRIM(D2))) |
| J | GSTIN state | =IF(C2="", "", LET(h, checks!$A$1:$ZZ$1, d, checks!$A$2:$ZZ, IFERROR(INDEX(FILTER(INDEX(d, 0, MATCH("state", h, 0)), INDEX(d, 0, MATCH("type", h, 0))="gstin", INDEX(d, 0, MATCH("normalised", h, 0))=UPPER(TRIM(C2))), 1), ""))) |
| K | IFSC bank | =IF(E2="", "", LET(h, checks!$A$1:$ZZ$1, d, checks!$A$2:$ZZ, f, FILTER(d, INDEX(d, 0, MATCH("type", h, 0))="ifsc", INDEX(d, 0, MATCH("normalised", h, 0))=UPPER(TRIM(E2))), IFERROR(IF(UPPER(TO_TEXT(INDEX(f, 1, MATCH("validFormat", h, 0))))="TRUE", IF(INDEX(f, 1, MATCH("bank", h, 0))="", "Bank code not in list", INDEX(f, 1, MATCH("bank", h, 0))), INDEX(f, 1, MATCH("reason", h, 0))), "not checked"))) |
| L | Issues | =IF(A2="", "", TEXTJOIN("; ", TRUE, IF(C2="", "No GSTIN: confirm unregistered", ""), IF(AND(G2<>"", G2<>"OK"), "GSTIN: " & G2, ""), IF(AND(H2<>"", H2<>"OK"), "PAN: " & H2, ""), IF(I2=FALSE, "PAN in GSTIN differs from PAN held", ""), IF(AND(J2<>"", B2<>"", LOWER(J2)<>LOWER(TRIM(B2))), "GSTIN state is " & J2 & ", supplier state is " & B2, ""), IF(OR(K2="not checked", K2="Bank code not in list", REGEXMATCH(K2, "format")), "IFSC: " & K2, ""), IF(AND(F2<>"", K2<>"", K2<>"not checked", K2<>"Bank code not in list", NOT(REGEXMATCH(K2, "format")), NOT(REGEXMATCH(LOWER(F2), LOWER(LEFT(K2, FIND(" ", K2 & " ")-1))))), "Bank on cheque differs from IFSC bank: call back", ""))) |
| M | Status | =IF(A2="", "", IF(L2="", "Pay", "Hold")) |
Add a tab named hold with =FILTER(vendors!A2:L, vendors!M2:M="Hold") in A2. That is the list to clear before the payment run.
The bank-name comparison only looks at the first word of the IFSC bank name, so "HDFC Bank" matches "HDFC Bank Ltd, Banjara Hills". It is a prompt to look, not a verdict.
Step 4: free route for GSTINs only
If you only need the GSTIN check character, this formula does it in Google Sheets with no tool. It returns TRUE when the 15th character is right:
=IF(LEN(TRIM(C2))<>15, "", IFERROR(LET(g, UPPER(TRIM(C2)), c, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", n, SEQUENCE(14), v, ARRAYFORMULA((FIND(MID(g, n, 1), c)-1)*(2-MOD(n, 2))), s, SUM(ARRAYFORMULA(INT(v/36)+MOD(v, 36))), MID(c, MOD(36-MOD(s, 36), 36)+1, 1)=RIGHT(g, 1)), FALSE))
It does not check the state code, the PAN inside the GSTIN or anything about PAN and IFSC; the PAN match formula in column I works without any tool.
Step 5: what the sheet cannot tell you
- A correct GSTIN is not an active GSTIN. Look up each new supplier, and every Hold row after you fix it, on the GST portal's public Search Taxpayer page: it shows the legal name, status and registration date.
- A correct IFSC is not the supplier's account. Before the first payment and after any request to change bank details, call the supplier on a number you already had, not one from the change request. Our bank details change call-back sheet covers that step.
- A valid PAN format is not a verified PAN. PAN verification needs the Income Tax e-filing services.
- Re-run the check whenever suppliers are added, and before the month's GSTR-2B is reviewed.
Partner programme opening soon
Partner programme opening soon: join the free waitlist. Planned terms are 50% of each referred sale (75% once you have 5+ paying customers), single level, paid through Gumroad only from revenue received.
Sources
- Validator inputs and outputs (
gstins,pans,ifscs,checkDns; per-rowtype,input,normalised,valid,state,pan,panHolderType,checksumOk,reason,holderType,validFormat,bank,bankKnown; GSTIN official check character; PAN and IFSC have no checksum; branch not checked): Apify Store listing. The example error messages in the table above are the tool's own wording. - GSTIN status, legal name and registration date: GST portal, Search Taxpayer.
- Google Sheets LET, FILTER, TEXTJOIN, SEQUENCE and REGEXMATCH functions: Google Docs Editors Help.
Related
- Supplier bank details change call-back sheet
- Missing ITC supplier chase sheet before 30 November 2026
- GST IMS invoice action sheet for October 2026
- Email verifier and GSTIN, PAN, IFSC validator: what it checks
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.