GST returns
Three returns, one books. mb builds GSTR-1 and GSTR-3B directly from the sales + credit-note tables; GSTR-2B is reconciled against the purchase tables.
GSTR-2B reconciliation
Every CA's #1 manual-Excel pain point. Now: upload the portal's JSON, get a 4-bucket diff in under a second.
Acme Steel Ltd — April 2026
| Supplier | Invoice | Field | Books | Portal | Δ |
|---|---|---|---|---|---|
| Acme Logistics Pvt Ltd 27AAACL5678C1ZK | INV/26-27/0023 | cgst | 900.00 | 897.00 | +3.00 |
| Acme Logistics Pvt Ltd 27AAACL5678C1ZK | INV/26-27/0023 | sgst | 900.00 | 897.00 | +3.00 |
| Bharat Steels & Co 29ABCDX5142F1Z5 | INV/26-27/0011 | igst | 5400.00 | 5403.00 | −3.00 |
| Bharat Steels & Co 29ABCDX5142F1Z5 | INV/26-27/0011 | cess | 0.00 | 3.00 | −3.00 |
Strict CBIC v3.0 parser
We parse exactly the schema published by GSTN — rtnprd,
data.docdata.b2b[], item-level itm_det
sums collapsed to header amounts. Period collisions prompt
replace-confirm; non-b2b sections (cdnr / cdnur / isd) are
counted and skipped with a "Phase 4" tag in the import summary.
Pure-Go matching, O(n+m)
Hash-keyed on (GSTIN, invoice_number, RCM-flag).
Tolerances locked to standard CA practice: ±₹1 per tax field,
±7 days on invoice date, exact match on GSTIN+inum+RCM, HSN
prefix-4. Stable-sorted output so the demo screenshot is
deterministic.
Four buckets, four CA workflows
- Matched — every field within tolerance. Read-only.
- With issues — GSTIN+inum match, ≥1 tax field drifts. Δ colour-coded by sign.
- In books only — vendor hasn't filed yet. CA chases.
- In portal only — vendor filed, we didn't book. One-click "Create bill" pre-fills the form.
Per-row triage state
"Mark ignored" / "Mark disputed" on any row persists to the
gstr2b_invoices.user_marked column. Reload the
page tomorrow — your triage is still there. Re-uploading 2B
for the same period prompts confirm-replace.
GSTR-1
Outward-supplies return. Built straight from your finalized invoices + credit notes for the period.
Five buckets, plus HSN summary
-
B2BRegistered-buyer sales (CGST+SGST or IGST per place-of-supply) -
B2CLUnregistered inter-state sales above ₹2.5L (IGST) -
B2CSUnregistered sales not in B2CL — aggregated by tax-rate × place-of-supply -
CDNRCredit notes against registered buyers -
CDNURCredit notes against unregistered buyers -
HSNHSN-wise summary of every line across the period
Two export formats
GET /gstr1 renders an HTML preview you can
cross-check before filing. GET /gstr1/download.json
emits the exact CBIC v3.0 JSON the portal expects — drop
it straight into the offline tool or upload via API.
Mathematical reconciliation: every CDNR row offsets a B2B row of the same period. The HTML preview shows totals before and after credit-note offset.
GSTR-3B
Self-declaration summary return. Same source tables as GSTR-1 plus ITC from your purchases ledger.
Tables we build
-
3.1Outward supplies (taxable + nil/exempt/non-GST + RCM) -
3.2Inter-state supplies to unregistered persons & UIN holders -
4Eligible ITC (lights once purchases are recorded) -
5Exempt/nil/non-GST inward supplies -
6.1Tax payment summary
Honest gaps
- · Table 4 (ITC) currently zeros until the next release wires it through the purchases tables. The deferred-reason text is embedded in the export so a CA reviewing the JSON sees exactly what's pending.
- · 3.1(d) RCM inwards, 5 exempt inwards, and 3.2 UIN supplies ship the same way — deferred with explicit notes in the JSON output.
- · No filing automation. We export; you file on gst.gov.in.