Unadhi Guides

Vendor master check sheet: catch wrong GSTINs, PANs and IFSC codes before the payment run and GSTR-2B

Updated 24 Oct 2026 · Disclosure: the validator linked below is an Unadhi product on the Apify Store. This guide is free, and the free formula in Step 4 checks GSTINs without it. Current Apify pricing is only on the Store page. This page has no affiliate links and nobody paid to be mentioned.

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)

SupplierGSTINGSTIN checkPAN matchStateIFSC bankIssuesStatus
Example Packaging36AAACZ0001A1Z9OKTRUETelanganaICICI BankPay
Example Traders29AAAFZ0002B1Z0check character should be VTRUEKarnatakaHDFC BankGSTIN: check character should be VHold
Example Electricals27AAAPZ0003C1ZBOKFALSEMaharashtraState Bank of IndiaPAN in GSTIN differs from PAN heldHold
Example Steel33AAACZ0004D1Z6OKTRUETamil Naduformat must be 4 letters, the digit 0, then 6 letters/digitsGSTIN state is Tamil Nadu, supplier state is Karnataka; IFSC: format must be 4 letters, the digit 0, then 6 letters/digitsHold

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}"

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

Step 3: the result columns

In vendors, add these headers and put the formulas in row 2, then copy them down.

ColHeaderFormula (row 2)
GGSTIN 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")))
HPAN checksame formula with D2 in place of C2 and "pan" in place of "gstin"
IPAN match=IF(OR(C2="", D2=""), "", MID(UPPER(TRIM(C2)), 3, 10)=UPPER(TRIM(D2)))
JGSTIN 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), "")))
KIFSC 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")))
LIssues=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", "")))
MStatus=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

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

Related

← All guides

Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.