The implementation team mapped it correctly. The configuration document said so. Everyone signed off. Six months later, resort fees are landing in the wrong GL account, your labor system is pulling from a cost center that was renamed in March, and ProfitSword is showing a number that nobody on the finance team can reconcile back to the P&L.
This is not a technology problem. It's a structural problem — and it plays out the same way at nearly every property I've worked with. Understanding why it happens is the first step to building something that stays clean.
The four-system stack and where data actually moves
Most hotel finance teams think about their systems in terms of what each one does. Operators live in the PMS. The restaurant team lives in the POS. Finance lives in the GL. The ownership group looks at the BI platform. And everyone assumes the data flows cleanly between them.
It doesn't. Here's what actually moves and where:
PMS → GL: The property management system generates a night audit every day. That audit rolls up revenue, taxes, adjustments, and settlements by transaction code and sends them to the general ledger — usually as a daily journal entry. The mapping between PMS transaction codes and GL accounts is where most revenue posting errors start. If a transaction code gets added in Opera (or Maestro, or any PMS) and nobody maps it to a GL account, it posts to a catch-all or a default — often without triggering any alert.
POS → GL: Point-of-sale systems — Toast, Simphony, Aloha, whatever the restaurant is running — settle revenue daily. But the path to the GL is almost never direct. Usually it runs through an interface or an export, often manual, that maps POS revenue categories to GL accounts. F&B revenue, sales tax, comps, voids, and settlements can all end up in different places depending on how the interface was configured. When the POS is updated, upgraded, or reconfigured for a menu change, that mapping can silently break.
Labor system → GL: Systems like Unifocus, HotSchedules, or Proliant track hours worked and allocate them to departments. But the department codes in the labor system are not always the same as the cost centers in the GL. If a property reorganizes departments — splits housekeeping from laundry, adds a new outlet, restructures the rooms division — the labor system cost centers and the GL cost centers have to be updated in sync. They rarely are.
GL → BI platform: ProfitSword, M3, Aptech, whatever the portfolio uses for consolidated reporting — these pull from the GL, usually through an API or a file export. The BI platform has its own chart of accounts structure, its own mapping, and its own hierarchy. A GL account that gets renumbered or reclassified in the accounting system has to be remapped in the BI platform as well. Until it is, that account either disappears from reporting or posts to the wrong line.
The six places data most commonly breaks
In practice, integration failures cluster around a handful of specific failure points. These are the ones I see most often:
1. Unmapped transaction codes. A new rate plan, a new charge type, or a new amenity gets added in the PMS. Nobody tells the interface team. The transaction code has no GL mapping and posts to a default account — usually miscellaneous income or a suspense account that nobody monitors. By the time it surfaces, months of revenue have been misclassified.
2. Resort fee and ancillary revenue routing. Resort fees in particular are a recurring problem. They're often coded as room revenue in the PMS for rate plan purposes, but they should post to a separate GL account for USALI compliance. When the mapping isn't configured explicitly, resort fees land in room revenue — which inflates ADR, suppresses non-room revenue, and makes the P&L structurally wrong.
3. Tax account misrouting. Sales tax, occupancy tax, and resort fee tax are separate line items in a clean GL. In a misconfigured interface, they can net against revenue rather than posting to a liability account, which distorts every revenue and margin calculation downstream.
4. F&B comp and void handling. Employee meals, manager comps, and voided checks all reduce POS revenue — but how they reduce it matters. A void should net against the original revenue. An employee meal should post to a specific expense account (often A&G or F&B labor). A manager comp may need to be tracked separately for promotional accounting. When the POS→GL interface treats all of these the same way, the F&B P&L becomes unreliable.
5. Department reorganizations that break labor allocations. A property splits housekeeping and laundry into separate departments for scheduling purposes. The change is made in the labor system and in operations. Nobody updates the GL cost center structure or the BI platform mapping. Now laundry labor is either posting to housekeeping (wrong) or to a new cost center that doesn't exist in the BI hierarchy (invisible). The rooms expense line is now wrong and nobody can explain why.
6. BI platform account hierarchy drift. The corporate office restructures the chart of accounts — renumbers a range, reclassifies a department, standardizes account names across the portfolio. Properties update their GL. The BI platform isn't updated. Now accounts are either duplicated, missing, or mapped to the wrong line in the ownership report. The BI team patches it with a manual override that works until the next restructure.
Why the implementation document doesn't protect you
Every major hotel technology implementation produces a configuration document. It lists the account mappings, the cost center assignments, the interface settings. It gets signed off. It goes into a folder.
The problem is that the document describes the system as it was configured on go-live day. Hotels change. Rate plans get added. Menus change. Departments reorganize. Brands mandate new charge types. Every one of those changes is a potential mapping update — and most of them never make it back to the configuration document, let alone to the interface itself.
After six months, the live system configuration and the configuration document are two different things. After two years, they can be dramatically different. This is not negligence. It's how hotels operate — fast, with high turnover, across multiple systems that nobody owns end-to-end.
What a data integrity audit actually looks for
When I do a systems integration review, the starting point is always reconciliation — not configuration documents, not vendor assurances, not what the GM thinks is happening. Reconciliation.
The basic test for each layer:
- PMS → GL: Does the night audit total match the journal entry? By revenue category? For the last 90 days?
- POS → GL: Does the POS daily settlement match the F&B revenue line in the GL? Net of comps? Net of voids?
- Labor system → GL: Does total hours × pay rate in the labor system match payroll expense in the GL? By department?
- GL → BI platform: Does the GL balance for key accounts match what appears in ProfitSword (or equivalent)? For the last three months?
Where the reconciliation breaks — that's where to dig. Usually it leads to one of the six failure points above. Sometimes it leads to something more specific: a vendor updated an API version and the field mappings shifted; a property converted brands and the new PMS uses different transaction code logic; an acquisition brought in a chart of accounts that wasn't fully normalized to the portfolio standard.
How to keep it clean going forward
The honest answer is that keeping hotel systems in sync requires ongoing maintenance, not a one-time configuration. A few practices that help:
Reconcile monthly, not annually. A quarterly or annual audit finds problems after months of bad data have accumulated. Monthly reconciliation catches mispostings within 30 days when they're still manageable.
Designate someone who owns the mapping. Not the PMS vendor, not the accounting software vendor, not the BI platform support team. Someone on your team who knows where to look when the numbers don't agree and has the authority to update configurations when they break. At a portfolio level, this is a corporate finance function, not a property-level one.
Treat any new charge type as an integration event. Adding a resort fee, a parking charge, a new F&B outlet, a pet fee — any new revenue type needs to be traced from the system where it's created to the BI platform where it appears in reporting. That's four systems. Each one needs a deliberate mapping decision, not a default.
Document what you actually have, not what you think you have. The most useful configuration document is the one that reflects the current state of the live system — updated every time something changes. Not the implementation spec from three years ago.
The AI question again
A few months ago, the conversation at every hospitality technology conference shifted to AI. How AI will improve forecasting, scheduling, revenue management, and guest experience. All of that is probably true, eventually.
But AI doesn't fix a broken integration. If your resort fees are posting to the wrong GL account, an AI tool working off your data will confidently analyze the wrong numbers. If your labor system department codes don't match your GL cost centers, an AI labor model will be built on a foundation that doesn't reflect reality.
The data foundation has to come first. Everything else is downstream of it.
If this sounds familiar: The Integration Audit engagement at RoomToProfit is a structured review of exactly this — PMS-to-GL mapping, labor system configuration, and BI platform data integrity. Start a conversation if you're not sure what clean looks like on the other side.