Triage before inference. A cheap classifier scores legibility, orientation, page count and template match first. Rotated pages get rotated; unreadable pages are rejected immediately with a specific reason rather than being sent to an expensive model that will hallucinate something plausible.
Batch by template, not by arrival. Grouping same-template documents lets a single prompt carry template-specific instructions and few-shot examples, which materially improves accuracy and lets you use a smaller model. Batch APIs then cut per-token cost substantially against synchronous calls, in exchange for latency you usually do not need.
Validation is cross-field, not per-field. Individually plausible values that are jointly impossible — a total that is not the sum of its lines, a delivery date before a dispatch date — are the highest-yield check available and cost nothing to run.
Exception queues are typed. "Failed" is not actionable. illegible_scan, unknown_template, arithmetic_mismatch and unsupported_language route to different people with different fixes, and the distribution across those types tells you exactly where to invest next.