Home / Help Center / pos-app / Reports / GST Purchase Match
🔄 Reports

GST Purchase Match

GST Purchase Match is a three-step workflow that imports your GSTR-2A data from the GST portal, automatically matches it against your recorded purchases, and shows you exactly which invoices do not line up so you can fix your books or follow up with suppliers before claiming Input Tax Credit.

📍 Menu path: Reports → GST Purchase Match (Upload GSTR-2A / Match Invoices / Mismatch Report)
👤 Who uses it: Admin, Owner/Accountant with GST reporting permission (India-only feature)
🏷️ Plan tier: advanced+

Overview

This single sidebar item actually opens three separate pages, one per step of the reconciliation process: Upload GSTR-2A, Match Invoices, and Mismatch Report. They are meant to be used in that order once a month, around your GST filing date.

Step 1 (Upload GSTR-2A) takes the JSON file you download from the government GST portal and imports its invoice data into BazaarPOS.

Step 2 (Match Invoices) runs an automatic matching engine that compares each imported GSTR-2A invoice against your own purchase records and classifies every invoice as Matched, Partial, Mismatch or Unmatched.

Step 3 (Mismatch Report) is a focused, exportable view of only the problem invoices — mismatched and unmatched — with the ITC impact of each, so you know exactly how much Input Tax Credit is at risk before you file.

The whole feature is gated to India-only stores — every one of these three pages is hidden behind a "Not available for your region" message if your store's country is not India.

Before You Start

Step-by-Step Guide

1 Step 1 — Upload GSTR-2A

This is the Upload GSTR-2A page, the first child page of GST Purchase Match.

  1. Follow the on-screen instructions panel, which walks through downloading the GSTR-2A JSON from the GST portal for your filing period.
  2. Click the upload area (or drag the file onto it) and choose the .json file you downloaded — only .json files are accepted; any other extension is rejected with an error.
  3. Once selected, the file is parsed in your browser; a green checkmark plus the file name and size (in KB) confirm it parsed successfully. If the JSON is invalid, you get a parse-error toast instead and nothing is uploaded.
  4. Click Import to send the parsed data to BazaarPOS, or Cancel to discard the selection and pick a different file.
  5. After import, review the result screen: Total Invoices, Total Suppliers, Taxable Value and Total ITC imported, plus a breakdown by invoice type (e.g. B2B, CDNR) showing count and value per type.
  6. Click "Go to Reconciliation" to move straight to Step 2, or "Import Another" to reset the form and upload a different file (e.g. a correction, or another period).

2 Step 2 — Match Invoices (auto-reconciliation)

This is the Match Invoices page.

  1. Choose the Month and Year you want to reconcile, and optionally set Status to All / Matched / Partial / Mismatch / Unmatched to pre-filter the list.
  2. Click Apply to load whatever reconciliation records already exist for that filter.
  3. Click Auto-Reconcile to run the matching engine against the chosen month/year — this compares every imported GSTR-2A invoice for that period with your recorded purchases and (re)computes each one's match status and match score.
  4. Read the four summary cards: Total Records (with matched count), Matched (with % of total), Unmatched (with total value difference), and ITC Claimed (with rejected amount).
  5. Scroll the reconciliation table — Invoice (number + date), Supplier (name + GSTIN), Amount (with the value difference shown if non-zero), Status badge (Matched/Partial/Mismatch/Unmatched), and Match Score % (with a "Manual" label if someone already manually resolved that row).
  6. Click the chevron on any row to open that invoice's detail/resolution screen.
  7. Click "Mismatch Report" in the header at any time to jump to Step 3 for the same period.

3 Step 3 — Review the Mismatch Report

This is the Mismatch Report page — the output you actually act on before filing.

  1. Choose Month and Year, then click Generate to compute the report for that period.
  2. Read the three summary cards: Total Records (with matched count), Mismatch Count (with % of total), and Unmatched Count (with total value difference).
  3. Check the ITC Summary card: Total Adjustments, Approved, Total Claimed and Total Rejected — this tells you the actual rupee impact of the mismatches on your Input Tax Credit claim.
  4. Review the Mismatched Invoices table — each row shows the invoice, supplier, amount (with the value difference), and the specific Mismatch Reasons text explaining why it did not match cleanly.
  5. Review the Unmatched Invoices table below it — invoices from GSTR-2A that could not be linked to any purchase entry at all.
  6. Click Export CSV to download every mismatched and unmatched row (Invoice Number, Invoice Date, Supplier Name, Supplier GSTIN, Invoice Value, Match Status, Mismatch Reasons, Value Difference, Tax Difference) — useful for sharing with your accountant or following up with suppliers.

Every Field & Button, Explained

Field / ButtonWhat it does
File upload (.json only)Accepts only the GSTR-2A JSON export from the GST portal; any other file type is rejected before parsing is attempted.
ImportPosts the parsed JSON plus the original filename to the server, which stores every invoice and computes the import summary.
Import summaryTotal Invoices, Total Suppliers, Taxable Value, Total ITC plus a by-invoice-type breakdown, computed once immediately after a successful import.
Month / Year (Reconciliation & Mismatch pages)The GST filing period being reconciled or reported on.
Status filter (Reconciliation page)All / Matched / Partial / Mismatch / Unmatched — narrows the reconciliation table without re-running the matching engine.
Auto-ReconcileRuns (or re-runs) the matching engine for the chosen month/year, comparing every GSTR-2A invoice against your recorded purchases.
Match ScoreA percentage confidence score the engine assigns to each match; rows resolved by a person instead of the engine are labelled "Manual".
Value Difference / Tax DifferenceThe rupee gap between what GSTR-2A says the supplier reported and what you have recorded, shown per invoice.
Mismatch ReasonsFree-text explanation (e.g. amount mismatch, GSTIN mismatch, date mismatch) generated by the matching engine for each mismatched invoice.
Export CSV (Mismatch Report)A client-side CSV download of every mismatched + unmatched row, generated entirely in the browser from the already-loaded report data.

Tips & Best Practices

Troubleshooting & FAQ

The whole GST Purchase Match section is missing from my sidebar.
It is India-only and requires the Advanced plan tier or above with GST reporting permission — check your store's country setting and your plan tier, or ask your Admin to check Settings → Staff Permissions.
Import fails with a JSON parse error.
The uploaded file is not valid JSON — re-download the GSTR-2A file from the GST portal without editing it in another program (even opening and re-saving in Excel can corrupt JSON structure).
Auto-Reconcile ran but many invoices are still Unmatched.
Unmatched means no purchase entry could be linked at all — check that the corresponding purchase was actually recorded in BazaarPOS for that period, with a matching supplier and amount.
Match Score is not shown for some rows.
Rows marked "Manual" were resolved by a person rather than the automatic engine, so no percentage score is computed for them.
The Mismatch Report Export CSV button is disabled.
It only enables once a report has finished loading for the selected month/year — click Generate first.
Numbers between the Reconciliation summary and the Mismatch Report do not match exactly.
The Reconciliation summary reflects the live filter you have applied (e.g. Status = Matched only), while the Mismatch Report always covers the full month regardless of any filter — compare with the Status filter cleared to "All" for a like-for-like check.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/GSTR2AImportPage.jsx
  • frontend-app/packages/pos-react-lib/src/pages/GSTR2AReconciliationPage.jsx
  • frontend-app/packages/pos-react-lib/src/pages/GSTR2AMismatchReport.jsx

Backend endpoints used:

  • POST /gstr2a/import
  • GET /gstr2a/reconciliation
  • GET /gstr2a/reconciliation/summary
  • POST /gstr2a/reconcile
  • GET /gstr2a/reports/mismatch

Related tables (db-core repositories):

  • GSTR-2A imported invoice records
  • Purchase reconciliation/match records
  • Purchase
  • Supplier

Redux slices:

  • scope (selectCurrentScope)

Feature flag key: gst (requires advanced plan tier or above)

All three pages independently gate on storeFmt.isIndia and render the same "Not available for your region" placeholder if false. The GSTR-2A JSON is parsed entirely client-side with FileReader before being POSTed, so a malformed file never reaches the server. The Mismatch Report's CSV export is generated client-side from already-fetched data via a Blob + object URL, not a server-generated file.