AI Adoption GuideHospitalityDepart
Folio dispute classifier
NLP detects charge disputes in checkout interactions and routes them to billing with full context attached.
Hospitality processBookConfirmPrepareArriveStayDepartReviewReturn
By Don, DoneThat’s AI coach · updated
A dispute flag is a cite, not a credit
The classifier exists to produce one of two outputs at checkout: a dispute flag that cites the guest's words and a folio line, or an empty result. Empty is correct when the guest never contests a posted amount. A flag is a quality packet for billing. It is not a ledger instruction.
Billing still owns the credit. If your checkout workflow auto-routes adjustments, override that path. The packet goes to billing review, not to an automatic credit, allowance, or void. Do not auto-credit. Do not invent a charge so the flag looks complete.
Night auditors and billing supervisors already know the shape of a real dispute: the guest points at money on the bill, and someone with posting rights decides what to do. This page is the desk procedure for an NLP label that tries to notice that moment in checkout text.
Property management and guest-messaging systems in this class (Oracle Hospitality, Mews, Cloudbeds, Canary) already store the conversation and the folio. Treat them as the systems of record. The classifier only reads a snapshot of both and proposes a flag.
Load the checkout thread and the folio as one stay
Do not classify until both artifacts belong to the same reservation and the same moment of depart. Checkout text is the guest-facing thread and any desk note captured while the guest is settling or leaving: app messages, kiosk comments, email to the property, or a front-desk paraphrase that quotes the guest. The folio is the current list of postings: line identifier, description, amount, timestamp, and department. A dispute that cannot name a line is not ready to flag.
Take the folio snapshot at classification time. A print from yesterday's night audit will miss late restaurant or minibar postings the guest is actually arguing about.
Checkout often happens without a desk stop. Pair this work with the express checkout orchestrator so the written thread from mobile or kiosk checkout is the text you load, not a blank because nobody transcribed a lobby conversation.
Keep adjacent jobs in their own lanes. Housekeeping or noise complaints at depart are not folio disputes. Send that language through the complaint root-cause classifier instead of forcing a billing flag. An open in-room chat that still asks for extra towels is a service ticket for the in-room service request router, even if the same thread later mentions the bill. Missing address or rate fields are reservation completeness, which belongs with incomplete reservation flagging, not with a charge contest.
If either input is missing, do not guess. No thread means empty. No folio means empty. Do not scrape a different stay, a group master's lines, or a neighboring room to fill the gap.
Flag only with both cites, then leave the credit blank
A usable flag has two cites and a blank money field.
The message cite is a short span of guest language that contests a posted amount: a product name, an amount, a date, or a clear request to remove a line. Paraphrase as little as possible. Billing should see the words the guest used.
The folio cite is the line identifier plus the description and amount as they appear on the snapshot. If the guest named a $28 minibar and line 14 is MINIBAR 28.00, cite line 14. If several lines could match, cite the one the wording actually supports, or return empty rather than bundling the whole incidental total.
Leave blanks that the text does not support. Do not invent a second disputed line because the folio looks busy. Do not fill a recommended credit amount. The credit field stays empty until billing types it.
Route the packet to billing with the thread, the folio snapshot, both cites, and the reservation id. Night audit may add a one-line desk note (guest still in lobby, or already departed). Night audit does not post.
Room 412 is on the express checkout list. At 10:41 the guest messages: "I didn't use the minibar at all. Please take the $28 off." The folio snapshot shows line 14, MINIBAR, 28.00, posted 02:14. The correct flag cites that sentence and line 14, leaves the credit amount blank, and lands in billing. Billing checks the minibar system or room status and then credits, partially credits, or leaves the posting. The night auditor never treats the flag as a posting. If that same guest had written only "Thanks, headed to the lobby," the output is empty even though line 14 is still on the bill.
Silent text stays empty
Empty is the standard result, not a model failure. Guests ask for receipts, confirm the balance, request late checkout, or thank the desk. None of that is a charge dispute.
Do not promote vague unhappiness into a flag. Comments that the bill feels high or that something looks off, without a named line, amount, or product, are not a cite. Prefer empty. Billing can still take a walk-up or phone dispute later, with a human attaching the line.
Do not hunt the folio for lines that look unusual and then pretend the guest contested them. A resort fee the guest signed, a last-night restaurant posting, or a high incidental total is not a dispute until the loaded text contests it.
If the guest contests a charge that is not on this folio (spa, for example) and there is no matching posting, do not create that line to make the flag look complete. That is inventing a charge. Return empty, or send billing a plain human note that the guest named something that is not on this bill. The classifier still must not fabricate a folio row.
Stop three bad packets before they reach billing
Night audit is the last filter. Reject or empty-out three shapes even if the model emitted a flag.
A flag with no folio cite. A highlighted guest sentence without a line identifier is a complaint snippet, not a dispute classifier result. Do not forward it as a folio dispute. Recover the line from the same snapshot or drop the flag. Billing cannot credit an unnamed posting.
Treating the flag as a credit. If a rule in the PMS, the messaging product, or a homegrown script posts an adjustment because a dispute flag is true, disable that rule. Auto-route means send the packet to billing, not post the allowance. NLP will sometimes quote a guest who was only asking what a line was. Auto-credit turns that question into a reversal.
Inventing a charge. The model must not add a folio line that is absent from the snapshot, must not invent a guest quote, and must not map extra fees onto a specific posting the guest never named. If the message cite and the folio cite do not belong together (minibar in the text, parking on the flag), reject the flag. Mismatched cites are as unusable as missing cites.
When you reject, send empty. If the guest is still on property, add a short human note to billing. The desk can still take a proper dispute. The classifier's job is the quality of the flag, not the speed of the money movement.
Vendors in this class will differ in where the thread and the folio live, but the procedure does not: load both, flag only with cites, leave unsupported fields blank, and let billing decide the credit.
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.
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