How to Turn a Hotel Folio into
GL-Coded Expense Report Lines
Global business travel spend is on track to reach $1.69 trillion in 2026, according to the GBTA Business Travel Index. That's a lot of hotel stays. And every one of those stays generates a folio — a multi-page, multi-line, multi-tax-rate document that lands on someone's desk for reconciliation. For finance teams processing hundreds of these per month, a hotel folio is not just a longer receipt. It's a document that crosses three to five general ledger accounts, each with different tax treatments and compliance requirements. Most expense software treats it like a receipt with a single total. The difference between that and what actually needs to happen — extracting and allocating every line item — is where the hours disappear.
Key Takeaways
- A four-page hotel folio crosses five GL accounts but your expense platform reads it as one receipt with one total — and the line-item allocation falls on a keyboard.
- Template OCR captures the total by reading page coordinates not charge descriptions so 47 line items still get allocated by hand on every folio.
- An AI that reads charge descriptions and decides Valet Parking belongs in GL 6600 turns a 20-minute line-by-line allocation into a review pass.
What Makes a Hotel Folio Different from a Standard Receipt
A hotel folio is the itemized running record of every charge and payment posted to a guest account from check-in to checkout. Unlike a restaurant receipt (one transaction, one vendor, one category) or a retail receipt (multiple items, one tax rate), a folio spans multiple departments of the hotel's operation — each with its own charge code, tax treatment, and accounting destination.
Under the Uniform System of Accounts for the Lodging Industry (USALI) — the accounting standard used by virtually every branded hotel since 1926 — hotel revenue and expenses flow through department-level accounts: Rooms, Food & Beverage, Telecommunications, Parking, Health Club/Spa, and Other Operated Departments. The 12th Revised Edition of USALI, published in February 2025 by HFTP, AHLA, and the Global Finance Committee, reinforces this departmental structure and adds new expense categories for guest loyalty program costs and full-time equivalent labor tracking. When a guest charges dinner to their room, that transaction posts under F&B. When they park a car, it posts under Parking. The folio reflects the hotel's internal chart of accounts — not the guest's.
That structural mismatch is the core of the reconciliation problem. The hotel's accounting system logs each charge by its own department code. The guest's company needs those same charges allocated to entirely different categories: Lodging (GL 6400), Meals & Entertainment (GL 6500, typically 50% deductible), Transportation (GL 6600), and possibly separate tax liability accounts. A four-page Marriott folio with 47 line items across five USALI departments needs to become a four-row expense report entry across three GL codes. That translation — from hotel accounting logic to corporate expense logic — is what no receipt-scanning app was built for.
And the format varies by property management system. Oracle Opera, the dominant hotel PMS, produces folios with a distinctive line-item structure. Marriott's LightStay, Hilton's OnQ, and independent properties running systems like Cloudbeds, RoomRaccoon, or INNsight all have different layouts. Same data, different arrangement. A template-based OCR tool trained on one hotel chain's format breaks on the next.
The Line-Item Data You Actually Need for Expense Reconciliation
Before extracting anything, it's worth defining exactly what data matters and why. A folio can run to four or five pages of line items. Not all of them are relevant to the expense report — and treating them all as equal is what turns a 2-minute task into a 20-minute one.
Here is the minimum viable extraction set for a corporate expense report, mapped to typical GL treatment:
| Folio Line Item | Expense Category | Typical GL Code | Tax Treatment | Why It Needs Its Own Line |
|---|---|---|---|---|
| Room Rate (per night) | Lodging | 6400–6499 | Subject to state/local occupancy tax; not income-tax deductible separately from the stay | Per-diem comparison baseline; often the only client-billable charge |
| State/County Occupancy Tax | Lodging Tax | 6400 (bundled) or separate tax GL | Recoverable through expense report; not deductible as separate tax | Some client contracts exclude tax from billable expenses |
| Resort / Destination Fee | Lodging | 6400–6499 | Treated as part of room cost under IRS accountable plan rules | May exceed per-diem lodging cap; flags for review |
| Restaurant / Room Service | Meals & Entertainment | 6500–6599 | 50% deductible for business meals (TCJA); 100% if per-diem applied | Separate deductibility from lodging; different receipt substantiation threshold |
| Minibar / In-Room Snack | Meals (or Non-Reimbursable) | 6500–6599 | Generally non-reimbursable under most corporate travel policies | Needs flagging, not silent inclusion in lodging total |
| Parking / Valet | Transportation | 6600–6699 | Fully deductible business expense if travel-related | Separate GL from airfare and mileage for spend analysis |
| Wi-Fi / Business Center | Office / Communications | 6800–6899 | Fully deductible | Often reimbursable even when in-room movie is not |
Notice that the tax line alone has multiple layers. A single night at a Chicago hotel might carry: Illinois state occupancy tax (6%), City of Chicago hotel tax (5.8%), and a McCormick Place expansion tax (2.5%) for properties near the convention center. If your expense system only captures "Room Total: $287," there is no way to separate the base rate from these taxes — and that matters when a client contract reimburses the base rate but not taxes, or when your own policy caps lodging reimbursement at the GSA per diem rate for that city.
This is also where IRS Publication 463 accountable plan rules become relevant. Under an accountable plan, employees must substantiate the time, place, business purpose, and amount of each expense. If the reimbursement system captures only the folio total, and $340 of that total was a spa charge the employee added on the last day, the employer is reimbursing a personal expense through a tax-advantaged channel. The IRS's substantiation requirement exists precisely to prevent this — and a line-item extraction workflow is what makes substantiation practical at scale.
The IRS accountable plan requires four elements for each expense: time, place, business purpose, and amount. A folio total of $1,247 substantiates none of these at the line-item level. Breaking it into room rate, taxes, meals, and incidentals — each with its own amount — is what turns a folio from a receipt image into compliant documentation.
Step 1 — Get a Clean, Complete Copy of the Folio
The quality of what you extract depends on the quality of what you capture. Hotel folios arrive through three channels, each with its own pitfalls:
Email delivery (best option)
Most chain hotels can email a PDF folio at checkout. This is the cleanest source — the PDF is generated directly from the PMS, preserving all line items, tax breakdowns, and the zero-balance confirmation. Ask specifically for the "guest folio with zero balance" — a truncated version showing only the total is common and useless for line-item extraction.
Front desk printout (acceptable)
If the hotel prints a folio at checkout, photograph or scan it immediately. Thermal paper fades within weeks. Use a scanner app (not a phone camera's default mode) to produce a flat, high-contrast PDF. Hold the phone parallel to the page — perspective skew reduces extraction accuracy. On multi-page folios, capture every page, including the final page with the zero-balance line.
Booking platform receipt (insufficient)
A receipt from Booking.com or Expedia shows the reservation total, not the folio. It omits incidental charges posted during the stay (parking, restaurant, minibar). For expense reconciliation, this is supplementary at best. Always request the folio from the property directly.
One operational detail worth mentioning: some hotels — particularly independent properties and smaller chains — do not auto-email folios. The front desk prints one copy at checkout and that is the only copy. If the traveler loses it, getting a duplicate means calling the property, navigating the phone tree, and waiting for a fax or email that may or may not arrive. Setting the expectation with traveling employees ("photograph the folio before you leave the parking lot") prevents a predictable bottleneck downstream.
Step 2 — Define Your Columns and Extract Every Line Item
Traditional OCR approaches fail on hotel folios for a structural reason: they rely on template matching. You tell the software "the room rate is at coordinates (x,y) on the page," and it reads that spot every time. But a Hilton folio and a Hyatt folio put the room rate in completely different positions. Build a template for one chain and it breaks on the next.
The alternative is Custom Column Extraction: instead of telling the tool where on the page to look, you tell it what to look for. You type the column names — "Room Rate," "Occupancy Tax," "Restaurant Charge," "Parking Fee" — and an AI vision model reads the folio, understands what each charge represents, and extracts the corresponding values regardless of where they appear on the page. The column names you type become the headers of your output spreadsheet.
Here is what that workflow looks like in practice:
Upload the folio
Drag in a PDF, a phone photo of a printed folio, or a screenshot from the hotel's app. PDFs preserve text clarity better than photos, but the AI handles both. If you have folios from multiple trips — a week in New York, two days in Chicago, a night in Dallas — upload them all at once. The tool processes them as a batch and merges the output into a single table.
Define your extraction columns
Type the field names you want extracted. For a hotel folio, a practical column list looks like: Hotel Name, Check-In Date, Check-Out Date, Room Rate (per night), Number of Nights, Room Subtotal, State Occupancy Tax, City Occupancy Tax, Resort Fee, Parking Charge, Restaurant Charge, Room Service Charge, Minibar Charge, Wi-Fi Charge, Other Incidentals, Total. The AI locates each value by understanding what the text means — not by matching a template coordinate.
Export to Excel
The output is a spreadsheet where each row is one hotel stay and each column is one of the fields you defined. No manual typing. No template building. If a particular folio doesn't have a charge for a given column (no minibar, no parking), that cell is simply empty — the tool doesn't hallucinate values.
For a concrete example: a finance manager processing expense reports for a consulting firm's Q2 travel gets 14 folios from six different hotel chains. Three are PDFs emailed from Marriott properties. Four are phone photos of printed folios from independent hotels. Two are screenshots from the Hilton Honors app. One is a scanned image of a thermal-printed folio that's already starting to fade. The extraction columns are defined once — the same 15 field names work across all 14 documents, regardless of format or chain.
Files are processed securely and not stored.
One thing worth noting about accuracy expectations. The visual-language model that powers this extraction reads text by understanding the document as a whole — layout, context, the relationship between a charge description and its amount on the same row. For printed, clean hotel folios, this produces high accuracy. For heavily creased thermal paper photographed at an angle in bad lighting, accuracy drops. The workflow should account for a quick review pass on difficult captures — but a review pass where you scan a spreadsheet for outliers is still an order of magnitude faster than typing 47 line items from scratch.
Step 3 — Allocate Each Line to the Correct GL Code
Extracting the data solves half the problem. The other half is getting each charge to the right GL account without manually reviewing and categorizing every line. This is where Inferred Columns become the lever — they let the AI make a judgment call about which category a charge belongs to, based on what the charge description actually says, and output that category alongside the extracted value.
Inferred Columns work by giving the AI a set of valid options and asking it to pick the right one based on document context. For a hotel folio, you might define:
| Inferred Column | Options | What the AI Does |
|---|---|---|
| Expense Category | Lodging, Meals & Entertainment, Transportation, Office & Communications, Non-Reimbursable | Reads each charge description. "Room Charge" → Lodging. "The Grill Room Restaurant" → Meals & Entertainment. "Valet Parking" → Transportation. "In-Room Movie" → Non-Reimbursable. |
| GL Code | 6400 (Lodging), 6500 (M&E), 6600 (Transport), 6800 (Office/Comm) | Maps the inferred category to the correct GL account code from your chart of accounts. |
| Tax Deductibility | 100%, 50%, Non-Deductible | Flags meals at 50% (or 100% if per-diem applies) so the tax team doesn't have to reclassify during prep. |
The practical result: a single pass through the extraction workflow produces a spreadsheet with every folio line item already allocated to its correct GL code, with tax treatment flagged. The finance reviewer's job shifts from data entry ("what GL code does parking go to?") to exception handling ("this folio has a $180 spa charge categorized as Lodging — override to Non-Reimbursable").
For professional services firms that bill travel costs to clients, this allocation layer becomes client-facing. A law firm billing a matter might specify that room rate and taxes are billable, but meals and parking are not. The same extraction run can produce two outputs: an expense report for internal reimbursement and a billable-expense summary for the client invoice — from the same underlying data, just filtered by category.
Processing Multiple Trips in One Batch
Individual folio processing is useful. Batch processing is where the time savings compound. An employee returning from a three-city trip — New York, Chicago, Dallas — has three folios. Processing them individually means three separate extractions, three spreadsheets, and a manual merge step. Processing them as a batch means one upload, one column definition, one export — a single spreadsheet with three rows, ready for review.
The batch workflow scales to the team level as well. A small finance team processing expense reports for 20 traveling employees can collect all folios from a given week or month, upload them in one batch, and get a single spreadsheet covering every stay. Month-end reconciliation that previously meant chasing individual employees for individual receipts becomes: collect the folios, run the batch, review the output, close the books.
For teams that need to collect folios from travelers who aren't on the finance platform, Collection Links provide a direct upload channel. You generate a shareable link, send it to traveling employees, and anyone with the link can upload their folio directly into your processing queue — no login, no account, no software installation on their side. The folios land in your batch, ready for extraction alongside everything else.
FAQ
What if the hotel folio has charges in a foreign currency?
The AI extracts the numeric values as they appear on the folio. Currency conversion is a separate step — most finance teams handle this in the expense system or ERP using the transaction date's exchange rate. What the extraction workflow gives you is the original amounts, line by line, in the folio's native currency, which is what the auditor needs to verify against the credit card statement.
How do you handle folios where personal and business charges are mixed?
This is where Inferred Columns earn their value. If an employee charged both a business dinner (reimbursable) and an in-room movie (not reimbursable) to the room, both appear on the folio. The Inferred Column for expense category flags the movie as Non-Reimbursable. The finance reviewer still makes the final call, but the system surfaces the distinction instead of burying it in a single "Room Total." This matters for IRS accountable plan compliance — reimbursing personal expenses through a tax-advantaged plan creates liability for both employer and employee.
Can it handle the fine print — like per-night rate breakdowns within a multi-night stay?
Yes, if the folio prints nightly rates separately. Many business-oriented hotels itemize each night's room rate and tax on its own line. The extraction captures each line individually. If the folio only prints a single "Room Charge: 3 nights × $189 = $567" line, that's what you get — the AI extracts what's on the page, not what you wish were on the page.
What about digital folios from apps like the Marriott Bonvoy or Hilton Honors app?
Screenshots from hotel apps work. The AI reads the screenshot the same way it reads a PDF or a photo of printed paper. One caveat: some hotel apps display a simplified folio in the app and offer the full detail version only as a PDF download. The full PDF is better for extraction, but the screenshot works for the visible fields.
Does this replace Concur, Expensify, or Navan?
It complements them. Enterprise T&E platforms handle the full expense lifecycle — booking, approval routing, policy enforcement, reimbursement. What they don't always handle well is turning a multi-page hotel folio into structured line-item data. The extraction step produces a clean, categorized spreadsheet that feeds into your expense system as structured input. Instead of the platform's OCR reading the folio total and the employee manually itemizing, the employee uploads the folio once and the line items populate automatically.
How long does extraction take per folio?
A typical 3-page hotel folio processes in 5–10 seconds. The limiting factor is not extraction speed but review speed — scanning the output for accuracy and handling edge cases (misread amounts, ambiguous charge descriptions). A batch of 10 folios typically takes under two minutes of processing time plus however long the reviewer spends verifying the output.
Is there a minimum number of folios needed to make this worth setting up?
No. The setup is zero — there are no templates to build, no training documents to upload, no configuration beyond typing the column names you want. Whether you process one folio or one hundred, the workflow is identical. The value scales with volume, but the setup cost doesn't.
A hotel folio is not a receipt. Treating it like one — capturing the total and moving on — leaves hours of manual line-item allocation on someone's desk, month after month. The difference between "here's the folio total" and "here are the room charges, taxes, meals, and parking, each mapped to the right GL code, ready for review" is not a better expense policy. It's a different extraction strategy. Test it on your next multi-night folio — the one with the resort fee you usually just fold into the lodging total because separating it isn't worth the typing.