Processed Invoices
Invoices Processed DATA LAKE
—
in range
/analytics/summary · COUNT(*)
Human Review Tasks (HIT) DATA LAKE
—
requires_validation=true · A2I-eligible
/analytics/summary
HIT rate DATA LAKE
—
HITs ÷ bypass_a2i=false (A2I-eligible)
/analytics/summary
Average Capture Time DATA LAKE
—
date_received → date_completed
/analytics/summary · touchless only
Exception rate DATA LAKE
—
Declined / Stopped
exception.code IS NOT NULL
Total invoice value processed DATA LAKE
—
SUM(TOTAL.value)
/analytics/summary · SUM(TOTAL.value)
Invoices per day DATA LAKE
Automation & quality
Stopped for human review · weekly DATA LAKE
requires_validation=true AND bypass_a2i=false · weekly · selected range
Validation method DATA LAKE
group by validation_method
Avg fields edited / reviewed invoice DATA LAKE
—
reviewed invoices only
AVG(num_fields_edited)
Avg confidence DATA LAKE
—
AVG(confidence_score)
Most-edited fields DATA LAKE
UNNEST(a2i_edits.fields_edited)
Fields triggering review DATA LAKE
primary headers · validation_required among reviewed docs
VA Review vs. Human Review
VA Review — value added DATA LAKE
Across every document processed with VA Review active — bypass_a2i mailboxes and never-reviewed documents included — how many invoices and fields did the Virtual Assistant enrich (fill a blank, correct a value, or win a corroboration)?
—
Invoices enriched — of all VA-active invoices
—
Fields enriched — across those invoices
Invoices — by top enrichment
● — blanks filled · ● — corrections · ● — corroboration wins
Fields
● — blanks filled · ● — corrections · ● — corroboration wins
va_filled over docs with va_review.mode=active · header fields only · invoices ranked win > correction > blank · corroboration wins tracked from 2026-07-13
Where fields actually changed, by stage DATA LAKE
Out of every field VA Review or Human Review could change, this shows the share each stage changed on its own — a field both stages touched is excluded here and tracked separately in the “VA Review accuracy” section below.
→
→
—
—
Changed by Human only
Field-level and doc-level rates for VA-only vs. Human-only changes, bucketed to match the selected range. A rising VA line alongside a falling Human line means VA is absorbing more of the correction work over time.
va_filled vs. a2i_edits.fields_edited · header fields only
Reviewer productivity
Review duration DATA LAKE
duration_seconds (avg / pctl)
Reviews per worker DATA LAKE
group by a2i_worker_email
VA Review accuracy
Rate Human Review overturns VA DATA LAKE
Of every field VA Review touched in the selected range — including docs VA itself let skip Human Review — how many did Human Review change again? Docs skipped only because bypass_a2i was set are excluded, since they never had a chance to be reviewed either way. Goal is zero: that’s the signal Human Review can be turned off for a field or mailbox.
—
Documents — of all VA-touched docs (VA-skipped included, bypass_a2i excluded) · target 0%
—
Fields — of all VA-filled fields (same scope as above) · target 0%
Trend toward zero across the selected range. As mailboxes graduate and VA’s accuracy improves, this approaching zero is the signal Human Review can be turned off for that scope.
The shrinking punch list — specific fields where Human Review most often disagrees with VA’s answer.
va_filled AND bypass_a2i=false vs. a2i_edits.fields_edited
Financial & business
Top vendors by spend DATA LAKE
SUM(TOTAL.value) by VENDOR_NAME
Top customers by volume DATA LAKE
group by customer_id
min_confidence tuning
Reviewed but unchanged — is min_confidence_score too high?
DATA LAKE
—
of human-reviewed invoices had zero edits — review may
be firing on docs the model already got right.
| Customer | Reviewed | Zero-edit | Zero-edit % | min_confidence_score |
Sorted by zero-edit % — high % + high
threshold = candidates to lower the threshold.
reviewed AND num_fields_edited=0, by customer + min_confidence_score
Invoice volume
Invoice volume per week DATA LAKE
COUNT(*) by week · global + top 10 mailboxes · selected range (excl. current week)
ℹ️ Analytics widgets run live queries against the
permanent data lake (final_json). Each group streams in behind a skeleton;
a slow query never blocks the live queue.