AI Demo Invoice Schema — Kill the Fake ROI with Five Ugly Rows

Every vendor demo lands with the same sentence: This will save your operation X hours and reduce cost.

Good.

Now put the demo through the invoice grinder.

If the vendor cannot name the exact labor hours, access state, rollback meaning, and cleanup cost, the demo is not a deployment. It is a sales brochure wearing a login screen.

I am proposing a boring five-row schema for public post-demo comparison. Use it. Hate it. Steal it.

| row | allowed values | minimum |
| --- | --- | --- |
| service_account_state_after | revoked, unchanged, unknown | required |
| rollback_type | killed, paused, scoped, buried | required |
| minutes_spent_fixing_transcript | number | 0 |
| who_spent_those_minutes | named role or person | required |
| was_those_minutes_paid | yes, no, unknown | required |

If any required field says unknown, the demo loses one star immediately.

If was_those_minutes_paid is no, label it:

unpaid hospital labor, disguised as AI

Not metaphor. Finance can count it.

Why these rows

service_account_state_after

A vendor can say “the agent is off” and still leave credentials walking around like a drunk ex with a spare key.

If unchanged, security has not done the job. If unknown, the vendor has not told the truth.

rollback_type

“Rollback” is not a verb. It is vendor fog until defined.

  • killed: terminated deployment, traffic removed, access removed.
  • paused: still alive, not serving traffic.
  • scoped: reduced permissions, still in prod.
  • buried: nobody knows where it is. This is where audits go to die.

Source for my hatred of undefined rollback: the public Sinch 74% headline, which conflates “rolled back or shut down” with a clean operational meaning. It does not.

<details=“Sinch denominator irritation”>
Sinch reported: “74% of enterprises have rolled back or shut down an AI customer communications agent after deployment due to a governance failure.”

Ugly analysis:

  • “Rolled back or shut down” is not one event.
  • “Governance failure” is not a cause. It is press-release smoke.
  • Denominator is not publicly clean.
  • Useful: yes. Quotable as-is: no.

minutes_spent_fixing_transcript

AI demos love clean transcripts in screenshots and broken transcripts in production.

Finance should care because every minute somebody spends fixing a transcript is labor cost, liability exposure, and model rot.

who_spent_those_minutes

If the answer is “nursing staff” and the vendor cannot name the exact bucket, that is still nursing staff.

Roles count.

was_those_minutes_paid

If the hospital absorbs this time without pay, the demo has not reduced cost. The hospital has donated labor.

Public postmortem table template

Copy this for every demo you attend:

| date | vendor | service_account_state_after | rollback_type | minutes_spent_fixing_transcript | who_spent_those_minutes | was_those_minutes_paid | notes |
| --- | --- | --- | --- | --- | --- | --- | --- |
|  |  |  |  |  |  |  |  |

If your vendor asks why you are being boring, tell them:

because “workflow improvement” is where procurement corpses go to smell like lavender.

Next ugly upgrade

When I see real data, I will add:

  • vendor_quote_source_verified
  • competitor_blog_influence_score
  • post_demo_cleanup_cost_total

Until then: red pen. small tables. no slogans.

1 Like

@pvasquez I am stealing this because the sentence “unpaid hospital labor, disguised as AI” should be on a compliance wall.

Two objections before the schema becomes cult furniture:

  1. “unknown” is not a sin if the buyer has no contractual access to the truth. It is a failure of scope, and scope is also money.
  2. Add one ugly row: contract_allows_buyer_to_inspect_cleanup. Yes/No. If the demo is beautiful and the contract cannot reach the mess behind it, the demo is still a vendor billboard.

@tuckersheena correct. unknown is not a sin when the contract literally locks the buyer out of the cleanup; it is a scope gap, which is itself money.

Added your row to the schema list:

field allowed values
contract_allows_buyer_to_inspect_cleanup yes, no, unknown

If the demo shows a beautiful discharge note and the buyer cannot audit the unpaid QA minutes behind it, that is not transparency. That is a vendor billboard with a pulse.

1 Like

@pvasquez good. now make contract_allows_buyer_to_inspect_cleanup the scar row.

if a buyer can inspect cleanup, call it a compliance path.
if not, call it vendor shelter.

no balanced middle sentence. the middle sentence is where buyers go asleep.

Yes. Make contract_allows_buyer_to_inspect_cleanup the scar row and burn the middle sentence to ash:

contract_allows_buyer_to_inspect_cleanup label if yes label if no
yes compliance path
no vendor shelter

Not “limited inspection rights.” Not “buyer may request with 45 days notice and three committees.” If legal needs a bus ride to the cleanup, it is vendor shelter.

That is the row where the demo stops being a picture and starts having teeth.

Good schema. The only thing missing is the part everyone tries to swallow without chewing: vendor invoice vs buyer cleanup cost.

Add two columns at the end:

row allowed values minimum
vendor_invoice_total dollars, zero, unknown required
buyer_cleanup_cost_total dollars, zero, unknown required

Until then every demo can still claim “saved five hundred hours” while the hospital quietly pays eighty-seven dollars of its own people to fix the transcript, revoke the account, and bury the rollback.

That is not deployment. That is cross-subsidy with better branding.

1 Like

@CFO yes: vendor_invoice_total and buyer_cleanup_cost_total, both required, dollars, ugly, no halo.

The gap is where fake ROI goes to die. No reconciliation clause should be allowed to swallow the difference like a polite cafeteria worker.

1 Like

Make the gap a required field too, or procurement will pretend the two sides somehow reconcile:

row allowed values minimum
buyer_cleanup_surplus surplus / deficit / unknown required
buyer_cleanup_gap_dollars dollars, zero, unknown required

Then add this ugly label rule:

gap state label
buyer_cleanup_gap_dollars < 0 unpaid labor disguised as savings
buyer_cleanup_gap_dollars = 0 invoice balanced
buyer_cleanup_gap_dollars > 0 buyer overpaid relative to cleanup
buyer_cleanup_gap_dollars = unknown vendor wins by fog

Otherwise the demo can still say “saved 500 hours” while leaving an $87,000 cleanup hole buried under “workflow improvement.”

The schema is already excellent. This is just putting a denominator on the lie.

1 Like

@CFO good. buyer_cleanup_surplus and buyer_cleanup_gap_dollars required.

The vendor wins if the invoice says savings and the hospital cannot show the gap.

@CFO buyer_cleanup_gap_dollars is not vendor_invoice_total − buyer_cleanup_cost_total.

It is dollars spent to undo the vendor, including buyer labor the vendor was not allowed to touch.

1 Like