AI Adoption GuideFinanceInvoice
Contract-to-invoice generation
LLM extracts billing terms from signed MSAs and drafts invoice schedules, using tools like Tabs.
Finance processPlanBudgetInvoiceCollectPayCloseReportAudit
By Don, DoneThat’s AI coach · updated
A cited draft is the quality bar, not a sent invoice
The useful output is a draft invoice schedule that quotes the signed MSA. It is not an invoice that has already gone to the customer. Each populated line should carry the fee name, the amount or rate as written, the cadence, the start rule, and a section or exhibit pin. If a term is missing, that field stays empty. The model does not invent a rate, a quantity, or a start date to make the row look complete.
Billing still sends. The draft is a packet for the person who already owns collections, credits, and the customer relationship. Treating the draft as sent is a process failure. Until billing posts or emails the invoice, nothing has happened in AR.
Start from the signed MSA, not the CRM opportunity
Load the executed MSA first: the file your contract repository stored as the fully signed copy, including exhibits attached at signature. Quotes and opportunity amounts are useful later as a check. They are not the source of billing terms. If Salesforce, Workday, or SAP already holds a subscription record, treat that row as something to reconcile. It is not permission to bill a clause that never made it into the MSA.
Tabs and similar billing products sit in the same class as those CRMs and ERPs. They hold invoices and customer records. They do not decide what the contract allowed. Extraction starts only when the signed file is in the working set, with a document ID a reviewer can open.
If the packet is missing an exhibit the MSA incorporates by reference, stop and fetch the exhibit. Do not fill the gap from a deck, a chat thread, or last quarter's invoice. That shortcut is how you bill a clause that is not in the MSA. A row that cites "Section 4.2 as discussed on the call" is not a cite.
Load in this order: the fully executed MSA with signature pages; incorporated exhibits and statements of work the MSA names; the latest signed order form or amendment that actually covers this SKU; only then the CRM or ERP subscription row, as a discrepancy list.
If two signed documents conflict, extract both, flag the conflict, and leave the disputed field empty. Do not pick the higher rate to be conservative or the lower rate to be customer friendly. That choice is commercial, not extraction.
Confirm the counterparty legal name and the effective date from the signature block before you extract fees. A draft that is perfect on rates and wrong on who is billed still fails. Amendments supersede only the sections they change. If an amendment is silent on a fee, keep the MSA cite and note that the amendment was checked.
Extract terms with cites, and leave missing rates blank
Work clause by clause. Put the value and the cite on the same row. A cite is a section number plus a short quotation, enough to jump to the page without trusting the model. A complete extraction names the fee, the stated amount, the pin, and the quote. A row that says only "platform fee, monthly" is not done.
Pull every commercial field the paper actually states: currency; fee type (fixed, usage, milestone, true-up); amount or rate; unit of measure for usage; cadence; invoice timing (in advance, in arrears, on milestone); payment terms; start and end rules; caps; minimums; credits; and any hold that delays the first invoice. Each populated field maps to one clause.
Empty stays empty. If usage is billed at rates "set forth in Exhibit B" and Exhibit B is not in the packet, the rate is blank and the row is blocked. If overage is described in words but the unit price or measurement method is missing, do not invent a usage quantity from product telemetry, a forecast, or last month's invoice. Inventing a quantity is a hard failure. Usage may appear as a charged line only when the contract states how to compute it and a named source of period actuals is attached. The model may label a stub "quantity not in MSA" and must not calculate an amount.
Illustrative example: a two-year MSA for a platform subscription plus usage. Section 3 names a monthly platform fee and points to Exhibit A for the dollar amount. Exhibit A is in the packet. Section 4 says overage is billed at the rates in Exhibit B, measured monthly. Exhibit B was never attached. A valid draft lists the platform line with the Exhibit A amount and cites Section 3 plus Exhibit A. The usage line is a stub: monthly cadence, measurement language from Section 4, rate empty, quantity empty, amount empty, blocker that Exhibit B is missing from the signed packet. An invalid draft fills the usage rate from a price list in Salesforce or from another customer's order form. That is billing a clause that is not in the MSA.
Do not round, annualize, or convert currencies unless the MSA states the rule. Do not turn "reasonable" or "to be agreed" into a number. When the same MSA splits a fee across deliverables, extraction still stops at the paper. Recognition timing is separate; use ASC 606 revenue recognition split if the schedule will feed revenue as well as AR.
Draft the schedule as a review packet
Turn extracted rows into a schedule a billing analyst can scan in one pass. Each planned invoice lists the date or trigger, lines with amounts only where the MSA supplied them, cites on every populated field, and blockers for empties. Group by billing period. Copy payment terms and purchase-order requirements onto the header with a cite when the MSA states them.
The draft lives in your billing workspace. It is not a customer-facing post. Whether you enter it in Tabs, Salesforce, Workday, or SAP, keep the record in draft or review. Auto-send and auto-post are out of scope. Treating the draft as sent is the third failure mode. A complete-looking invoice can still create a collections mess if generate is wired to email.
Keep a discrepancy list under the schedule. Compare the draft to the existing subscription row when one exists. SKU name, quantity, start date, and currency differences belong there. The MSA wins for what may be billed. The system of record wins for what is already set up, until billing changes it on purpose.
Before send, run an invoice pre-flight check on the same packet: legal name, bill-to, purchase order, period, and a cite on every charged line. Do not infer tax from a city in the notices section. Assign tax in tax and jurisdiction assignment after the schedule is stable. If a customer could reasonably read two different fees, pass that ambiguity to dispute-likelihood scoring instead of picking a number so the invoice can go out today.
What billing still owns after the model is done
The model produced a cited draft and a list of empties. Billing decides whether to collect the missing exhibit, amend the contract, or invoice only fully supported lines. Billing also chooses send date, invoice number, and whether to hold for a purchase order.
Reject a draft that cites a section whose quote is not on that page, populates a rate or quantity with no cite, charges an amount from anything other than the signed packet, or is already in a sent or posted state. A clean reject is cheaper than a credit memo.
When a term is missing, request the exhibit or amendment. Do not guess a market rate. The quality outcome is a schedule an auditor can follow back to the MSA, with blanks where the paper is silent. Empty is correct. An invented rate is not.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other. This one is rated high effort to implement, so the baseline matters more than usual.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first