Blog/GST & ITC
Two outcomes, not three

AUTO_EXPORTED or NEEDS_REVIEW. There is no "pretty sure" that still writes Tally.

The validator passes or it fails. If it passes, the row exports. If it fails, the row waits with the scan and the reason. There is no third path where the model is "pretty confident" and still posts a voucher. That is the accuracy contract.

The clerk opens the review queue on a Monday morning. There are 30 rows. Each row shows the scan crop on the left, the extracted fields on the right, and the reason for failure at the top. GSTIN checksum failed. Total does not match. Regime conflict. Missing buyer GSTIN. The clerk reads the reason, looks at the crop, confirms or corrects. The row exports. The rest of the queue follows.

This is not a failure state. This is the product. The gate blocked what it could not prove. The human confirmed what the gate could not know. The voucher that reaches Tally has been through both: the machine and the person. That is how nothing wrong reaches the books.

The routing contract

Every field present plus all validators pass: AUTO_EXPORTED. Anything fails or missing required fields: NEEDS_REVIEW with reasons. There is no third path. This is written into validators/orchestrator.py. It is not negotiable.

What straight-through means

Straight-through is the share of your invoices that pass all validators and export without a human touch. The rest go to review. Measured on your paper. Not a lab PDF. Not a vendor's sample. Your photocopies.

You pay ₹1.40 per page for everything the pipeline processes, including the rows that land in review. But the clerk's time on review is the honest cost of bad paper.

Two outcomes, one gatevalidate_invoice
AUTO_EXPORTED

All validators pass

GSTIN, HSN, arithmetic, regime, required fields. Row exports to Tally.

NEEDS_REVIEW

One or more validators fail

Row waits. Scan crop + reason. Human confirms or corrects.

What review looks like

Keyboard-first. 1366x768. Scan crop beside the field. Reason string at the top. Confirm or correct. Export. Next row. The clerk does not need a mouse tour. The clerk needs to see the scan, read the reason, and decide. See review UI.

If the reason is "GSTIN checksum failed," the clerk looks at the GSTIN crop. If the scan is smudged, the clerk types the correct GSTIN from the paper. If the scan is clear and the GSTIN is wrong, the clerk asks the supplier. Either way, the row exports after correction.

If the reason is "total does not match," the clerk looks at the printed total and the extracted lines. If the lines add up to something different, the clerk checks the round-off row. See round-off. If the total is genuinely wrong, the clerk queries the supplier.

What happens if you approve everything

You can. The review UI does not stop you. But if you approve every row in review, you have bought a slider, not a gate. The gate's job is to block what it cannot prove. If the human approves everything, the gate's job was wasted. The voucher may still be wrong. The review note should say why it was approved.

If your process is "approve everything over 90% confidence," that is a slider. Confidence is not a validator. See Nanonets vs for why confidence scores are not arithmetic.

The audit trail

Every verdict stores: checks_run, failures, warnings, duration_ms. The scan is there. The reason is there. Who confirmed is there. If the CA asks "where did this GSTIN come from," the trail is: scan, crop, checksum, who confirmed. That is an audit trail. "92% confident" is not. That trail is also what the checker reads: two chairs, three lanes, one owned sentence.

The trail is in the validator log. It is not in a spreadsheet. It is not in a WhatsApp message. It is in the product. See audit trail.

Steady state

Your console shows straight-through, measured on your own paper. The rows in review are not a failure. They are the honest cost of bad paper. The gate caught them. A human confirmed them. The voucher is clean.

If the 15% is mostly new vendors, the mapping table is incomplete. Add them. If the 15% is mostly bad paper, the supplier needs better scans. That is a vendor conversation, not a product feature.

Sources
  • EntryLedger
    /validation

    Routing contract. AUTO_EXPORTED or NEEDS_REVIEW.

  • EntryLedger
    /validation

    Straight-through measured on your own paper.

Frequently asked questions
What is NEEDS_REVIEW?+

The validator failed. The row waits with scan and reason. Human confirms or corrects.

What is straight-through?+

Auto-exported without a human. The rest go to review. Measured on your paper.

Can I approve everything?+

You can. But then you bought a slider, not a gate.

The gate blocks. The human confirms. The voucher is clean.

Try five scans on the demo. Watch the gate decide, not a confidence score.